1.简介

今天这一篇宏哥主要是结合实际工作中将遇到的测试场景和前边两篇学习的知识结合起来给大家讲解和分享一下,希望以后大家在以后遇到其他的测试场景也可以将自己的所学的知识应用到测试场景中。

2.测试场景

测试多个用户的账户登录。假如宏哥有50个用户,需要测试登录。你会怎么测试呢。第一个肯定是写50个测试脚本去验证登录。第二个就是采用DDT,把用户名和密码写到一个表格里,然后依次从表格读取去运行这个登录用例。很显然第一个不可取,如果有1000个,10000个...那你不得累死,很有可能最后落个费力不讨好的结果。如果是一个或者两个用户,那么第一个和第二个基本上没什么区别,有时候第一个反而比第二个简单。这就得你自己灵活判断了。也就是所说的经验。

3.实际应用1

1.假如宏哥有2个用户登录,宏哥将用户的账户数据存储在二维数组。就可以轻松搞定,其实这种前边我们已经介绍过这里不赘述,宏哥就一笔带过了。这里就会用到前边学习到的知识:就是前边讲解那个传对象的数据驱动测试例子。

3.1代码设计

3.2参考代码

package library;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; /**
* @author 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)
*
* 2022年2月28日
*/ public class TestDDT { @Test(dataProvider="testdata")
public void TestLogin(String username, String password) throws InterruptedException{ System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com");
Thread.sleep(3000);
// click login link
driver.findElement(By.xpath("//*[@id='u1']/a[1]")).click();
Thread.sleep(2000); driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__userName']")).clear();
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__userName']")).sendKeys(username);
Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).clear();
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).sendKeys(password);
Thread.sleep(5000);
System.out.println("browser will be close");
driver.quit();
} @DataProvider(name="testdata")
public Object[][] TestDataFeed(){
//创建一个二维数组
Object [][] baidudata=new Object[2][2]; baidudata = new Object[][] {
{ "test@gmail.com", "test@gmail.com" },
{ "test@yahoo.com", "test@yahoo.com" }
};
System.out.print(baidudata); return baidudata; }
}

3.3运行代码

1.运行代码,右键Run AS->TestNG Suite,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

4.实际应用1

1.假如宏哥有50个用户登录,第一种方法也可以,就按上边宏哥的思路,将50个用户的登录信息存储在二维数组中,就可以,但是因为文章主要讲解的是数据驱动测试,因此宏哥在这里就介绍第二个:用TestNG和excel文件实现DDT场景。我们需要准备一个test-data.xlsx文件,并且放到eclipse项目下。这里就用到前边讲解的如何操作Excle文件的知识了。

4.1测试步骤

1.准备test-data.xlsx文件,并将文件放在对应测试脚本位置,宏哥这里就举例在Excle中写了三个用户的登录信息。如下图所示:

2.利用POI读取excel文件内容,并保存到一个二维数组中。

4.2代码设计

4.3参考代码

package library;

import java.io.File;
import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; /**
* @author 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)
*
* 2022年2月28日
*/ public class DDT {
@Test(dataProvider="testdata")
public void TestLogin(String username, String password) throws InterruptedException{ System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com"); Thread.sleep(3000);
// click login link
driver.findElement(By.xpath("//*[@id='u1']/a[1]")).click();
Thread.sleep(2000); driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__userName']")).clear();
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__userName']")).sendKeys(username);
Thread.sleep(2000);
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).clear();
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).sendKeys(password);
Thread.sleep(5000);
System.out.println("browser will be close");
driver.quit(); } @DataProvider(name="testdata")
public Object[][] TestDataFeed() throws Exception{ File src = new File(".\\Files\\test-data.xlsx");
FileInputStream fis = new FileInputStream(src); @SuppressWarnings("resource")
XSSFWorkbook wb=new XSSFWorkbook(fis);
XSSFSheet sh1= wb.getSheetAt(0);
int numberrow = sh1.getPhysicalNumberOfRows(); Object [][] baidudata=new Object[numberrow][2]; for(int i=0;i<numberrow;i++){ baidudata[i][0] = sh1.getRow(i).getCell(0).getStringCellValue();
baidudata[i][1] = sh1.getRow(i).getCell(1).getStringCellValue();
} return baidudata; }
}

4.4运行代码

1.运行代码,右键Run AS->TestNG Suite,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

5.小结

1.使用代码运行过程中报错:org.openqa.selenium.InvalidElementStateException: invalid element state,如下图所示:

2.解决办法:

宏哥也知道报这个错误是由于元素可能还没有加载出来, 需要添加selenium的wait方法 或者使用 Thread.sleep()等,但是等了一段时间之后,该元素仍无法使用 click,clear 或者是sendKeys等方法。但是增加了等待方法依旧报相同的错误,三大等待方法都试了个遍都是相同错误,奇怪了啊。宏哥查了好多资料也是说需要等待方法去解决,可是加了等待方法还是无济于事,就当宏哥就要放弃时候,突然想到了一种可能性会不会是宏哥的定位方法有错误啊,可是F12利用Ctrl+F输入xpath表达式定位发现定位是正确的啊,正在这时突然发现定位密码的输入框定位是最外层根本无法输入,需要定位到input才可以clear,sendkeys。修改定位方法问题解决。

错误定位密码输入框代码:

driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']")).sendKeys(password);

正确定位密码输入框代码:

driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).sendKeys(password);

