Selenium Ramme: Data, søgeord og hybriddrevet
Hvad er Selenium Ramme?
Selenium automatiseringsramme er en kodestruktur, der gør kodevedligeholdelse nem og effektiv. Uden rammer kan brugere placere "koden" og "dataene" på samme sted, som hverken kan genbruges eller læses. Rammer giver gavnlige resultater som øget kodegenanvendelighed, højere portabilitet, reducerede omkostninger til scriptvedligeholdelse, bedre kodelæsbarhed osv.
Typer af Selenium Framework
Der er hovedsageligt tre type rammer lavet af Selenium WebDriver til at automatisere manuelle testsager
- Datadrevet rammeværk
- Søgeordsdrevet rammeværk
- Hybriddrevet rammeværk
Datadrevet rammeværk i Selenium
Datadrevet rammeværk i Selenium er en metode til at adskille datasæt fra testcasen. Når datasættene er adskilt fra testcasen, kan de let modificeres til en specifik funktionalitet uden at ændre koden. Det bruges til at hente testcases og suiter fra eksterne filer som f.eks Excel, .csv, .xml eller nogle databasetabeller.
For at læse eller skrive en Excel giver Apache et meget berømt biblioteks-POI. Dette bibliotek er i stand til at læse og skrive begge dele XLS og XLSX filformat af Excel.
At læse XLS filer, en HSSF implementering leveres af POI-biblioteket.
At læse XLSX, XSSF gennemførelse af POI bibliotek vil være valget. Lad os studere disse implementeringer i detaljer.
Vi har allerede lært om datadrevet test i vores tidligere vejledning
Keyword Driven Framework i Selenium
Keyword Driven Framework i Selenium er en metode, der bruges til at fremskynde automatiseret test ved at adskille nøgleord for fælles sæt funktioner og instruktioner. Alle operationer og instruktioner, der skal udføres, er skrevet i en ekstern fil som et Excel-ark. Brugere kan nemt styre og specificere de funktionaliteter, de vil teste.
Sådan ser den komplette ramme ud
Som du kan se, er det en 5-trins ramme. Lad os studere det trinvist i detaljer
Trin 1)
- Driver-scriptet Execute.java vil kalde ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java har POI-script til at læse data fra en Excel
Trin 2)
- ReadGuru99ExcelFile.java vil læse data fra TestCase.xlsx
- Sådan ser arket ud -
- I henhold til nøgleordene skrevet i Excel-fil, vil rammen udføre handlingen på brugergrænsefladen.
- For eksempel skal vi klikke på en knap 'Login'. Tilsvarende vil vores Excel have et søgeord 'Klik'. Nu kan AUT have hundredvis af knapper på en side, for at identificere en login-knap, i Excel vil vi indtaste Objektnavn som loginButton & objekttype som et navn (se den fremhævede række i ovenstående billede). Objekttypen kunne være Xpath, navn CSS eller en hvilken som helst anden værdi
Trin 3) ReadGuru99ExcelFile.java vil videregive disse data til driverscriptet Execute.java
Trin 4)
- For alle vores UI-webelementer er vi nødt til at oprette et objektlager, hvor vi placerer deres elementlocator (som Xpath, navn, CSS-sti, klassenavn osv.)
- Execute.java (vores driverscript) vil læse hele objektlageret og gemme det i en variabel
- For at læse dette objektlager har vi brug for en ReadObject-klasse, som har en getObjectRepository-metode til at læse den.
BEMÆRK VENLIGST: Du tænker måske, hvorfor skal vi oprette et objektlager. Svaret hjælper med kodevedligeholdelse. For eksempel bruger vi knappen med navn = btnlogin i 10 forskellige testcases. Fremover beslutter udvikleren at ændre navnet fra btnlogin for at indsende. Du bliver nødt til at foretage en ændring i alle de 10 testcases. I tilfælde af et objektlager vil du kun foretage ændringen én gang i lageret.
Trin 5)
- Driveren sender dataene fra Excel & Object Repository til brugergrænsefladenOperation klasse
- UIOperation-klassen har funktioner til at udføre handlinger svarende til nøgleord som CLICK, SETTEXT osv... nævnt i excel
- UIOperation klasse er en Java klasse, som har den faktiske implementering af koden til at udføre operationer på webelementer
Det komplette projekt vil se ud -
Lad os se på et eksempel:
Testscenarie: Vi udfører 2 testcases
- Testcase 1:
- Gå til
http://demo.guru99.com/V4/
- Indtast bruger-id
- Indtast adgangskode
- Klik på Nulstil
- Testcase 2:
- Gå til
http://demo.guru99.com/V4/
- Indtast bruger-id
- Indtast adgangskode
- Klik på Login
objekt.egenskaber
url=http://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 udførelse vil output se sådan ud -
Download Selenium Projektfiler til demoen i denne vejledning
Hybriddrevet rammeværk
Hybriddrevet rammeværk in Selenium er et koncept, hvor vi bruger fordelen ved både søgeordsdrevet framework og datadrevet framework. Det er et brugervenligt framework, som giver manuelle testere mulighed for at oprette testcases ved blot at se på nøgleord, testdata og objektlager uden at kode i rammen.
Her til nøgleord vil vi bruge Excel-filer til at vedligeholde testcases, og til testdata kan vi bruge data, udbyder af Testng rammer.
Her i vores hybrid-framework behøver vi ikke at ændre noget i Keyword-drevet framework, her skal vi blot erstatte filen ExecuteTest.java med filen HybridExecuteTest.java.
Denne HybridExecuteTest-fil har al koden til nøgleordsdrevet med dataleverandørkoncept.
Den komplette billedrepræsentation af hybridramme vil se ud
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; } }
Resumé
- Vi kan oprette tre typer testramme vha Selenium WebDriver.
- A Selenium automatiseringsramme, der kan klassificeres i datadrevne, søgeordsdrevne og hybride rammer.
- Vi kan opnå datadrevne rammer ved hjælp af TestNG's dataudbyder.
- I nøgleordsdrevet framework er nøgleord skrevet i nogle eksterne filer som excel-fil og java-kode vil kalde denne fil og udføre testcases.
- Den hybride ramme er en blanding af nøgleordsdrevet og datadrevet rammeværk.
Download Selenium Projektfiler til demoen i denne vejledning