前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《手把手教你》系列基础篇(七十六)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 下篇(详解教程)

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

作者头像
北京-宏哥
发布2022-04-27 17:48:55
4270
发布2022-04-27 17:48:55
举报

1.简介

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

2.测试场景

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

3.实际应用1

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

3.1代码设计
3.2参考代码
代码语言:javascript
复制
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参考代码
代码语言:javascript
复制
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。修改定位方法问题解决。

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

代码语言:javascript
复制
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']")).sendKeys(password);

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

代码语言:javascript
复制
driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).sendKeys(password);

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简介
  • 2.测试场景
  • 3.实际应用1
    • 3.1代码设计
      • 3.2参考代码
        • 3.3运行代码
        • 4.实际应用1
          • 4.1测试步骤
            • 4.2代码设计
              • 4.3参考代码
                • 4.4运行代码
                • 5.小结
                相关产品与服务
                数据保险箱
                数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档