首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我们可以对selenium中的各种测试用例使用通用的数据提供程序方法吗?我是否可以将excel路径和工作表名称传递给公共数据提供程序?

是的,我们可以对selenium中的各种测试用例使用通用的数据提供程序方法。通常情况下,我们可以将测试数据存储在Excel文件中,并使用数据提供程序从Excel文件中读取数据。这样做的好处是可以将测试数据与测试用例分离,提高测试用例的可维护性和可重用性。

在selenium中,我们可以使用TestNG框架提供的@DataProvider注解来实现数据驱动测试。通过@DataProvider注解,我们可以定义一个方法,该方法返回一个二维数组,数组中的每个元素都是一个测试数据集。我们可以在测试用例中使用这些测试数据集来执行多次相同的测试用例,每次使用不同的测试数据。

对于Excel文件的路径和工作表名称,我们可以将它们作为参数传递给公共数据提供程序方法。在公共数据提供程序方法中,我们可以使用Apache POI库来读取Excel文件,并根据工作表名称获取相应的数据。然后,我们可以将这些数据转换为二维数组,并返回给@Test方法使用。

以下是一个示例代码,演示了如何在selenium中使用通用的数据提供程序方法,并将Excel路径和工作表名称作为参数传递:

代码语言:txt
复制
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.testng.annotations.BeforeTest;

import java.io.FileInputStream;
import java.io.IOException;

public class SeleniumDataDrivenTest {
    private Workbook workbook;
    private Sheet sheet;

    @BeforeTest
    public void setUp() throws IOException {
        String excelFilePath = "path/to/excel/file.xlsx";
        String sheetName = "Sheet1";

        FileInputStream fileInputStream = new FileInputStream(excelFilePath);
        workbook = new XSSFWorkbook(fileInputStream);
        sheet = workbook.getSheet(sheetName);
    }

    @DataProvider(name = "testData")
    public Object[][] getTestData() {
        int rowCount = sheet.getLastRowNum();
        int columnCount = sheet.getRow(0).getLastCellNum();

        Object[][] data = new Object[rowCount][columnCount];

        for (int i = 0; i < rowCount; i++) {
            Row row = sheet.getRow(i + 1);
            for (int j = 0; j < columnCount; j++) {
                Cell cell = row.getCell(j);
                data[i][j] = cell.toString();
            }
        }

        return data;
    }

    @Test(dataProvider = "testData")
    public void test(String username, String password) {
        // 执行测试用例
        System.out.println("Username: " + username);
        System.out.println("Password: " + password);
    }
}

在上面的示例中,我们首先在@BeforeTest方法中设置了Excel文件的路径和工作表名称。然后,在@DataProvider注解的getTestData方法中,我们使用Apache POI库从Excel文件中读取数据,并将其转换为二维数组。最后,在@Test方法中,我们使用测试数据执行测试用例。

对于腾讯云相关产品和产品介绍链接地址,由于不能提及具体的品牌商,我无法提供具体的链接。但是,腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储等,您可以访问腾讯云官方网站,了解更多关于腾讯云的产品和服务信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

数据驱动框架(Apache POI – Excel)

你是否难以维护应用程序的大量测试用例?测试数据是否分散在各种测试脚本中?您是否必须为每个测试环境维护单独的测试脚本,然后在测试数据中一个值发生更改的情况下在所有脚本中进行搜索?...我们可以将数据保留在excel工作表中,并在测试脚本中使用它们。让我们看看如何通过从Excel文件读取测试数据来创建数据驱动的UI自动化框架。...从Selenium中的Excel中 读取和写入数据”中学到了如何使用Apache POI在Excel文件中读取和写入数据,然后将与测试数据相同的数据集传递给Selenium测试。...但是在该脚本中,从Excel文件读取数据,将数据写入Excel文件,将数据传递给Selenium操作的所有动作都发生在该类的main方法中。如果我们仅编写一个或两个测试用例,则该格式是可以接受的。...以类似的方式,您可以在此类中创建与excel操作相关的不同方法。 2.常量类–用于将常量值放在文件中,以便可以在测试用例中重复使用它们。

