Selenium Kader: Data, Keyword & Hybride Driven
โก Slimme samenvatting
Selenium Frameworks: Data-, Keyword- en Hybrid-gedreven benaderingen bepalen hoe testers automatiseringscode organiseren, testdata scheiden en logica hergebruiken. Dit artikel legt elk frameworktype uit, de architectuur, de voordelen en hoe je ze stap voor stap kunt implementeren met praktische voorbeelden. Selenium Codevoorbeelden voor WebDriver.

Wat is Selenium Kader?
De Selenium automatiseringskader Een framework is een gestructureerde code-architectuur die het onderhoud van tests eenvoudig, schaalbaar en efficiรซnt maakt. Zonder een framework plaatsen testers code en data vaak op dezelfde plek, wat noch herbruikbaar noch leesbaar is. Het gebruik van een framework levert meetbare voordelen op, zoals een hogere herbruikbaarheid van code, betere portabiliteit, lagere kosten voor scriptonderhoud, verbeterde leesbaarheid en een duidelijkere scheiding van verantwoordelijkheden tussen testlogica en invoerdata.
Waarom een Selenium Automatiseringsframework?
Een goed ontworpen Selenium Het framework lost drie hardnekkige problemen in testautomatisering op: code duplicatie, kwetsbare locators en onbeheersbare testdata. Door een duidelijke structuur af te dwingen, kunnen teams hun testsuites schalen van een handvol scripts naar honderden zonder de controle te verliezen.
- Onderhoudbaarheid: Dankzij gecentraliseerde locators en hulpmethoden wordt met รฉรฉn enkele wijziging elke test die dat element gebruikt, bijgewerkt.
- Herbruikbaarheid: Algemene handelingen zoals inloggen, navigeren of formulieren invullen worden eenmalig geschreven en vervolgens in veel testgevallen aangeroepen.
- schaalbaarheid: Het toevoegen van nieuwe testgevallen wordt een data-update in plaats van een programmeertaak, waardoor ook niet-ontwikkelaars scenario's kunnen aandragen.
- Rapportage en samenwerking: Een gestandaardiseerde structuur maakt integratie met rapportagetools, CI/CD-pipelines en versiebeheer eenvoudiger.
Types van Selenium Kader
Er zijn drie primaire soorten frameworks gebouwd Selenium WebDriver wordt gebruikt om handmatig uitgevoerde testcases te automatiseren. Elke stijl streeft naar een andere balans tussen de inspanning van de ontwikkelaar, de betrokkenheid van de tester en de flexibiliteit van de data.
- Datagedreven raamwerk
- Zoekwoordgestuurd raamwerk
- Hybride gedreven raamwerk
In de volgende paragrafen wordt elk raamwerk in detail uitgelegd, beginnend met de eenvoudigste datagestuurde aanpak en doorlopend naar het meest flexibele hybride model.
Datagedreven raamwerk in Selenium
Datagedreven raamwerk in Selenium Het is een methode om testgegevenssets te scheiden van de testlogica. Zodra de gegevens zijn losgekoppeld, kunt u de invoer voor een bepaalde functionaliteit wijzigen zonder de testcode aan te raken. Het wordt vaak gebruikt om testgevallen en testsuites op te halen uit externe bronnen, zoals Excel, .csv, .xml of databasetabellen.
Om Excel-bestanden te lezen of te schrijven, biedt Apache de bekende POI-bibliotheek. Deze bibliotheek kan beide soorten bestanden verwerken. XLS en XLSX formaten. De HSSF De implementatie leest oudere XLS-bestanden, terwijl de XSSF De implementatie ondersteunt moderne XLSX-bestanden.
We hebben Data Driven Testing al behandeld in onze vorige zelfstudie.
Zoekwoordgestuurd raamwerk in Selenium
Zoekwoordgestuurd raamwerk in Selenium Dit is een methode die automatisering versnelt door trefwoorden voor veelgebruikte functies en instructies te scheiden. Alle bewerkingen en instructies worden in een extern bestand geschreven, meestal een Excel-spreadsheet. Testers kunnen de functionaliteiten die ze willen valideren specificeren zonder het bestand aan te passen. Java code, waardoor deze stijl ideaal is voor teams waar businessanalisten of handmatige QA-medewerkers testdefinities aandragen.
Zo ziet het complete framework eruit:
Zoals je ziet, is het een stappenplan van 5 stappen. Laten we het stap voor stap in detail bekijken.
Stap 1)
- Het driverscript Execute.java roept Read aan.Guru99ExcelFile.java.
- LeesGuru99ExcelFile.java bevat POI-code die gegevens uit Excel leest.
Stap 2)
- LeesGuru99ExcelFile.java leest gegevens uit TestCase.xlsx.
- Zo ziet het blad eruit:
- Op basis van de trefwoorden in het Excel-bestand voert het framework de bijbehorende actie uit in de gebruikersinterface.
- Om bijvoorbeeld op een knop met het label 'Inloggen' te klikken, slaat het Excel-bestand het trefwoord 'Klik' op. Om de inlogknop te identificeren tussen de vele knoppen op een pagina, definieert de Excel-rij de objectnaam als loginButton en het objecttype als naam (zie de gemarkeerde rij in de afbeelding). Het objecttype kan ook XPath, CSS, een klasse of een andere lokalisatiestrategie zijn.
Stap 3) LeesGuru99ExcelFile.java geeft de geparseerde gegevens terug aan het driverscript Execute.java.
Stap 4)
- Voor alle UI-webelementen beheert u een objectrepository waarin elementlocators zoals XPath, naam, CSS of klassenaam worden opgeslagen.
- Execute.java (het aansturende script) leest de volledige objectrepository en slaat deze op in een variabele.
- Een hulpklasse ReadObject biedt een getObjectRepository-methode aan waarmee de repository tijdens de uitvoering kan worden geladen.
NOTITIE: Je vraagt โโje misschien af โโwaarom een โโobjectrepository nodig is. Het antwoord is onderhoudbaarheid. Als een knop met de naam 'btnlogin' in 10 testgevallen wordt gebruikt en de ontwikkelaar deze hernoemt naar 'submit', zou je anders 10 bestanden moeten aanpassen. Met een objectrepository hoef je de locator maar op รฉรฉn plek te wijzigen.
Stap 5)
- De driver stuurt gegevens vanuit Excel en de objectrepository naar de gebruikersinterface.Operatie-klasse.
- UIOperaDe code bevat functies die elk trefwoord, zoals CLICK en SETTEXT, koppelen aan een concrete WebDriver-actie.
- UIOperatie is een Java Een klasse die de daadwerkelijke implementatie bevat voor interactie met webpagina-elementen.
De volledige projectstructuur ziet er als volgt uit:
Laten we een praktisch voorbeeld bekijken:
Testscenario: We voeren 2 testgevallen uit.
- Testgeval 1:
- Ga naar
https://demo.guru99.com/V4/ - Voer gebruikers-ID in
- Voer wachtwoord in
- Klik op Opnieuw instellen
- Testgeval 2:
- Ga naar
https://demo.guru99.com/V4/ - Voer gebruikers-ID in
- Voer wachtwoord in
- Klik op Inloggen
object.eigenschappen
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
LeesGuru99ExcelFile.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;
}
}
LeesObject.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;
}
}
UIOperatie.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");
}
}
}
VoerTest.java uit
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");
}
}
}
}
Na uitvoering ziet de uitvoer er als volgt uit:
Download de Selenium Projectbestanden voor de demo in deze zelfstudie
Hybride gedreven raamwerk
Hybride gedreven raamwerk in Selenium Het combineert de sterke punten van zowel keyword-driven als data-driven frameworks. Het is een gebruiksvriendelijk model waarmee handmatige testers testcases kunnen maken door simpelweg keywords, testdata en de objectrepository te bewerken, zonder frameworkcode te hoeven schrijven.
Hier bewaren Excel-bestanden de trefwoorden voor elke stap, en TestNG's data provider levert de testgegevens. Deze splitsing maakt het mogelijk om zowel de actievocabulaire als de inputvariaties onafhankelijk van elkaar te schalen.
Voor ons hybride framework verandert er niets aan de op trefwoorden gebaseerde structuur: we vervangen ExecuteTest.java simpelweg door HybridExecuteTest.java.
Dit HybridExecuteTest-bestand bevat de volledige, op trefwoorden gebaseerde logica, gecombineerd met TestNGhet dataverstrekkingsmechanisme van 's.
De volledige visuele weergave van het hybride raamwerk ziet er als volgt uit:
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;
}
}
Download de Selenium Projectbestanden voor de demo in deze zelfstudie












