什么是Selenium框架?

Selenium框架是一种代码结构,用于简化代码维护和提高代码可读性。框架涉及将整个代码分成较小的代码段,以测试特定的功能。

该代码的结构使得“数据集”与实际的“测试用例”分开,后者将测试Web应用程序的功能。它也可以通过以下方式构造:从外部应用程序(例如.csv)调用(调用)需要执行的测试用例。

有许多框架,但是3个常用的Selenium框架是:

  • 数据驱动框架

  • 关键字驱动框架

  • 混合框架

为什么我们需要一个Selenium框架?

如果没有合适的框架,将只有一个测试用例,其中包含了整个测试功能。可怕的是,这个单一的测试用例最多可以上升一百万行代码。因此,显而易见,如此庞大的测试案例将很难阅读。即使您以后想要修改任何功能,修改代码也将很困难。

由于框架的实施,将产生较小但多个代码段,因此有许多好处。

Selenium 框架的好处

  • 增加代码重用

  • 改进的代码可读性

  • 更高的便携性

  • 精简脚本 保养

既然您已经了解了框架的基础知识,那么让我详细解释每个框架。

数据驱动框架

Selenium中的数据驱动框架是一种将“数据集”与实际“测试用例”(代码)分离的技术。该框架完全取决于输入的测试数据。测试数据来自外部源,例如excel文件,.CSV文件或任何数据库。

由于测试用例与数据集是分开的,因此我们可以轻松修改特定功能的测试用例,而无需对代码进行大量更改。例如,如果您想修改用于登录功能的代码,则可以只进行修改,而不必同时修改同一代码中的任何其他相关部分。

除此之外,您还可以轻松控制需要测试的数据量。您可以通过向excel文件(或其他来源)添加更多用户名和密码字段来轻松增加测试参数的数量。

例如,如果我必须检查登录到网页,那么我可以将用户名和密码凭据集保留在excel文件中,并将凭据传递给代码以在单独的Java类文件中在浏览器上执行自动化。

将Apache POI与Selenium WebDriver一起使用

WebDriver不直接支持读取excel文件。因此,我们使用Apache POI  读取/写入任何Microsoft Office文档。您可以从此处下载Apache POI(JAR文件集)。根据您的要求下载zip文件或tar文件,并将它们与Selenium JAR集一起放置。

TestNG数据提供程序将处理主要代码和数据集之间的协调,TestNG数据提供程序  是一个库它是Apache POI JAR文件的一部分。出于演示目的,我创建了一个名为“ LoginCredentials”的Excel文件,其中的用户名和密码已存储在不同的列中。

查看下面的代码以了解测试用例。它是用于测试航班预订应用程序登录功能的简单代码。

package DataDriven;import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;public class DDTExcel
{ChromeDriver driver;@Test(dataProvider="testdata")public void DemoProject(String username, String password) throws InterruptedException
{System.setProperty("webdriver.chrome.driver", "C:UsersVardhanDownloadschromedriver.exe");driver = new ChromeDriver();driver.get("http://newtours.demoaut.com/");driver.findElement(By.name("userName")).sendKeys(username);driver.findElement(By.name("password")).sendKeys(password);driver.findElement(By.name("login")).click();Thread.sleep(5000);Assert.assertTrue(driver.getTitle().matches("Find a Flight: Mercury Tours:"), "Invalid credentials");System.out.println("Login successful");}@AfterMethodvoid ProgramTermination()
{driver.quit();}@DataProvider(name="testdata")public Object[][] TestDataFeed(){ReadExcelFile config = new ReadExcelFile("C:UsersVardhanworkspaceSeleniumLoginCredentials.xlsx");int rows = config.getRowCount(0);Object[][] credentials = new Object[rows][2];for(int i=0;i<rows;i++){credentials[i][0] = config.getData(0, i, 0);credentials[i][1] = config.getData(0, i, 1);}return credentials;}
}

如果从上面注意到,我们有一个名为“ TestDataFeed()”的方法。在这种方法中,我创建了另一个名为“ ReadExcelFile”的类的对象实例。在实例化该对象时,我已经提供了包含数据的excel文件的路径。我进一步定义了一个for循环,以从excel工作簿中检索文本。

但是,为了从给定的工作表编号,列编号和行编号读取数据,将对“ ReadExcelFile”类进行调用。我的“ ReadExcelFile”的代码如下。

