建立數(shù)據(jù)驅(qū)動,關(guān)鍵字驅(qū)動和混合Selenium框架這些你了解嗎
什么是Selenium框架?
Selenium框架是一種代碼結(jié)構(gòu),用于簡化代碼維護(hù)和提高代碼可讀性。框架涉及將整個代碼分成較小的代碼段,以測試特定的功能。
該代碼的結(jié)構(gòu)使得“數(shù)據(jù)集”與實際的“測試用例”分開,后者將測試Web應(yīng)用程序的功能。它也可以通過以下方式構(gòu)造:從外部應(yīng)用程序(例如.csv)調(diào)用(調(diào)用)需要執(zhí)行的測試用例。
有許多框架,但是3個常用的Selenium框架是:
數(shù)據(jù)驅(qū)動框架
關(guān)鍵字驅(qū)動框架
混合框架
為什么我們需要一個Selenium框架??
如果沒有合適的框架,將只有一個測試用例,其中包含了整個測試功能。可怕的是,這個單一的測試用例最多可以上升一百萬行代碼。因此,顯而易見,如此龐大的測試案例將很難閱讀。即使您以后想要修改任何功能,修改代碼也將很困難。
由于框架的實施,將產(chǎn)生較小但多個代碼段,因此有許多好處。??
Selenium?框架的好處
增加代碼重用
改進(jìn)的代碼可讀性
更高的便攜性
精簡腳本?保養(yǎng)
既然您已經(jīng)了解了框架的基礎(chǔ)知識,那么讓我詳細(xì)解釋每個框架。?
數(shù)據(jù)驅(qū)動框架
Selenium中的數(shù)據(jù)驅(qū)動框架是一種將“數(shù)據(jù)集”與實際“測試用例”(代碼)分離的技術(shù)。該框架完全取決于輸入的測試數(shù)據(jù)。測試數(shù)據(jù)來自外部源,例如excel文件,.CSV文件或任何數(shù)據(jù)庫。
由于測試用例與數(shù)據(jù)集是分開的,因此我們可以輕松修改特定功能的測試用例,而無需對代碼進(jìn)行大量更改。例如,如果您想修改用于登錄功能的代碼,則可以只進(jìn)行修改,而不必同時修改同一代碼中的任何其他相關(guān)部分。
除此之外,您還可以輕松控制需要測試的數(shù)據(jù)量。您可以通過向excel文件(或其他來源)添加更多用戶名和密碼字段來輕松增加測試參數(shù)的數(shù)量。
例如,如果我必須檢查登錄到網(wǎng)頁,那么我可以將用戶名和密碼憑據(jù)集保留在excel文件中,并將憑據(jù)傳遞給代碼以在單獨(dú)的Java類文件中在瀏覽器上執(zhí)行自動化。
將Apache POI與Selenium WebDriver一起使用?
WebDriver不直接支持讀取excel文件。因此,我們使用Apache POI??讀取/寫入任何Microsoft Office文檔。您可以從此處下載Apache POI(JAR文件集)。根據(jù)您的要求下載zip文件或tar文件,并將它們與Selenium JAR集一起放置。

TestNG數(shù)據(jù)提供程序將處理主要代碼和數(shù)據(jù)集之間的協(xié)調(diào),TestNG數(shù)據(jù)提供程序??是一個庫,它是Apache POI JAR文件的一部分。出于演示目的,我創(chuàng)建了一個名為“ LoginCredentials”的Excel文件,其中的用戶名和密碼已存儲在不同的列中。

查看下面的代碼以了解測試用例。它是用于測試航班預(yù)訂應(yīng)用程序登錄功能的簡單代碼。
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;(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");}void ProgramTermination(){driver.quit();}(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{credentials[i][0] = config.getData(0, i, 0);credentials[i][1] = config.getData(0, i, 1);}return credentials;}}
如果從上面注意到,我們有一個名為“ TestDataFeed()”的方法。在這種方法中,我創(chuàng)建了另一個名為“ ReadExcelFile”的類的對象實例。在實例化該對象時,我已經(jīng)提供了包含數(shù)據(jù)的excel文件的路徑。我進(jìn)一步定義了一個for循環(huán),以從excel工作簿中檢索文本。
但是,為了從給定的工作表編號,列編號和行編號讀取數(shù)據(jù),將對“ ReadExcelFile”類進(jìn)行調(diào)用。我的“ 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;}}
首先請注意我導(dǎo)入的庫。我已經(jīng)導(dǎo)入了Apache POI XSSF庫,該庫用于讀取數(shù)據(jù)或?qū)?shù)據(jù)寫入excel文件。在這里,我創(chuàng)建了一個構(gòu)造函數(shù)(相同方法的對象)以傳遞值:工作表編號,行編號和列編號。
關(guān)鍵字驅(qū)動框架
關(guān)鍵字驅(qū)動框架是一種技術(shù),其中要執(zhí)行的所有操作和指令均與實際測試用例分開編寫。它與Data Driven框架的相似之處在于,要執(zhí)行的操作再次存儲在Excel表格之類的外部文件中。
我正在談?wù)摰牟僮鞑贿^是需要作為測試用例的一部分執(zhí)行的方法。關(guān)鍵字驅(qū)動框架的好處是您可以輕松控制要測試的功能。您可以在excel文件中指定測試應(yīng)用程序功能的方法。因此,將僅測試excel中指定的那些方法名稱。
例如,對于登錄Web應(yīng)用程序,我們可以在主測試用例中編寫多種方法,其中每個測試用例都將測試某些功能。為了實例化瀏覽器驅(qū)動程序,可能有一種方法,找到用戶名和密碼字段,可能有方法,為了導(dǎo)航到網(wǎng)頁,可能有另一種方法,等等。