29510

建立数据驱动,关键字驱动和混合Selenium框架这些你了解吗

我进一步定义了一个for循环,以从excel工作簿中检索文本。 但是,为了从给定的工作表编号,列编号和行编号读取数据,将对“ ReadExcelFile”类进行调用。...我已经导入了Apache POI XSSF库,该库用于读取数据或将数据写入excel文件。在这里,我创建了一个构造函数(相同方法的对象)以传递值:工作表编号,行编号和列编号。...因此,将仅测试excel中指定的那些方法名称。 例如,对于登录Web应用程序,我们可以在主测试用例中编写多种方法,其中每个测试用例都将测试某些功能。...使用此博客中上面显示的示例,我们可以通过将要执行的方法存储在excel文件中(关键字驱动方法)并将这些方法名称传递给Java Reflection Class(数据驱动方法)来构建混合框架,而不是创建...(sPath, "Sheet1"); //硬编码值目前用于Excel行和列 //稍后,我们将更有效地使用这些硬编码值 //这是逐行读取列(Action关键字)值的循环 //这意味着这个循环将执行测试步骤表中为测试用例提到的所有步骤

98820
  • 高级自动化测试常见面试题(Web、App、接口)

    不能,可以写JavaScript将标签中的hidden先改为0,再定位元素 2.Selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以点击的?...通常,设计接口测试用例需要考虑以下几个方面: ①是否满足前提条件 有些接口需要满足前提,才可成功获取数据。...简洁,提供不同的http请求方法,支持session,cookies, ddt :数据驱动,ddt 类装饰器,data 测试方法装饰器 unpack解包可迭代的数据类型 普通用户,数据库,配置文件—(基础数据...http_requests.py logger.py等模块 3/框架设计步骤: 准备测试数据:EXCEL表准备测试用例—excel数据的读取—参数值的替换 发起请求:请求方法(get/post方法进行封装...—URL的拼接(不同—参数转化为字典 拿到请求的返回值:解析返回值code,status,msg信息 断言 好处: 1、自动化测试用例和手工测试用例的完美结合,减少重复工作 2、配置灵活,可以自主切换测试环境

    4.6K30

    接口测试面试题

    29、测试框架里如何做到数据和代码分离? 1、什么是接口? 接口就是API,意思是应用程序编程接口。 接口本质上是程序开发的函数和方法,提供参数和返回值。 2、什么是接口测试?...接口测试非常快速,UI自动化执行一个测试用例10s左右,接口用例执行一般毫秒级。 7、为什么要写接口测试用例? (1)理清思路,避免漏测和重复测试。...(2)提高测试效率、跟进测试进度、告诉领导做过、跟进重复性工作。 (3)更好的记录问题、发现问题、复现问题、同时这也是接口测试流程中的一个产物。 8、接口测试用例设计主要考虑哪些?...接口测试用例设计思路: (1)接口业务逻辑测试,接口逻辑测试是指根据业务逻辑,输入参数,输出值的描述,对正常输入情况下所得输出值是否正确的测试,也就是测试对外提供的接口服务是否正常。...接下来是公共方法类,比如说叫public,或者是tools,里面存放一些,读取excel数据的方法,发送http请求的方法,收集log日志的方法,发送邮件,操作数据库等方法。

    58721

    一顿测试猛如虎,一问接口不清楚!

    29、测试框架里如何做到数据和代码分离? 1、什么是接口? 接口就是API,意思是应用程序编程接口。 接口本质上是程序开发的函数和方法,提供参数和返回值。 2、什么是接口测试?...接口测试非常快速,UI自动化执行一个测试用例10s左右,接口用例执行一般毫秒级。 7、为什么要写接口测试用例? (1)理清思路,避免漏测和重复测试。...(2)提高测试效率、跟进测试进度、告诉领导做过、跟进重复性工作。 (3)更好的记录问题、发现问题、复现问题、同时这也是接口测试流程中的一个产物。 8、接口测试用例设计主要考虑哪些?...接口测试用例设计思路: (1)接口业务逻辑测试,接口逻辑测试是指根据业务逻辑,输入参数,输出值的描述,对正常输入情况下所得输出值是否正确的测试,也就是测试对外提供的接口服务是否正常。...接下来是公共方法类,比如说叫public,或者是tools,里面存放一些,读取excel数据的方法,发送http请求的方法,收集log日志的方法,发送邮件,操作数据库等方法。

    62110

    万字自动化测试面试题,助你吊打面试官

    Selenium中hidden或者是display = none的元素是否可以定位到? 不能。可以写JavaScript将标签中的hidden先改为0,再定位元素 2....请求的库,API 简洁,提供不同的http请求方法,支持session,cookies, ddt :数据驱动,ddt 类装饰器,data 测试方法装饰器 unpack解包可迭代的数据类型 普通用户,...数据库,配置文件---(基础数据) openpyxl: 数据管理 excel管理数据,使用openpyxl模块来进行excel数据的读和写(excle,csv, json, yaml, txt都可以管理测试数据...doexcle.py do_mysql.py http_requests.py logger.py等模块 3/框架设计步骤: 准备测试数据: EXCEL表准备测试用例---excel数据的读取--...自动化测试用例和手工测试用例的完美结合,减少重复工作 2、配置灵活,可以自主切换测试环境,执行测试用例 3、常用功能进行封装,逻辑清晰,易于维护 4、统一执行入口,管理测试用例集: run.py

    1K20

    测试常见面试的总结(一)

    在Smoke Testing中,所选的测试用例涵盖了系统中最重要的功能或组件。目标不是进行详尽的测试,而是要验证系统的关键功能是否正常工作。...也就是我们通常所说的,客户端的每次请求必须携带所有可能用到的信息。 (4)HTTP的方法使用 SOAP可以对HTTP协议进行绑定。...你在原来公司工作中写的测试脚本能在不同浏览器中运行吗?能支持跨浏览器平台吗 答: 是的,我写的测试用例能在IE,火狐和谷歌这三种浏览器上运行。...中执行用例失败截图你是怎么实现的 答: 在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法可以实现全屏截图。...如果一个元素定位发生了改变,我们只用修改这个页面的元素属性 (3)对于页面类的方法,我们尽量从客户的正向逻辑去分析,方法中是一个独立场景 (4)测试用例设计中,减少测试用例之间的耦合度。

    63610

    Selenium自动化的JUnit参数化实践

    为了在我们的Selenium测试自动化脚本中使用多个数据集,首先想到的是使用Excel工作表来获取该数据。...为了简化更改输入值的过程,我们可以使用JUnit参数化测试对测试用例进行参数化。这也将帮助我们消除Selenium测试用例中的冗余。...让我们看看如何使用数据驱动框架在JUnit中参数化我们的测试用例。 在Selenium JUnit教程中,我们需要进行Excel参数化的主要元素是Excel工作表。...一旦我们准备好数据,下一步就是创建将加载Excel工作簿的工具类文件,然后从工作表和相应的单元格中读取数据。...测试自动化脚本将从Excel工作表的第二行获取excel数据,要想遍历测试,可以参考@Parameters注解提供的方案。

    1.1K30

    金三银四求职季,接口自动化面试题助攻一波

    2、绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功 3、参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话...对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以; 4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理...openpyxl:数据管理 excel 管理数据,使用 openpyxl 模块来进行 excel 数据的读和写 (excle,csv, json, yaml, txt 都可以管理测试数据)。...(3) 框架设计步骤: 准备测试数据:EXCEL 表准备测试用例—excel 数据的读取—参数值的替换 。 发起请求:请求方法(get/post 方法进行封装—URL 的拼接)。...(4) 此套测试框架好处: 自动化测试用例和手工测试用例的完美结合,减少重复工作; 配置灵活,可以自主切换测试环境,执行测试用例; 常用功能进行封装,逻辑清晰,易于维护; 统一执行入口,管理测试用例集:

    72840

    Robot Framework测试框架用例脚本设计方法

    测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储。通过测试库中实现的关键字驱动被测软件。Robot Framework灵活且易于扩展。...Robot Framework 是一种通用的,应用和技术相互独立的框架。 当我们想要完成 不同类型测试时,只需安装不同的扩展库即可,框架提供了非常丰富的Library。...核心框架句柄与被测系统通过测试库进行交互。测试库能够直接使用应用程序接口或者使用更低层次的测试工具作为驱动。...测试用例可以描述成各种的业务工作流,这样的工作流可以用关键字驱动或者行为驱动方式来编写。...二、数据驱动 数据驱动方式用来编写一些带有输入数据变量的工作流。用高级别的关键字—user keyword完成测试用例,隐藏了实际的测试工作流。用于测试执行步骤相同,输入数据输出结果不同的测试用例。

    2.6K30

    测试自动化框架的类型| 您应该知道的一切-软件测试材料

    如果可以将所有成分按正确比例添加到罐子中。您可以每次都以相同的口味冲泡茶。 在这里,我们添加了制作好茶所需的所有成分的“罐子”就是框架。 我们真的遵循这个过程吗? 答案是否定的。...模块化测试框架的优势: 由于将整个应用程序分解为不同的模块,因此具有更好的可伸缩性和易于维护 可以独立编写测试脚本 一个模块中的更改对其他模块没有影响或影响很小 模块化测试框架的缺点: 花更多时间分析测试用例并确定可重用的流程...在关键字驱动的测试中,我们使用表格格式为将要执行的每个函数或方法定义关键字或操作词。 它根据excel工作表中指定的关键字执行自动化测试脚本。...最流行的测试自动化框架是数据驱动框架,关键字驱动框架和混合框架。 在数据驱动框架中,我们将测试数据保存在excel表中,并使用TestNG的数据提供程序执行测试用例。...在关键字驱动的框架中,我们在excel表中定义关键字,并且代码将调用此文件来执行测试用例 混合框架是数据驱动框架和关键字驱动框架的组合。

    71420

    金三银四求职季,接口自动化面试题助攻一波

    2、绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功 3、参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话...对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以; 4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理...openpyxl:数据管理 excel 管理数据,使用 openpyxl 模块来进行 excel 数据的读和写 (excle,csv, json, yaml, txt 都可以管理测试数据)。...(3) 框架设计步骤: 准备测试数据:EXCEL 表准备测试用例—excel 数据的读取—参数值的替换 。 发起请求:请求方法(get/post 方法进行封装—URL 的拼接)。...(4) 此套测试框架好处: 自动化测试用例和手工测试用例的完美结合,减少重复工作; 配置灵活,可以自主切换测试环境,执行测试用例; 常用功能进行封装,逻辑清晰,易于维护; 统一执行入口,管理测试用例集:

    57420

    小程序可测性能力建设与实践

    页面跳转 页面跳转是小程序业务测试中重度使用的能力,可以利用该功能跳转到如表单页,商品详情页等中间页面,不再需要从首页一步一步操作进入目标被测页面,减少测试前置准备工作,具体可以在该Lyrebird页面中输入页面路径进行跳转...美团门票业务小程序测试实践 在到店众多应用了小程序可测性能力的业务中,美团门票业务从2021年开始即参与了小程序可测性建设,目前在门票质量保障工作中,可测性相关能力深度应用在新需求测试、回归测试、线上巡检等各种类型的测试活动中...测试路径较为繁琐,因此,对缓存的可控性改造后,传入相应的配置指令(如2.2部分介绍),控制缓存中的数据,直达被测页面和状态,并通过自动化测试比对当前运行的页面和页面基准图,判断它是否正确被渲染,以此分别从数据和...Q:针对小程序可测试性能力建设与实践,我想问下,如果我们要用你们的测试工具,需要做什么适配吗?...A:不需要进行额外适配,最终的呈现会是NPM包形式,在产物里安装就可以接入我们的可测性能力,可以对它进行控制。 Q:生产环境会接入可观测SDK吗?如果接入对性能有多大影响?

    15110

    UI自动化问题汇总

    你在原来公司工作中写的测试脚本能在不同浏览器中运行吗?能支持跨浏览器平台吗 答: 是的,我写的测试用例能在IE,火狐和谷歌这三种浏览器上运行。...Selenium中执行用例失败截图你是怎么实现的 答: 在Selenium中提供了一个TakeScreenShot这么一个接口,这个接口提供了一个getScreenshotAs()方法可以实现全屏截图。...哪些地方可以改善 答: PO模式全称page object,页面对象模型,将页面的元素定位和元素行为封装成一个page类,实现页面对象和测试用例分离。...如何设计出高质量的自动化测试脚本 答: (1)使用四层结构实现业务逻辑、脚本、数据分离。 (2)使用PO设计模式,将一个页面用到的元素和操作步骤封装在一个页面类中。...如果一个元素定位发生了改变,我们只用修改这个页面的元素属性 (3)对于页面类的方法,我们尽量从客户的正向逻辑去分析,方法中是一个独立场景 (4)测试用例设计中,减少测试用例之间的耦合度。 1.

    3.5K61

    自动化测试入门:是什么,流程,收益和工具

    以下几点有助于确定范围: 对业务很重要的功能 包含大量数据的方案 跨应用程序的通用功能 技术可行性 业务组件的重用程度 测试用例的复杂性 能够使用相同的测试用例进行跨浏览器测试 计划,设计和开发 在此阶段...这些脚本需要输入测试数据,然后才能运行。一旦执行,他们将提供详细的测试报告。 可以直接使用自动化工具或通过将调用自动化工具的测试管理工具来执行执行。...衡量指标-不能通过将手动工作与自动化工作进行比较,也可以通过捕获以下指标来确定自动化是否成功。...走查测试 使用ID,名称,X路径等标识元素。...它可以使用回放和记录方法或描述性编程方法来获取对话框 它将被测应用程序的所有控件和窗口标识为对象,并确定每个窗口的所有属性和属性 总结 正确选择自动化工具,测试过程和团队,对于成功实现自动化至关重要。

    1.6K10

    自动化测试最新面试题和答案

    也被称为测试驱动设计,是一个软件开发的方法,在源代码上重复进行单元测试。写测试、看它失败、然后重构。这个概念是,先编写测试,然后来检查我们写的代码是否正常工作。...它提高了业务领域对象的可重用性和可测试性。 问题30:什么是数据驱动框架?它与关键字驱动框架有什么不同? 数据驱动框架。 在这个框架中,测试用例逻辑驻留在测试脚本中。...测试数据被分离并保存在测试脚本之外。测试数据是从外部文件(Excel文件)中读取的,并被加载到测试脚本中的变量中。变量用于输入值和验证值。 关键字驱动。 关键字/表驱动框架需要开发数据表和关键字。...在TestNG中,我们可以告诉测试一个方法依赖于另一个方法,而在JUnit中这是不可能的。 测试用例的分组在TestNG中可用,而JUnit中则不可用。执行可以基于组完成。...问题33:可以使用TestNG运行一组测试用例吗? 是的,TestNG框架支持在测试组的帮助下执行多个测试用例。 它提供了以下选项来运行特定组中的测试用例。

    5.8K20

    五分钟搞懂POM设计模式

    -断言结果 由于线性脚本中的元素定位、元素操作细节、测试数据、结果验证(断言)是捆绑在一起的,代码会显得非常冗余、可读性差、不可复用、工作量大且可维护性差 刚开始,少数的测试用例维护起来可能很容易,但随着时间迁移...例如:十几个用例中都用到了A元素,某一天A元素被前端改成了B元素,我们就需要去十几个用到A元素的地方,将A元素修改为B元素 如果可以把公共元素抽取出来,即使元素被前端修改,我们也只需更新元素的定位方式,...而不用修改每条测试用例,无论多少用例用到该元素,都只需修改元素定位方式,重新获取元素即可 所以我们引入了PageObject这种解决方案,它可以帮我们解决设计上的问题,可以将testcase和page分层...,旨在为每个待测页面创建一个页面对象,从而将繁琐的定位操作、操作细节封装到这个页面对象中,对外只提供必要的操作接口,在调用的时候只调用提供的接口,不用去调用操作细节,最终实现程序的高内聚低耦合,使程序模块的可重用性...CommonUtil,公共模块,将一些公共函数、方法以及通用操作进行封装,如:日志模块、yaml 操作模块、时间模块等 run.py:批量执行测试用例的主程序,根据不同需求不同场景进行组装,遵循框架的灵活性和扩展性

    1K50

    16个初级自动化面试题,你知道不?

    测试自动化框架是用于产生测试自动化活动的有益结果的一组通用准则和规则。自动化框架将功能库,测试数据源,对象详细信息以及其他可重用的模块和方法整合在一起。自动化框架使测试保持一致。...一些准则如下: 编写测试用例的规则 创建测试脚本的编码准则 输入测试数据模板 对象库管理 日志配置 测试结果和报告使用情况 Q6。为什么要使用自动化框架?他们提供的好处是什么?...自动化框架,在正确设计和实施后,会提供频繁且稳定的自动化测试代码 有了适当的框架,代码将更易于维护和重用 即使对如何建立测试用例的知识有限,测试人员也可以依靠该框架来引用简单的语句并轻松实现测试用例。...关键字驱动框架:在此框架中,测试人员使用表格格式为每种方法定义关键字或操作词。根据excel工作表测试中指定的关键字,完成脚本并执行测试。 混合测试框架:顾名思义,该框架是上述两个或多个框架的组合。...自动化测试中是否需要文档? 文档在测试自动化中起着非常重要的作用。您采用的所有方法和步骤均应记录在案,以便它们可重复。

    76420

    自动化测试生命周期

    在自动化测试生命周期方法中,构建测试设计以描绘测试工作,从而为项目和测试团队提供有关测试程序范围的框架。 确定测试自动化的范围 这是自动化测试生命周期的第一阶段,旨在确定自动化的可行性。...因为除非我们生活在理想的世界中,否则您的用户将使用不同的机器来访问您的网站或Internet上的Web应用程序。 不断检查不同的设备是一回事,但是我们还需要对各种浏览器和浏览器版本保持谨慎。...设置实用程序,例如高级文本编辑器和比较工具。 自动化框架实施 AUT访问和有效凭证 加载项许可证 各种组织都使用暂存环境来测试软件。最好的方法是复制生产数据以进行测试。...创建可以在整个测试过程中使用的通用功能方法。 确保创建可重用,结构化和简单的脚本,以便第三方可以清楚地理解它。这里有8条可行的见解,旨在编写更好的自动化代码。...您可以使用老式的Excel工作表,但是LambdaTest Automation可以提供基于应用程序的报告,其中包含通过基于云的Selenium Grid上的自动化脚本执行的所有测试用例。有趣吧?

    60821

    自动化测试——unittest框架

    python自带一种单元测试框架 2、为什么使用UnitTest框架? >批量执行用例 >提供丰富的断言知识 >可以生成报告 3、核心要素: 1). TestCase(测试用例) 2)....('用例所在的路径', '用例的代码文件名') # 测试路径:相对路径 # 测试文件名:可以使用 * 通配符,可以重复使用 suite = unittest.defaultTestLoader.discover..., 不想执行,可以使用跳过 """ 使用方法,装饰器完成 代码书写在 TestCase 文件 """ # 直接将测试函数标记成跳过 @unittest.skip('跳过条件') # 根据条件判断测试函数是否跳过...3、将数据放入一个文本文件中,从文件读取数据, 如JSON、 excel、 xml、 txt等格式文件 ,这里演示的是json文件类型. json文件处理, 这个链接介绍了json文件和Python文件基本操作...ddt import ddt, data, unpack from selenium import webdriver # 读取excel表中的数据,使用xlrd,openpyxl def read_excel

    1.1K30
    领券