package DataDriven;import java.io.File;
import java.io.FileInputStream;import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class ReadExcelFile
{XSSFWorkbook wb;XSSFSheet sheet;public ReadExcelFile(String excelPath)
{try{File src = new File(excelPath);FileInputStream fis = new FileInputStream(src);wb = new XSSFWorkbook(fis);}catch(Exception e){System.out.println(e.getMessage());}}public String getData(int sheetnumber, int row, int column)
{sheet = wb.getSheetAt(sheetnumber);String data = sheet.getRow(row).getCell(column).getStringCellValue();return data;}public int getRowCount(int sheetIndex)
{int row = wb.getSheetAt(sheetIndex).getLastRowNum();row = row + 1;return row;}
}

首先请注意我导入的库。我已经导入了Apache POI XSSF库,该库用于读取数据或将数据写入excel文件。在这里,我创建了一个构造函数(相同方法的对象)以传递值:工作表编号,行编号和列编号。

关键字驱动框架

关键字驱动框架是一种技术,其中要执行的所有操作和指令均与实际测试用例分开编写。它与Data Driven框架的相似之处在于,要执行的操作再次存储在Excel表格之类的外部文件中。

我正在谈论的操作不过是需要作为测试用例的一部分执行的方法。关键字驱动框架的好处是您可以轻松控制要测试的功能。您可以在excel文件中指定测试应用程序功能的方法。因此,将仅测试excel中指定的那些方法名称。

例如,对于登录Web应用程序,我们可以在主测试用例中编写多种方法,其中每个测试用例都将测试某些功能。为了实例化浏览器驱动程序,可能有一种方法,找到用户名和密码字段,可能有方法,为了导航到网页,可能有另一种方法,等等。

看一下下面的代码,以了解框架的外观。如果您不理解,下面的代码中注释掉的行将作为解释。

package KeywordDriven;import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.Test;import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;public class Actions
{public static WebDriver driver;public static void openBrowser()
{ System.setProperty("webdriver.chrome.driver", "C:UsersVardhanDownloadschromedriver.exe");driver=new ChromeDriver();}public static void navigate()
{ driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);driver.get("http://newtours.demoaut.com");}public static void input_Username()
{driver.findElement(By.name("userName")).sendKeys("mercury"); }public static void input_Password()
{driver.findElement(By.name("password")).sendKeys("mercury");}public static void click_Login()
{driver.findElement(By.name("login")).click();}@Testpublic static void verify_login()
{String pageTitle = driver.getTitle();Assert.assertEquals(pageTitle, "Find a Flight: Mercury Tours:");}public static void closeBrowser()
{driver.quit();}
}

如您所见,需要测试的不同功能存在于等待调用的单独方法中。现在,基于excel文件中方法名称的存在,将从另一个类中调用这些方法。同样,为了读取excel文件并发送回结果,我编写了另一个Class。它们都显示在下面。

调用方法的类文件就是这个。

package KeywordDriven;public class DriverScript
{public static void main(String[] args) throws Exception {//用Excel文件的名称声明Excel文件的路径String sPath = "C:UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx"; //在这里,我们传递Excel路径和SheetName作为参数来连接Excel文件ReadExcelData.setExcelFile(sPath, "Sheet1");//硬编码值目前用于Excel行和列
//硬编码值目前用于Excel行和列
//在后面的章节中,我们将用varibales/替换这些硬编码值,这是逐行读取列3(Action关键字)的值的循环for (int iRow=1;iRow<=7;iRow++){String sActions = ReadExcelData.getCellData(iRow, 1); //将Excel单元格的值与“Actions”类中的所有关键字进行比较if(sActions.equals("openBrowser")){
//如果excel单元格值为“openBrowser”,则执行此操作
//此处调用Action关键字以执行操作Actions.openBrowser();}else if(sActions.equals("navigate")){Actions.navigate();}else if(sActions.equals("input_Username")){Actions.input_Username();}else if(sActions.equals("input_Password")){Actions.input_Password();}else if(sActions.equals("click_Login")){Actions.click_Login();} else if(sActions.equals("verify_Login")){Actions.verify_login();} else if(sActions.equals("closeBrowser")){Actions.closeBrowser();} }}
}

读取Excel值的类文件是这个。

package KeywordDriven;import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;public class ReadExcelData
{private static XSSFSheet ExcelWSheet;private static XSSFWorkbook ExcelWBook;private static XSSFCell Cell;
//此方法用于设置文件路径并打开Excel文件
//将Excel Path和SheetName作为参数传递给此方法public static void setExcelFile(String Path,String SheetName) throws Exception
{FileInputStream ExcelFile = new FileInputStream(Path);ExcelWBook = new XSSFWorkbook(ExcelFile);ExcelWSheet = ExcelWBook.getSheet(SheetName);}//此方法是从Excel单元格中读取测试数据
//在这里,我们将参数/参数作为Row Num和Col Num传递public static String getCellData(int RowNum, int ColNum) throws Exception
{Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);String CellData = Cell.getStringCellValue();return CellData;}
}