看一下下面的代碼,以了解框架的外觀。如果您不理解,下面的代碼中注釋掉的行將作為解釋。
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();}public static void verify_login(){String pageTitle = driver.getTitle();Assert.assertEquals(pageTitle, "Find a Flight: Mercury Tours:");}public static void closeBrowser(){driver.quit();}}
如您所見,需要測試的不同功能存在于等待調(diào)用的單獨(dú)方法中。現(xiàn)在,基于excel文件中方法名稱的存在,將從另一個類中調(diào)用這些方法。同樣,為了讀取excel文件并發(fā)送回結(jié)果,我編寫了另一個Class。它們都顯示在下面。
調(diào)用方法的類文件就是這個。
package KeywordDriven;public class DriverScript{public static void main(String[] args) throws Exception{//用Excel文件的名稱聲明Excel文件的路徑String sPath = "C:UsersVardhanworkspaceSelenium Frameworks DemodataEngine.xlsx";//在這里,我們傳遞Excel路徑和SheetName作為參數(shù)來連接Excel文件ReadExcelData.setExcelFile(sPath, "Sheet1");//硬編碼值目前用于Excel行和列//硬編碼值目前用于Excel行和列//在后面的章節(jié)中,我們將用varibales/替換這些硬編碼值,這是逐行讀取列3(Action關(guān)鍵字)的值的循環(huán)for (int iRow=1;iRow<=7;iRow++){String sActions = ReadExcelData.getCellData(iRow, 1);//將Excel單元格的值與“Actions”類中的所有關(guān)鍵字進(jìn)行比較if(sActions.equals("openBrowser")){//如果excel單元格值為“openBrowser”,則執(zhí)行此操作//此處調(diào)用Action關(guān)鍵字以執(zhí)行操作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;//此方法用于設(shè)置文件路徑并打開Excel文件//將Excel Path和SheetName作為參數(shù)傳遞給此方法public static void setExcelFile(String Path,String SheetName) throws Exception{FileInputStream ExcelFile = new FileInputStream(Path);ExcelWBook = new XSSFWorkbook(ExcelFile);ExcelWSheet = ExcelWBook.getSheet(SheetName);}//此方法是從Excel單元格中讀取測試數(shù)據(jù)//在這里,我們將參數(shù)/參數(shù)作為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;}}
混合框架?
混合框架是一種技術(shù),在這種技術(shù)中,我們可以充分利用數(shù)據(jù)驅(qū)動和關(guān)鍵字驅(qū)動的
Selenium?框架。使用此文章中上面顯示的示例,我們可以通過將要執(zhí)行的方法存儲在excel文件中(關(guān)鍵字驅(qū)動方法)并將這些方法名稱傳遞給Java Reflection Class(數(shù)據(jù)驅(qū)動方法)來構(gòu)建混合框架,而不是創(chuàng)建??If /??DriverScript類中的/ Else循環(huán)。
在下面的代碼片段中查看修改后的“ DriverScript”類。?在這里,不是使用多個If / Else循環(huán),而是使用數(shù)據(jù)驅(qū)動的方法從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文件//此方法是以前創(chuàng)建的ReadExcelData.setExcelFile(sPath, "Sheet1");//硬編碼值目前用于Excel行和列//稍后,我們將更有效地使用這些硬編碼值//這是逐行讀取列(Action關(guān)鍵字)值的循環(huán)//這意味著這個循環(huán)將執(zhí)行測試步驟表中為測試用例提到的所有步驟for (int iRow=1;iRow<=7;iRow++){sActions = ReadExcelData.getCellData(iRow, 1);//將創(chuàng)建一個名為“execute_Actions”的新獨(dú)立方法//你可以在下面的測試中找到這個方法//所以這條語句除了調(diào)用那段代碼來執(zhí)行execute_Actions();}}//此方法包含執(zhí)行某些操作的代碼//因為它是完全不同的邏輯集,只圍繞動作運(yùn)行,所以將它與主驅(qū)動程序腳本分開是有意義的//這是執(zhí)行測試步驟(操作)private static void execute_Actions() throws Exception{//在這里,我們將實例化類“Actions”的新對象actionKeywords = new Actions();//這將在其中加載類“Actions”的所有方法。//它就像一系列的方法,用這里的斷點(diǎn)做手表method = actionKeywords.getClass().getMethods();//這是一個循環(huán),將為Action關(guān)鍵字類中的操作數(shù)運(yùn)行//方法變量包含所有方法和方法.長度返回方法總數(shù)for(int i = 0;i{//現(xiàn)在將方法名與從excel接收的ActionKeyword值進(jìn)行比較if(method[i].getName().equals(sActions)){ //如果找到匹配,它將執(zhí)行matched方法method[i].invoke(actionKeywords);//一旦執(zhí)行了任何方法,這個break語句將把流帶出for循環(huán)break;}}}}





