Selenium Cadru: bazat pe date, cuvinte cheie și hibrid
Ce Este Selenium Cadru?
Selenium cadru de automatizare este o structură de cod care face întreținerea codului ușoară și eficientă. Fără cadre, utilizatorii pot plasa „codul” și „datele” în aceeași locație, care nu este nici reutilizabilă, nici citibilă. Framework-urile produc rezultate benefice, cum ar fi reutilizabilitate crescută a codului, portabilitate mai mare, costuri reduse de întreținere a scriptului, lizibilitate mai bună a codului etc.
Tipuri de Selenium Cadru
Sunt în principal trei tip de cadre creat de Selenium WebDriver pentru automatizarea cazurilor de testare manuale
- Cadrul bazat pe date
- Cadru bazat pe cuvinte cheie
- Cadru condus de hibrid
Cadrul bazat pe date în Selenium
Cadrul bazat pe date în Selenium este o metodă de separare a seturilor de date din cazul de testare. Odată ce seturile de date sunt separate de cazul de testare, acesta poate fi modificat cu ușurință pentru o anumită funcționalitate, fără a schimba codul. Este folosit pentru a prelua cazuri de testare și suite din fișiere externe, cum ar fi Excel, .csv, .xml sau unele tabele de baze de date.
Pentru a citi sau a scrie un Excel, Apache oferă o bibliotecă foarte faimoasă POI. Această bibliotecă este suficient de capabilă să citească și să scrie pe ambele XLS si XLSX format de fișier Excel.
A citi XLS dosare, an HSSF implementarea este asigurată de biblioteca POI.
A citi XLSX, XSSF implementarea a POI bibliotecă va fi alegerea. Să studiem aceste implementări în detaliu.
Am aflat deja despre testarea bazată pe date în cadrul nostru tutorialul anterior
Cadrul bazat pe cuvinte cheie în Selenium
Cadrul bazat pe cuvinte cheie în Selenium este o metodă folosită pentru accelerarea testării automate prin separarea cuvintelor cheie pentru un set comun de funcții și instrucțiuni. Toate operațiunile și instrucțiunile care trebuie efectuate sunt scrise într-un fișier extern ca o foaie Excel. Utilizatorii pot controla și specifica cu ușurință funcționalitățile pe care doresc să le testeze.
Iată cum arată cadrul complet
După cum puteți vedea, este un cadru în 5 pași. Să-l studiem pas în detaliu
Pas 1)
- Scriptul de driver Execute.java va apela ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java are un script POI pentru a citi datele dintr-un Excel
Pas 2)
- ReadGuru99ExcelFile.java va citi datele din TestCase.xlsx
- Iată cum arată foaia...
- Conform cuvintelor cheie scrise în fișierul Excel, framework-ul va efectua operația pe UI.
- De exemplu, trebuie să facem clic pe butonul „Autentificare”. În mod corespunzător, Excel-ul nostru va avea un cuvânt cheie „Click”. Acum AUT poate avea sute de butoane pe o pagină, pentru a identifica un buton de autentificare, în Excel vom introduce Numele obiectului ca buton de conectare și tipul obiectului ca nume (vezi rândul evidențiat în imaginea de mai sus). Tipul de obiect poate fi Xpath, nume CSS sau orice altă valoare
Pas 3) ReadGuru99ExcelFile.java va transmite aceste date scriptului de driver Execute.java
Pas 4)
- Pentru toate elementele noastre web UI, trebuie să creăm un depozit de obiecte unde le vom plasa locatorul de elemente (cum ar fi Xpath, nume, cale CSS, numele clasei etc.)
- Execute.java (scriptul driverului nostru) va citi întregul depozit de obiecte și îl va stoca într-o variabilă
- Pentru a citi acest depozit de obiecte, avem nevoie de o clasă ReadObject care are o metodă getObjectRepository pentru a o citi.
NOTĂ: Vă puteți gândi de ce trebuie să creăm un depozit de obiecte. Răspunsul ajută la întreținerea codului. De exemplu, folosim butonul cu nume = btnlogin în 10 cazuri de testare diferite. În viitor, dezvoltatorul decide să schimbe numele din btnlogin pentru a trimite. Va trebui să faceți o schimbare în toate cele 10 cazuri de testare. În cazul unui depozit de obiecte, veți face modificarea o singură dată în depozit.
Pas 5)
- Driverul va transmite datele din Excel & Object Repository către UIOperaclasa de tion
- UIOperaClasa tion are funcții pentru a efectua acțiuni corespunzătoare cuvintelor cheie precum CLICK, SETTEXT etc... menționate în excel
- UIOperaclasa de țiune este a Java clasa care are implementarea propriu-zisă a codului pentru a efectua operații pe elemente web
Proiectul complet va arăta ca...
Să ne uităm la un exemplu:
Scenariul de testare: Executăm 2 cazuri de testare
- Cazul de testare 1:
- Mergi la
https://demo.guru99.com/V4/
- Introduceți ID utilizator
- Introdu parola
- Faceți clic pe Resetare
- Cazul de testare 2:
- Mergi la
https://demo.guru99.com/V4/
- Introduceți ID utilizator
- Introdu parola
- Faceți clic pe Conectare
obiect.proprietăţi
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
CitițiGuru99ExcelFile.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"); } } } }
După execuție, rezultatul va arăta ca -
Descărcați Selenium Fișiere de proiect pentru demonstrația din acest tutorial
Cadru condus de hibrid
Cadru condus de hibrid in Selenium este un concept în care folosim avantajul atât al cadrului bazat pe cuvinte cheie, cât și al cadrului bazat pe date. Este un cadru ușor de utilizat, care le permite testatorilor manuali să creeze cazuri de testare doar privind cuvintele cheie, datele de testare și depozitul de obiecte fără codificare în cadru.
Aici, pentru cuvinte cheie, vom folosi fișiere Excel pentru a menține cazurile de testare, iar pentru datele de testare, putem folosi date, furnizor de Testng cadru.
Aici, în cadrul nostru hibrid, nu trebuie să schimbăm nimic în cadrul bazat pe cuvinte cheie, aici trebuie doar să înlocuim fișierul ExecuteTest.java cu fișierul HybridExecuteTest.java.
Acest fișier HybridExecuteTest are tot codul pentru cuvântul cheie condus cu conceptul de furnizor de date.
Reprezentarea picturală completă a cadrului hibrid va arăta ca
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; } }
Rezumat
- Putem crea trei tipuri de cadru de testare folosind Selenium WebDriver.
- A Selenium cadru de automatizare care poate fi clasificat în cadru bazat pe date, bazat pe cuvinte cheie și cadru hibrid.
- Putem realiza un cadru bazat pe date folosind TestNGfurnizorul de date al lui.
- În cadrul bazat pe cuvinte cheie, cuvintele cheie sunt scrise în unele fișiere externe, cum ar fi fișierul Excel, iar codul java va apela acest fișier și va executa cazuri de testare.
- Cadrul hibrid este o combinație de cadru bazat pe cuvinte cheie și bazat pe date.
Descărcați Selenium Fișiere de proiect pentru demonstrația din acest tutorial