Selenium Framework: Daten-, Schlüsselwort- und Hybrid-gesteuert
⚡ Intelligente Zusammenfassung
Selenium Frameworks: Daten-, schlüsselwort- und hybridgetriebene Ansätze definieren, wie Tester Automatisierungscode organisieren, Testdaten trennen und Logik wiederverwenden. Dieser Artikel erläutert jeden Framework-Typ, seine Architektur, Vorteile und die schrittweise praktische Implementierung. Selenium WebDriver-Codebeispiele.

Was ist Selenium Rahmen?
Das Selenium Automatisierungs-Framework Ein Framework ist eine strukturierte Codearchitektur, die die Testwartung einfach, skalierbar und effizient gestaltet. Ohne ein solches Framework platzieren Tester Code und Daten oft am selben Ort, was weder wiederverwendbar noch lesbar ist. Die Verwendung eines Frameworks bietet messbare Vorteile wie höhere Wiederverwendbarkeit des Codes, bessere Portabilität, geringere Kosten für die Skriptwartung, verbesserte Lesbarkeit und eine klarere Trennung der Zuständigkeiten zwischen Testlogik und Eingabedaten.
Stolz können wir verkünden Selenium Automatisierungs-Framework?
Eine gut gestaltete Selenium Das Framework löst drei hartnäckige Probleme der Testautomatisierung: Code-Duplizierung, fehleranfällige Locators und unübersichtliche Testdaten. Durch die klare Struktur können Teams ihre Testsuiten von wenigen Skripten auf Hunderte skalieren, ohne die Kontrolle zu verlieren.
- Wartbarkeit: Zentralisierte Locatoren und Hilfsmethoden bedeuten, dass eine einzige Änderung jeden Test aktualisiert, der dieses Element verwendet.
- Wiederverwendbarkeit: Gängige Operationen wie Login, Navigation oder Formulareingabe werden einmalig geschrieben und in vielen Testfällen aufgerufen.
- Skalierbarkeit: Das Hinzufügen neuer Testfälle wird zu einer Datenaktualisierung anstatt zu einer Programmieraufgabe, wodurch auch Nicht-Entwickler Szenarien beisteuern können.
- Berichterstattung und Zusammenarbeit: Die standardisierte Struktur erleichtert die Integration mit Reporting-Tools, CI/CD-Pipelines und Versionskontrollsystemen.
Arten von Selenium Unser Ansatz
Es gibt drei primäre Arten von Frameworks gebaut auf Selenium WebDriver zur Automatisierung manueller Testfälle. Jeder Stil zielt auf ein anderes Gleichgewicht zwischen Entwickleraufwand, Testerbeteiligung und Datenflexibilität ab.
- Datengesteuertes Framework
- Schlüsselwortgesteuertes Framework
- Hybridgesteuertes Framework
In den folgenden Abschnitten werden die einzelnen Frameworks detailliert erläutert, angefangen beim einfachsten datengetriebenen Ansatz bis hin zum flexibelsten Hybridmodell.
Datengesteuertes Framework in Selenium
Datengesteuertes Framework in Selenium ist eine Methode, um Testdatensätze von der Testfalllogik zu trennen. Sobald die Daten entkoppelt sind, können Sie Eingaben für eine bestimmte Funktionalität ändern, ohne den Testcode anzufassen. Sie wird häufig verwendet, um Testfälle und Testsuiten aus externen Quellen wie z. B. … abzurufen. Excel, .csv, .xml oder Datenbanktabellen.
Zum Lesen und Schreiben von Excel-Dateien stellt Apache die bekannte POI-Bibliothek bereit. Diese Bibliothek kann beides verarbeiten. XLS und XLSX Formate. Das HSSF Die Implementierung liest ältere XLS-Dateien, während die XSSF Die Implementierung verarbeitet moderne XLSX-Dateien.
Wir haben datengetriebenes Testen bereits in unserem vorheriges Tutorial.
Schlüsselwortgesteuertes Framework in Selenium
Schlüsselwortgesteuertes Framework in Selenium Diese Methode beschleunigt die Automatisierung, indem sie Schlüsselwörter für häufig verwendete Funktionen und Anweisungen trennt. Alle Operationen und Anweisungen werden in einer externen Datei, typischerweise einer Excel-Tabelle, gespeichert. Tester können die zu validierenden Funktionen festlegen, ohne die bestehende Datei zu verändern. Java Code, wodurch dieser Stil ideal für Teams ist, in denen Business-Analysten oder manuelle QA-Mitarbeiter Testdefinitionen beisteuern.
So sieht das vollständige Framework aus:
Wie Sie sehen, handelt es sich um ein 5-stufiges Modell. Lassen Sie uns dieses Schritt für Schritt im Detail betrachten.
Schritt 1)
- Das Treiberskript Execute.java ruft Read aufGuru99ExcelFile.java.
- Lesen Sie mehrGuruDie Datei 99ExcelFile.java enthält POI-Code, der Daten aus Excel liest.
Schritt 2)
- Lesen Sie mehrGuru99ExcelFile.java liest Daten aus TestCase.xlsx.
- So sieht das Datenblatt aus:
- Anhand der in der Excel-Datei enthaltenen Schlüsselwörter führt das Framework die entsprechende Aktion auf der Benutzeroberfläche aus.
- Um beispielsweise auf eine Schaltfläche mit der Bezeichnung „Anmelden“ zu klicken, speichert die Excel-Tabelle das Schlüsselwort „Klick“. Um die Anmeldeschaltfläche unter vielen auf einer Seite zu identifizieren, definiert die Excel-Zeile den Objektnamen als „loginButton“ und den Objekttyp als „Name“ (siehe die hervorgehobene Zeile im Bild). Der Objekttyp kann auch XPath, CSS, Klasse oder eine andere Lokalisierungsstrategie sein.
Schritt 3) Lesen Sie mehrGuru99ExcelFile.java übergibt die geparsten Daten zurück an das Treiberskript Execute.java.
Schritt 4)
- Für alle UI-Webelemente wird ein Objekt-Repository verwaltet, das Element-Locators wie XPath, Name, CSS oder Klassenname speichert.
- Execute.java (das Treiberskript) liest das gesamte Objekt-Repository und speichert es in einer Variablen.
- Eine Hilfsklasse namens ReadObject stellt eine Methode getObjectRepository bereit, die das Repository zur Laufzeit lädt.
Anmerkungen: Sie fragen sich vielleicht, warum ein Objekt-Repository erforderlich ist. Die Antwort lautet: Wartbarkeit. Wenn beispielsweise ein Button mit dem Namen „btnlogin“ in zehn Testfällen verwendet wird und der Entwickler ihn in „submit“ umbenennt, müssten Sie andernfalls zehn Dateien bearbeiten. Mit einem Objekt-Repository ändern Sie den Locator nur an einer Stelle.
Schritt 5)
- Der Treiber übergibt Daten aus Excel und dem Objektrepository an die Benutzeroberfläche.Operation Klasse.
- UIOperation enthält Funktionen, die jedes Schlüsselwort wie CLICK und SETTEXT einer konkreten WebDriver-Aktion zuordnen.
- UIOperation ist eine Java Klasse, die die eigentliche Implementierung für die Interaktion mit Webelementen enthält.
Die vollständige Projektstruktur sieht wie folgt aus:
Betrachten wir ein praktisches Beispiel:
Testszenario: Wir führen 2 Testfälle durch.
- Testfall 1:
- Gehe zu
https://demo.guru99.com/V4/ - Geben Sie die Benutzer-ID ein
- Passwort eingeben
- Klicken Sie auf Zurücksetzen
- Testfall 2:
- Gehe zu
https://demo.guru99.com/V4/ - Geben Sie die Benutzer-ID ein
- Passwort eingeben
- Klicken Sie auf Login
Objekteigenschaften
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
Lesen Sie mehrGuru99ExcelFile.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 File object to open the xlsx file
File file = new File(filePath + "\\" + fileName);
// Create a FileInputStream to read the Excel file
FileInputStream inputStream = new FileInputStream(file);
Workbook guru99Workbook = null;
// Detect the file extension
String fileExtensionName = fileName.substring(fileName.indexOf("."));
if (fileExtensionName.equals(".xlsx")) {
guru99Workbook = new XSSFWorkbook(inputStream);
} else if (fileExtensionName.equals(".xls")) {
guru99Workbook = new HSSFWorkbook(inputStream);
}
// Read the 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 the 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":
driver.findElement(this.getObject(p, objectName, objectType)).click();
break;
case "SETTEXT":
driver.findElement(this.getObject(p, objectName, objectType)).sendKeys(value);
break;
case "GOTOURL":
driver.get(p.getProperty(value));
break;
case "GETTEXT":
driver.findElement(this.getObject(p, objectName, objectType)).getText();
break;
default:
break;
}
}
private By getObject(Properties p, String objectName, String objectType) throws Exception {
if (objectType.equalsIgnoreCase("XPATH")) {
return By.xpath(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("CLASSNAME")) {
return By.className(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("NAME")) {
return By.name(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("CSS")) {
return By.cssSelector(p.getProperty(objectName));
} else if (objectType.equalsIgnoreCase("LINK")) {
return By.linkText(p.getProperty(objectName));
} 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 {
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 the number of rows in the Excel file
int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
for (int i = 1; i < rowCount + 1; i++) {
Row row = guru99Sheet.getRow(i);
if (row.getCell(0).toString().length() == 0) {
System.out.println(row.getCell(1).toString() + "----" + row.getCell(2).toString() + "----" +
row.getCell(3).toString() + "----" + row.getCell(4).toString());
operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
row.getCell(3).toString(), row.getCell(4).toString());
} else {
System.out.println("New Testcase->" + row.getCell(0).toString() + " Started");
}
}
}
}
Nach der Ausführung sieht die Ausgabe wie folgt aus:
Laden Sie Selenium Projektdateien für die Demo in diesem Tutorial
Hybridgesteuertes Framework
Hybridgesteuertes Framework in Selenium Es vereint die Stärken von Keyword-Driven- und Data-Driven-Frameworks. Es handelt sich um ein benutzerfreundliches Modell, das es manuellen Testern ermöglicht, Testfälle einfach durch Bearbeiten von Schlüsselwörtern, Testdaten und dem Objekt-Repository zu erstellen, ohne Framework-Code schreiben zu müssen.
Hierbei werden die Schlüsselwörter für jeden Schritt in Excel-Dateien gespeichert, und TestNG Datenanbieter liefert die Testdaten. Diese Aufteilung ermöglicht es Ihnen, sowohl das Aktionsvokabular als auch die Eingabevariationen unabhängig voneinander zu skalieren.
Für unser Hybrid-Framework ändert sich nichts an der schlüsselwortgesteuerten Struktur: Wir ersetzen einfach ExecuteTest.java durch HybridExecuteTest.java.
Diese HybridExecuteTest-Datei enthält die vollständige, schlüsselwortgesteuerte Logik in Kombination mit TestNGDatenanbietermechanismus von .
Die vollständige bildliche Darstellung des hybriden Rahmens sieht folgendermaßen aus:
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 {
if (testcaseName != null && testcaseName.length() != 0) {
webdriver = new FirefoxDriver();
}
ReadObject object = new ReadObject();
Properties allObjects = object.getObjectRepository();
UIOperation operation = new UIOperation(webdriver);
operation.perform(allObjects, keyword, objectName, objectType, value);
}
@DataProvider(name = "hybridData")
public Object[][] getDataFromDataprovider() throws IOException {
Object[][] object = null;
ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir") + "\\", "TestCase.xlsx", "KeywordFramework");
int rowCount = guru99Sheet.getLastRowNum() - guru99Sheet.getFirstRowNum();
object = new Object[rowCount][5];
for (int i = 0; i < rowCount; i++) {
Row row = guru99Sheet.getRow(i + 1);
for (int j = 0; j < row.getLastCellNum(); j++) {
object[i][j] = row.getCell(j).toString();
}
}
System.out.println("");
return object;
}
}
Laden Sie Selenium Projektdateien für die Demo in diesem Tutorial