3.而且回过头来看,发现前边运行代码只有用户名输入,密码根本没有输入进去。如下图所示:

《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)的更多相关文章

  1. 《手把手教你》系列基础篇(八十四)-java+ selenium自动化测试-框架设计基础-TestNG日志-上篇(详解教程)

    1.简介 TestNG还为我们提供了测试的记录功能-日志.例如,在运行测试用例期间,用户希望在控制台中记录一些信息.信息可以是任何细节取决于目的.牢记我们正在使用Selenium进行测试,我们需要有助 ...

  2. 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

    1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...

  3. 《手把手教你》系列基础篇(九十)-java+ selenium自动化测试-框架设计基础-Logback实现日志输出-中篇(详解教程)

    1.简介 上一篇宏哥介绍是如何使用logback将日志输出到控制台中,但是如果需要发给相关人需要你拷贝出来,有时候由于控制台窗口的限制,有部分日志将会无法查看,因此我们还是需要将日志输出到文件中,因此 ...

  4. 《手把手教你》系列基础篇(七十七)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 上篇(详解教程)

    1.简介 今天主要是讲解和分享:TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用dependsOnMethods,testNG会自动根据@Test方法名称 ...

  5. 《手把手教你》系列基础篇(七十五)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 中篇(详解教程)

    1.简介 上一篇中介绍了DataProvider如何传递参数,以及和一些其他方法结合传递参数,今天宏哥接着把剩下的一些常用的也做一下简单的介绍和分享. 2.项目实战1 @DataProvider + ...

  6. 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)

    1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...

  7. 《手把手教你》系列基础篇(八十五)-java+ selenium自动化测试-框架设计基础-TestNG自定义日志-下篇(详解教程)

    1.简介 TestNG为日志记录和报告提供的不同选项.现在,宏哥讲解分享如何开始使用它们.首先,我们将编写一个示例程序,在该程序中我们将使用 ITestListener方法进行日志记录. 2.Test ...

  8. 《手把手教你》系列基础篇(七十三)-java+ selenium自动化测试-框架设计基础-TestNG实现启动不同浏览器(详解教程)

    1.简介 上一篇文章中,从TestNg的特点我们知道支持变量,那么我们这一篇就通过变量参数来启动不同的浏览器进行自动化测试.那么如何实现同时启动不同的浏览器对脚本进行测试,且听宏哥娓娓道来. 2.项目 ...

  9. 《手把手教你》系列基础篇(七十八)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 中篇(详解教程)

    1.简介 上一篇讲解了依赖测试的各种方法,今天继续讲解依赖测试的方法,这一篇主要是讲解和分享通过xml文件配置组名依赖方法( 主要是测试组的用法).废话不说,直接上干货. 2.实例 测试组:一个组可包 ...

随机推荐

  1. Win10 提示凭证不工作问题

    感谢大佬:https://cloud.tencent.com/developer/article/1337081 在公司局域网远程自己计算机的时候,突然无法远程了,提示"您的凭据不工作 之前 ...

  2. Linux命令date日期时间和Unix时间戳互转

    A.将日期转换为Unix时间戳将当前时间以Unix时间戳表示: date +%s 输出如下: 1361542433 转换指定日期为Unix时间戳: date -d '2013-2-22 22:14' ...

  3. 友盟分享,极光推送Demo

    友盟分享SDK下载及官方文档 http://dev.umeng.com/social/ios/detail-share 1.注册应用获取App友盟Appkey(556d14ad67e58eb08400 ...

  4. 简述CGI与FASTCGI区别

    CGI和FASTCGI都是服务器端与客户端进行交互的常见方式. CGI处理客户端请求,会生成一个子进程来专门调用外部程序来处理客户端请求,处理完成,子进程会随之关闭 FAST处理客户端请求时.服务器端 ...

  5. day1 -- Python变量、注释、格式化输出字符串、input、if、while、for

    1.python变量 不需要声明类型,直接 变量名 = 变量值,如 : name = "hahaha" 2.注释: 单行注释,前面加 #,如  # print(info) 多行注释 ...

  6. 4.Flink实时项目之数据拆分

    1. 摘要 我们前面采集的日志数据已经保存到 Kafka 中,作为日志数据的 ODS 层,从 kafka 的ODS 层读取的日志数据分为 3 类, 页面日志.启动日志和曝光日志.这三类数据虽然都是用户 ...

  7. Spring Druid多数据源配置

    SpringBoot 多数据源配置 如果需要在一个应用中使用多个数据源,应当如何实现呢,在Spring配置MyBatis中,我们可以看到以下的代码 <!-- mybatis 的SqlSessio ...

  8. 基于单XCVU9P+双DSP C6678的双FMC接口 100G光纤传输加速计算卡

    一.板卡概述 板卡包括一片Xilinx FPGA  XCVU9P,两片 TI 多核DSP TMS320C6678及其控制管理芯片CFPGA.设计芯片满足工业级要求. FPGA VU9P 需要外接4路Q ...

  9. Solution -「LOJ #6053」简单的函数

    \(\mathcal{Description}\)   Link.   积性函数 \(f\) 满足 \(f(p^c)=p\oplus c~(p\in\mathbb P,c\in\mathbb N_+) ...

  10. Vue中组件通信的几种方法(Vue3的7种和Vue2的12种组件通信)

    Vue3组件通信方式: props $emit expose / ref $attrs v-model provide / inject Vuex 使用方法: props 用 props 传数据给子组 ...