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

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

看一下下面的代碼,以了解框架的外觀。如果您不理解,下面的代碼中注釋掉的行將作為解釋。
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();}}
如您所見,需要測(cè)試的不同功能存在于等待調(diào)用的單獨(dú)方法中。現(xiàn)在,基于excel文件中方法名稱的存在,將從另一個(gè)類中調(diào)用這些方法。同樣,為了讀取excel文件并發(fā)送回結(jié)果,我編寫了另一個(gè)Class。它們都顯示在下面。
調(diào)用方法的類文件就是這個(gè)。
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ù)來(lái)連接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值的類文件是這個(gè)。
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單元格中讀取測(cè)試數(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ū)動(dòng)和關(guān)鍵字驅(qū)動(dòng)的
Selenium?框架。使用此文章中上面顯示的示例,我們可以通過將要執(zhí)行的方法存儲(chǔ)在excel文件中(關(guān)鍵字驅(qū)動(dòng)方法)并將這些方法名稱傳遞給Java Reflection Class(數(shù)據(jù)驅(qū)動(dòng)方法)來(lái)構(gòu)建混合框架,而不是創(chuàng)建??If /??DriverScript類中的/ Else循環(huán)。
在下面的代碼片段中查看修改后的“ DriverScript”類。?在這里,不是使用多個(gè)If / Else循環(huán),而是使用數(shù)據(jù)驅(qū)動(dòng)的方法從excel文件中讀取方法名稱。
package HybridFramework;import java.lang.reflect.Method;public class DriverScriptJava{//這是一個(gè)類對(duì)象,聲明為“public static”//以便它可以在main[]方法的范圍之外使用public static Actions actionKeywords;public static String sActions;//這是反射類對(duì)象,聲明為“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來(lái)連接Excel文件//此方法是以前創(chuàng)建的ReadExcelData.setExcelFile(sPath, "Sheet1");//硬編碼值目前用于Excel行和列//稍后,我們將更有效地使用這些硬編碼值//這是逐行讀取列(Action關(guān)鍵字)值的循環(huán)//這意味著這個(gè)循環(huán)將執(zhí)行測(cè)試步驟表中為測(cè)試用例提到的所有步驟for (int iRow=1;iRow<=7;iRow++){sActions = ReadExcelData.getCellData(iRow, 1);//將創(chuàng)建一個(gè)名為“execute_Actions”的新獨(dú)立方法//你可以在下面的測(cè)試中找到這個(gè)方法//所以這條語(yǔ)句除了調(diào)用那段代碼來(lái)執(zhí)行execute_Actions();}}//此方法包含執(zhí)行某些操作的代碼//因?yàn)樗峭耆煌倪壿嫾?,只圍繞動(dòng)作運(yùn)行,所以將它與主驅(qū)動(dòng)程序腳本分開是有意義的//這是執(zhí)行測(cè)試步驟(操作)private static void execute_Actions() throws Exception{//在這里,我們將實(shí)例化類“Actions”的新對(duì)象actionKeywords = new Actions();//這將在其中加載類“Actions”的所有方法。//它就像一系列的方法,用這里的斷點(diǎn)做手表method = actionKeywords.getClass().getMethods();//這是一個(gè)循環(huán),將為Action關(guān)鍵字類中的操作數(shù)運(yùn)行//方法變量包含所有方法和方法.長(zhǎng)度返回方法總數(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í)行了任何方法,這個(gè)break語(yǔ)句將把流帶出for循環(huán)break;}}}}