混合框架

混合框架是一种技术,在这种技术中,我们可以充分利用数据驱动和关键字驱动的

Selenium 框架。使用此博客中上面显示的示例,我们可以通过将要执行的方法存储在excel文件中(关键字驱动方法)并将这些方法名称传递给Java Reflection Class(数据驱动方法)来构建混合框架,而不是创建  If /  DriverScript类中的/ Else循环。

在下面的代码片段中查看修改后的“ DriverScript”类。 在这里,不是使用多个If / Else循环,而是使用数据驱动的方法从excel文件中读取方法名称。

package HybridFramework;import java.lang.reflect.Method;public class DriverScriptJava
{//这是一个类对象,声明为“public static”//以便它可以在main[]方法的范围之外使用public static Actions actionKeywords;public static String sActions;//这是反射类对象,声明为“public static”//以便它可以在main[]方法的范围之外使用public static Method method[];public static void main(String[] args) throws Exception
{//用Excel文件的名称声明Excel文件的路径String sPath = "C:UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx";//在这里,我们传递Excel路径和SheetName来连接Excel文件
//此方法是以前创建的ReadExcelData.setExcelFile(sPath, "Sheet1");//硬编码值目前用于Excel行和列
//稍后,我们将更有效地使用这些硬编码值
//这是逐行读取列(Action关键字)值的循环
//这意味着这个循环将执行测试步骤表中为测试用例提到的所有步骤for (int iRow=1;iRow<=7;iRow++){sActions = ReadExcelData.getCellData(iRow, 1);
//将创建一个名为“execute_Actions”的新独立方法
//你可以在下面的测试中找到这个方法
//所以这条语句除了调用那段代码来执行execute_Actions(); }}//此方法包含执行某些操作的代码
//因为它是完全不同的逻辑集,只围绕动作运行,所以将它与主驱动程序脚本分开是有意义的
//这是执行测试步骤(操作)
private static void execute_Actions() throws Exception
{
//在这里,我们将实例化类“Actions”的新对象actionKeywords = new Actions();//这将在其中加载类“Actions”的所有方法。
//它就像一系列的方法,用这里的断点做手表method = actionKeywords.getClass().getMethods();//这是一个循环,将为Action关键字类中的操作数运行
//方法变量包含所有方法和方法.长度返回方法总数for(int i = 0;i<method.length;i++){
//现在将方法名与从excel接收的ActionKeyword值进行比较if(method[i].getName().equals(sActions)){ //如果找到匹配,它将执行matched方法method[i].invoke(actionKeywords);//一旦执行了任何方法,这个break语句将把流带出for循环break;}}}
}

我希望这个文章对您有用,并让您清楚地了解什么是Selenium框架,它如何有益以及如何使用这3个Selenium框架构建代码结构。请继续关注本系列中的更多博客。

您需要了解的有关Selenium等待方法

如何在Selenium WebDriver中查找元素?(二)

如何在Selenium WebDriver中查找元素?(一)

python之函数基础

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

  1. Selenium自动化框架:数据驱动、关键字驱动和混合

    什么是Selenium框架? 这个 Selenium框架 是一种代码结构,它使代码维护变得简单而高效.如果没有框架,用户可以将"c"框架产生了一些有益的结果,比如增加了代码可重用性 ...

  2. python关键字驱动框架搭建_python webdriver混合驱动测试框架(数据驱动+关键字驱动)...

    混合驱动:把数据驱动.关键字驱动结合起来一起使用 testdata.txt http://www.126.com http://www.sohu.com teststep.txt open||chro ...

  3. 能涨薪3k的UI 自动化测试框架:关键字驱动+数据驱动

    [文章末尾给大家留下了大量的福利] 1. 关键字驱动框架简介 原理及特点 关键字驱动测试是数据驱动测试的一种改进类型,它也被称为表格驱动测试或者基于动作字的测试. 主要关键字包括三类:被操作对象(It ...

  4. UI 自动化测试框架:关键字驱动+数据驱动

    1. 关键字驱动框架简介 原理及特点 关键字驱动测试是数据驱动测试的一种改进类型,它也被称为表格驱动测试或者基于动作字的测试. 主要关键字包括三类:被操作对象(Item).操作行为(Operation ...

  5. ui自动化测试框架_数据驱动 vs 关键字驱动:对搭建UI自动化测试框架的探索

    谢谢打开这篇文章的每个你 关注我们 点击右上角 ··· 设为星标 UI自动化测试用例剖析 让我们先从分析一端自动化测试案例的代码开始我们的旅程.以下是我之前写的一个自动化测试的小Demo.这个Demo ...

  6. [Java版]selenium关键字驱动框架设计实战(二)

    [Java版]selenium关键字驱动框架设计实战(一)本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力.引言使用和学习selen ...

  7. Java + Selenium3.0 + Maven+Excel + Log4j2 的关键字驱动框架(Design-StepbyStep)

    关键子驱动的框架:关键字驱动框架- 它更多是作为一个开发或者测试开发人员,开发的一个框架或者工具,目的是让不懂代码的黑盒测试人员去快速编写测试脚本. 一:关键字驱动框架介绍 二:搭建关键字驱动框架的步 ...

  8. 自动化测试里的数据驱动和关键字驱动思路的理解

    初次接触自动化测试时,对数据驱动和关键字驱动不甚理解,觉得有点故弄玄须,不就是参数和函数嘛!其实其也体现了测试所不同与开发的一些特点(主要指系统测试),以及和对技术发展的脉络的展现. 1.录制/回放的 ...

  9. 【Web自动化测试——代码篇十二】自动化测试模型——数据驱动测试和关键字驱动测试...

    自动化测试模型可以看作自动化测试框架与工具设计的思想.随着自动化测试技术的发展,演化为以下几种模型: 线性测试 模块化驱动侧式 数据驱动测试 关键字驱动测试 数据驱动测试 前一篇所讲的模块化驱动测试能 ...

  10. 十年测开如何理解自动化测试里的数据驱动、关键字驱动思路

    初次接触自动化测试时,对数据驱动和关键字驱动不甚理解,觉得有点故弄玄须,不就是参数和函数其嘛!其实其也体现了测试所不同与开发的一些特点(主要指系统测试),以及和对技术发展的脉络的展现. 01.录制/回 ...

最新文章

  1. 计算机是如何按照时钟来顺序工作的
  2. Java 8 - 01 优雅编程 lambda 以及 @FunctionalInterface注解一点通
  3. 5点击换gif_工具:GIF动态图片制作小课堂,开课啦!
  4. 834. Sum of Distances in Tree
  5. .net 识别一维码_天若OCR文字识别 v5.0 原创好用的OCR及翻译小工具
  6. python列表生成式内必须定义匿名函数_Python基础-----基础概念总结
  7. 无光驱不支持USB设备启动的笔记本,如何使用Ghost来安装系统
  8. VirtualBox host-only 外网
  9. linux 内核同步--理解原子操作、自旋锁、信号量(可睡眠)、读写锁、RCU锁、PER_CPU变量、内存屏障
  10. 服务的心跳机制与断线重连,Netty底层是怎么实现的?
  11. js数字格式化千分位格式
  12. 【转】Skyline软件介绍
  13. 前端新手HTML入门
  14. java随机生成数字和字母_使用java如何生成随机的字母数字字符串?
  15. keytool 错误: java.lang.Exception: 密钥库文件不存在: keystore
  16. android如何获取网络的状态码,Android RxJava+Retrofit网络异常、状态码统一处理
  17. eLife: 脑岛的微观结构与宏观功能环路相互联系并能预测认知控制
  18. Tiled Map Editor(一)
  19. xxe漏洞原理与防御
  20. Leetcode算法题-解法转载

热门文章

  1. 如何查看当前域名的注册信息?
  2. 一文让你理解什么是shallow heap及retained heap
  3. python对数正态分布函数_将对数正态分布的拟合PDF缩放到python中的histrogram
  4. 无线安全-WiFi渗透流程
  5. MAC系统查看端口,并关闭端口占用
  6. 拼图游戏怎样切换代码html,HTML5技术之图像处理:一个滑动的拼图游戏-H5教程
  7. R语言函数-tolower
  8. 计算机无法启动无法修复工具,windows资源保护无法启动修复服务的解决方法
  9. Reentrantlock和背后金主AQS —————— 开开开山怪
  10. 完美解决idea Maven Cannot reconnect