Selenium Ramverk: Data, nyckelord och hybriddrivet
Vad är Selenium Ramverk?
Ocuco-landskapet Selenium ramverk för automatisering är en kodstruktur som gör kodunderhåll enkelt och effektivt. Utan ramverk kan användare placera "koden" och "data" på samma plats som varken är återanvändbar eller läsbar. Ramar ger fördelaktiga resultat som ökad kodåteranvändbarhet, högre portabilitet, minskad kostnad för skriptunderhåll, bättre kodläsbarhet, etc.
Typer av Selenium Ramverk
Det är huvudsakligen tre typ av ramar skapad av Selenium WebDriver för att automatisera manuella testfall
- Datadrivet ramverk
- Sökordsdrivet ramverk
- Hybriddrivet ramverk
Datadrivet ramverk i Selenium
Datadrivet ramverk i Selenium är en metod för att separera datamängder från testfallet. När datamängderna väl är separerade från testfallet kan de enkelt modifieras för en specifik funktionalitet utan att ändra koden. Det används för att hämta testfall och sviter från externa filer som excel, .csv, .xml eller några databastabeller.
För att läsa eller skriva en Excel, erbjuder Apache en mycket berömd bibliotek POI. Detta bibliotek är kapabelt nog att läsa och skriva båda XLS och XLSX filformatet i Excel.
Att läsa XLS filer, en HSSF implementering tillhandahålls av POI-biblioteket.
Att läsa XLSX, XSSF införande av POI bibliotek blir valet. Låt oss studera dessa implementeringar i detalj.
Vi har redan lärt oss om datadriven testning i vår tidigare handledning
Keyword Driven Framework i Selenium
Keyword Driven Framework i Selenium är en metod som används för att påskynda automatiserade tester genom att separera nyckelord för vanliga funktioner och instruktioner. Alla operationer och instruktioner som ska utföras är skrivna i någon extern fil som ett Excel-ark. Användare kan enkelt styra och specificera de funktioner de vill testa.
Så här ser hela ramverket ut
Som du kan se är det ett ramverk i 5 steg. Låt oss studera det stegvis i detalj
Steg 1)
- Drivrutinsskriptet Execute.java kommer att anropa ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java har POI-skript för att läsa data från en Excel
Steg 2)
- ReadGuru99ExcelFile.java kommer att läsa data från TestCase.xlsx
- Så här ser arket ut-
- Enligt nyckelorden skrivna i Excel-filen kommer ramverket att utföra operationen på UI.
- Till exempel måste vi klicka på knappen "Logga in". På motsvarande sätt kommer vår Excel att ha nyckelordet "Klick". Nu kan AUT ha hundratals knappar på en sida, för att identifiera en inloggningsknapp, i Excel kommer vi att mata in Objektnamn som inloggningsknapp & objekttyp som ett namn (se den markerade raden i bilden ovan). Objekttypen kan vara Xpath, namn CSS eller något annat värde
Steg 3) ReadGuru99ExcelFile.java skickar dessa data till drivrutinsskriptet Execute.java
Steg 4)
- För alla våra UI-webbelement måste vi skapa ett objektlager där vi placerar deras elementlokaliserare (som Xpath, namn, CSS-sökväg, klassnamn etc.)
- Execute.java (vårt drivrutinsskript) kommer att läsa hela Object Repository och lagra det i en variabel
- För att läsa det här objektförrådet behöver vi en ReadObject-klass som har en getObjectRepository-metod för att läsa den.
OBS: Du kanske tänker varför vi behöver skapa ett objektförråd. Svaret hjälper till med kodunderhåll. Till exempel använder vi knappen med namn = btnlogin i 10 olika testfall. I framtiden beslutar utvecklaren att ändra namnet från btnlogin för att skicka in. Du måste göra en förändring i alla de 10 testfallen. I fallet med ett objektförråd kommer du att göra ändringen bara en gång i förvaret.
Steg 5)
- Drivrutinen skickar data från Excel & Object Repository till UIOperationsklass
- UIOperationklassen har funktioner för att utföra åtgärder som motsvarar nyckelord som CLICK, SETTEXT etc... som nämns i excel
- UIOperationsklassen är en Java klass som har den faktiska implementeringen av koden för att utföra operationer på webbelement
Hela projektet kommer att se ut som
Låt oss titta på ett exempel:
Testscenario: Vi utför 2 testfall
- Testfall 1:
- Gå till
https://demo.guru99.com/V4/
- Ange användar-ID
- Skriv in lösenord
- Klicka på Återställ
- Testfall 2:
- Gå till
https://demo.guru99.com/V4/
- Ange användar-ID
- Skriv in lösenord
- Klicka på Logga in
objekt.egenskaper
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
ReadGuru99ExcelFile.java
package excelExportAndFileIO; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadGuru99ExcelFile { public Sheet readExcel(String filePath,String fileName,String sheetName) throws IOException{ //Create a object of File class to open xlsx file File file = new File(filePath+"\\"+fileName); //Create an object of FileInputStream class to read excel file FileInputStream inputStream = new FileInputStream(file); Workbook guru99Workbook = null; //Find the file extension by spliting file name in substing and getting only extension name String fileExtensionName = fileName.substring(fileName.indexOf(".")); //Check condition if the file is xlsx file if(fileExtensionName.equals(".xlsx")){ //If it is xlsx file then create object of XSSFWorkbook class guru99Workbook = new XSSFWorkbook(inputStream); } //Check condition if the file is xls file else if(fileExtensionName.equals(".xls")){ //If it is xls file then create object of XSSFWorkbook class guru99Workbook = new HSSFWorkbook(inputStream); } //Read sheet inside the workbook by its name Sheet guru99Sheet = guru99Workbook.getSheet(sheetName); return guru99Sheet; } }
ReadObject.java
package operation; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class ReadObject { Properties p = new Properties(); public Properties getObjectRepository() throws IOException{ //Read object repository file InputStream stream = new FileInputStream(new File(System.getProperty("user.dir")+"\\src\\objects\\object.properties")); //load all objects p.load(stream); return p; } }
UIOperation.java
package operation; import java.util.Properties; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; public class UIOperation { WebDriver driver; public UIOperation(WebDriver driver){ this.driver = driver; } public void perform(Properties p,String operation,String objectName,String objectType,String value) throws Exception{ System.out.println(""); switch (operation.toUpperCase()) { case "CLICK": //Perform click driver.findElement(this.getObject(p,objectName,objectType)).click(); break; case "SETTEXT": //Set text on control driver.findElement(this.getObject(p,objectName,objectType)).sendKeys(value); break; case "GOTOURL": //Get url of application driver.get(p.getProperty(value)); break; case "GETTEXT": //Get text of an element driver.findElement(this.getObject(p,objectName,objectType)).getText(); break; default: break; } } /** * Find element BY using object type and value * @param p * @param objectName * @param objectType * @return * @throws Exception */ private By getObject(Properties p,String objectName,String objectType) throws Exception{ //Find by xpath if(objectType.equalsIgnoreCase("XPATH")){ return By.xpath(p.getProperty(objectName)); } //find by class else if(objectType.equalsIgnoreCase("CLASSNAME")){ return By.className(p.getProperty(objectName)); } //find by name else if(objectType.equalsIgnoreCase("NAME")){ return By.name(p.getProperty(objectName)); } //Find by css else if(objectType.equalsIgnoreCase("CSS")){ return By.cssSelector(p.getProperty(objectName)); } //find by link else if(objectType.equalsIgnoreCase("LINK")){ return By.linkText(p.getProperty(objectName)); } //find by partial link else if(objectType.equalsIgnoreCase("PARTIALLINK")){ return By.partialLinkText(p.getProperty(objectName)); }else { throw new Exception("Wrong object type"); } } }
ExecuteTest.java
package testCases; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class ExecuteTest { @Test public void testLogin() throws Exception { // TODO Auto-generated method stub WebDriver webdriver = new FirefoxDriver(); ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); //Create a loop over all the rows of excel file to read it for (int i = 1; i < rowCount+1; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i); //Check if the first cell contain a value, if yes, That means it is the new testcase name if(row.getCell(0).toString().length()==0){ //Print testcase detail on console System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+ row.getCell(3).toString()+"----"+ row.getCell(4).toString()); //Call perform function to perform operation on UI operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(), row.getCell(3).toString(), row.getCell(4).toString()); } else{ //Print the new testcase name when it started System.out.println("New Testcase->"+row.getCell(0).toString() +" Started"); } } } }
Efter körning ser utdata ut så här –
ladda ner Selenium Projektfiler för demon i denna handledning
Hybriddrivet ramverk
Hybriddrivet ramverk in Selenium är ett koncept där vi använder fördelen med både nyckelordsdrivet ramverk och datadrivet ramverk. Det är ett lättanvänt ramverk som tillåter manuella testare att skapa testfall genom att bara titta på nyckelord, testdata och objektförråd utan att koda i ramverket.
Här för nyckelord kommer vi att använda Excel-filer för att underhålla testfall, och för testdata kan vi använda data, leverantör av Testng ramverk.
Här i vårt hybridramverk behöver vi inte ändra något i nyckelordsdrivet ramverk, här behöver vi bara ersätta filen ExecuteTest.java med filen HybridExecuteTest.java.
Denna HybridExecuteTest-fil har all kod för nyckelordsdriven med dataleverantörskoncept.
Den kompletta bildrepresentationen av hybridramverket kommer att se ut
HybridExecuteTest.java
package testCases; import java.io.IOException; import java.util.Properties; import operation.ReadObject; import operation.UIOperation; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import excelExportAndFileIO.ReadGuru99ExcelFile; public class HybridExecuteTest { WebDriver webdriver = null; @Test(dataProvider="hybridData") public void testLogin(String testcaseName,String keyword,String objectName,String objectType,String value) throws Exception { // TODO Auto-generated method stub if(testcaseName!=null&&testcaseName.length()!=0){ webdriver=new FirefoxDriver(); } ReadObject object = new ReadObject(); Properties allObjects = object.getObjectRepository(); UIOperation operation = new UIOperation(webdriver); //Call perform function to perform operation on UI operation.perform(allObjects, keyword, objectName, objectType, value); } @DataProvider(name="hybridData") public Object[][] getDataFromDataprovider() throws IOException{ Object[][] object = null; ReadGuru99ExcelFile file = new ReadGuru99ExcelFile(); //Read keyword sheet Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework"); //Find number of rows in excel file int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum(); object = new Object[rowCount][5]; for (int i = 0; i < rowCount; i++) { //Loop over all the rows Row row = guru99Sheet.getRow(i+1); //Create a loop to print cell values in a row for (int j = 0; j < row.getLastCellNum(); j++) { //Print excel data in console object[i][j] = row.getCell(j).toString(); } } System.out.println(""); return object; } }
Sammanfattning
- Vi kan skapa tre typer av testramverk med hjälp av Selenium WebDriver.
- A Selenium automationsramverk som kan klassificeras i datadrivna, nyckelordsdrivna och hybridramar.
- Vi kan uppnå datadrivet ramverk med hjälp av TestNGs dataleverantör.
- I nyckelordsdrivet ramverk skrivs nyckelord i vissa externa filer som excel-fil och java-kod kommer att anropa denna fil och exekvera testfall.
- Hybridramverket är en blandning av nyckelordsdrivet och datadrivet ramverk.
ladda ner Selenium Projektfiler för demon i denna handledning