关键字驱动和混合Selenium框架这些你了解吗?

发表于:2022-12-14 09:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:知乎

  什么是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");
   }
    
   @AfterMethod
   void 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();
   }
   
  @Test
   public 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框架构建代码结构。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号