Selenium Framework: Daten-, Schlüsselwort- und Hybrid-gesteuert
Was bedeutet Selenium Rahmen?
Die Selenium Automatisierungs-Framework ist eine Codestruktur, die die Codewartung einfach und effizient macht. Ohne Frameworks platzieren Benutzer möglicherweise „Code“ und „Daten“ an derselben Stelle, die weder wiederverwendbar noch lesbar ist. Frameworks führen zu vorteilhaften Ergebnissen wie erhöhter Wiederverwendbarkeit des Codes, höherer Portabilität, geringeren Kosten für die Skriptwartung, besserer Lesbarkeit des Codes usw.
Arten von Selenium Unser Ansatz
Es sind hauptsächlich drei Art der Frameworks erstellt von Selenium WebDriver zur Automatisierung manueller Testfälle
- Datengesteuertes Framework
- Schlüsselwortgesteuertes Framework
- Hybridgesteuertes Framework
Datengesteuertes Framework in Selenium
Datengesteuertes Framework in Selenium ist eine Methode zum Trennen von Datensätzen vom Testfall. Sobald die Datensätze vom Testfall getrennt sind, können sie problemlos für eine bestimmte Funktionalität geändert werden, ohne den Code zu ändern. Es wird verwendet, um Testfälle und Suiten aus externen Dateien wie abzurufen Excel, .csv, .xml oder einige Datenbanktabellen.
Zum Lesen oder Schreiben einer Excel-Datei stellt Apache eine sehr bekannte POI-Bibliothek zur Verfügung. Diese Bibliothek ist in der Lage, beides zu lesen und zu schreiben XLS und XLSX Dateiformat von Excel.
Lesen XLS Dateien, ein HSSF Die Implementierung wird von der POI-Bibliothek bereitgestellt.
Lesen XLSX, XSSF Implementierung von POI Bibliothek wird die Wahl sein. Lassen Sie uns diese Implementierungen im Detail untersuchen.
Über Data Driven Testing haben wir bereits in unserem gelernt vorheriges Tutorial
Schlüsselwortgesteuertes Framework in Selenium
Schlüsselwortgesteuertes Framework in Selenium ist eine Methode zur Beschleunigung automatisierter Tests durch Trennung von Schlüsselwörtern für gemeinsame Funktions- und Befehlssätze. Alle auszuführenden Operationen und Anweisungen werden in eine externe Datei wie eine Excel-Tabelle geschrieben. Benutzer können die Funktionen, die sie testen möchten, einfach steuern und angeben.
So sieht das komplette Framework aus
Wie Sie sehen, handelt es sich um ein 5-Stufen-Framework. Lassen Sie uns es Schritt für Schritt im Detail untersuchen.
Schritt 1)
- Das Treiberskript Execute.java ruft ReadGuru99ExcelFile.java auf
- ReadGuru99ExcelFile.java verfügt über ein POI-Skript zum Lesen von Daten aus Excel
Schritt 2)
- ReadGuru99ExcelFile.java liest Daten aus TestCase.xlsx
- So sieht das Blatt aus:
- Gemäß den in der Excel-Datei geschriebenen Schlüsselwörtern führt das Framework den Vorgang auf der Benutzeroberfläche aus.
- Zum Beispiel müssen wir auf die Schaltfläche „Anmelden“ klicken. Dementsprechend verfügt unser Excel über das Schlüsselwort „Klick“. Jetzt kann die AUT Hunderte von Schaltflächen auf einer Seite haben. Um eine Anmeldeschaltfläche zu identifizieren, geben wir in Excel den Objektnamen als loginButton und den Objekttyp als Namen ein (siehe hervorgehobene Zeile im Bild oben). Der Objekttyp kann XPath, Namens-CSS oder ein beliebiger anderer Wert sein
Schritt 3) ReadGuru99ExcelFile.java übergibt diese Daten an das Treiberskript Execute.java
Schritt 4)
- Für alle unsere UI-Webelemente müssen wir ein Objekt-Repository erstellen, in dem wir ihren Element-Locator (wie XPath, Name, CSS-Pfad, Klassenname usw.) platzieren.
- Execute.java (unser Treiberskript) liest das gesamte Objekt-Repository und speichert es in einer Variablen
- Um dieses Objekt-Repository zu lesen, benötigen wir eine ReadObject-Klasse, die über eine getObjectRepository-Methode zum Lesen verfügt.
Anmerkungen: Sie fragen sich vielleicht, warum wir ein Objekt-Repository erstellen müssen. Die Antwort hilft bei der Codepflege. Beispielsweise verwenden wir die Schaltfläche mit dem Namen = btnlogin in 10 verschiedenen Testfällen. Zukünftig beschließt der Entwickler, den Namen von „btnlogin“ in „submit“ zu ändern. Sie müssen in allen 10 Testfällen eine Änderung vornehmen. Im Falle eines Objekt-Repositorys nehmen Sie die Änderung nur einmal im Repository vor.
Schritt 5)
- Der Treiber übergibt die Daten vom Excel- und Objekt-Repository an die BenutzeroberflächeOperaklasse
- UIOperaDie tionsklasse verfügt über Funktionen zum Ausführen von Aktionen, die den im Excel genannten Schlüsselwörtern wie CLICK, SETTEXT usw. entsprechen
- UIOperationsklasse ist eine Java Klasse, die die eigentliche Implementierung des Codes zur Durchführung von Operationen an Web-Elementen enthält
Das komplette Projekt wird so aussehen:
Schauen wir uns ein Beispiel an:
Testszenario: Wir führen 2 Testfälle durch
- Testfall 1:
- Gehe zu
http://demo.guru99.com/V4/
- Geben Sie die Benutzer-ID ein
- Passwort eingeben
- Klicken Sie auf Zurücksetzen
- Testfall 2:
- Gehe zu
http://demo.guru99.com/V4/
- Geben Sie die Benutzer-ID ein
- Passwort eingeben
- Klicken Sie auf Login
Objekteigenschaften
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"); } } } }
Nach der Ausführung sieht die Ausgabe so aus:
Laden Sie Selenium Projektdateien für die Demo in diesem Tutorial
Hybridgesteuertes Framework
Hybridgesteuertes Framework in Selenium ist ein Konzept, bei dem wir die Vorteile sowohl des schlüsselwortgesteuerten Frameworks als auch des datengesteuerten Frameworks nutzen. Es handelt sich um ein benutzerfreundliches Framework, das es manuellen Testern ermöglicht, Testfälle zu erstellen, indem sie sich einfach die Schlüsselwörter, Testdaten und das Objekt-Repository ansehen, ohne im Framework programmieren zu müssen.
Für Schlüsselwörter verwenden wir hier Excel-Dateien, um Testfälle zu verwalten, und für Testdaten können wir Daten, Anbieter von verwenden Testng Rahmen.
Hier in unserem Hybrid-Framework müssen wir nichts am schlüsselwortgesteuerten Framework ändern, hier müssen wir lediglich die Datei ExecuteTest.java durch die Datei HybridExecuteTest.java ersetzen.
Diese HybridExecuteTest-Datei enthält den gesamten Code für Schlüsselwörter, die mit dem Datenanbieterkonzept gesteuert werden.
Die vollständige bildliche Darstellung des Hybridrahmens wird so aussehen
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; } }
Zusammenfassung
- Wir können drei Arten von Testframeworks erstellen Selenium WebDriver.
- A Selenium Automatisierungs-Framework, das in datengesteuerte, schlüsselwortgesteuerte und hybride Frameworks klassifiziert werden kann.
- Wir können ein datengesteuertes Framework verwenden TestNGDatenanbieter.
- Im schlüsselwortgesteuerten Framework werden Schlüsselwörter in einige externe Dateien wie eine Excel-Datei geschrieben, und Java-Code ruft diese Datei auf und führt Testfälle aus.
- Das Hybrid-Framework ist eine Mischung aus schlüsselwortgesteuertem und datengesteuertem Framework.
Laden Sie Selenium Projektdateien für die Demo in diesem Tutorial