Selenium Ramme: Data, søgeord og hybriddrevet
⚡ Smart opsummering
Selenium Framework: Data-, nøgleords- og hybriddrevne tilgange definerer, hvordan testere organiserer automatiseringskode, adskiller testdata og genbruger logik. Denne artikel forklarer hver frameworktype, dens arkitektur, fordele og hvordan man implementerer dem trin for trin med praktiske redskaber. Selenium Eksempler på WebDriver-kode.

Hvad er Selenium Ramme?
Selenium automatiseringsramme er en struktureret kodearkitektur, der gør testvedligeholdelse enkel, skalerbar og effektiv. Uden et framework placerer testere ofte kode og data på samme sted, hvilket hverken er genbrugeligt eller læsbart. Ved at implementere et framework opnås målbare fordele såsom højere kodegenbrugelighed, bedre portabilitet, reducerede omkostninger til scriptvedligeholdelse, forbedret læsbarhed og en klarere adskillelse af hensyn til testlogik og inputdata.
Hvorfor bruge en Selenium Automatiseringsramme?
Et godt designet Selenium Frameworket løser tre vedvarende problemer inden for testautomatisering: dobbeltarbejde med kode, skrøbelige lokaliseringspunkter og uhåndterlige testdata. Ved at håndhæve en klar struktur kan teams skalere deres suiter fra en håndfuld scripts til hundredvis uden at miste kontrollen.
- Vedligeholdelse: Centraliserede lokaliserings- og hjælpemetoder betyder, at en enkelt ændring opdaterer hver test, der bruger det pågældende element.
- Genanvendelighed: Almindelige handlinger såsom login, navigation eller formularindtastning skrives én gang og kaldes på tværs af mange testcases.
- Skalerbarhed: Tilføjelse af nye testcases bliver en dataopdatering snarere end en kodningsopgave, hvilket giver ikke-udviklere mulighed for at bidrage med scenarier.
- Rapportering og samarbejde: Standardiseret struktur gør det nemmere at integrere med rapporteringsværktøjer, CI/CD-pipelines og versionskontrol.
Typer af Selenium Framework
Der er tre primære typer af rammer bygget på Selenium WebDriver til automatisering af manuelle testcases. Hver stil sigter mod en forskellig balance mellem udviklerindsats, testerinvolvering og datafleksibilitet.
- Datadrevet rammeværk
- Søgeordsdrevet rammeværk
- Hybriddrevet rammeværk
De næste afsnit forklarer hvert framework i detaljer, startende med den enkleste datadrevne tilgang og videre til den mest fleksible hybridmodel.
Datadrevet rammeværk i Selenium
Datadrevet rammeværk i Selenium er en metode til at adskille testdatasæt fra testcase-logikken. Når dataene er afkoblet, kan du ændre input for en bestemt funktionalitet uden at røre testkoden. Det bruges almindeligvis til at hente testcases og -pakker fra eksterne kilder som f.eks. Excel, .csv, .xml eller databasetabeller.
For at læse eller skrive Excel-filer stiller Apache det velkendte POI-bibliotek til rådighed. Dette bibliotek kan håndtere begge dele XLS og XLSX formater. De HSSF implementeringen læser ældre XLS-filer, mens XSSF Implementeringen håndterer moderne XLSX-filer.
Vi har allerede dækket datadrevet testning i vores tidligere vejledning.
Keyword Driven Framework i Selenium
Keyword Driven Framework i Selenium er en metode, der accelererer automatisering ved at adskille nøgleord for almindelige funktioner og instruktioner. Alle operationer og instruktioner skrives i en ekstern fil, typisk et Excel-ark. Testere kan angive de funktionaliteter, de ønsker at validere, uden at ændre. Java kode, hvilket gør denne stil ideel til teams, hvor forretningsanalytikere eller manuel QA bidrager med testdefinitioner.
Sådan ser det komplette rammeværk ud:
Som du kan se, er det en ramme i 5 trin. Lad os studere den trin for trin i detaljer.
Trin 1)
- Driverscriptet Execute.java kalder ReadGuru99Excel-fil.java.
- LæsGuru99ExcelFile.java indeholder POI-kode, der læser data fra Excel.
Trin 2)
- LæsGuru99ExcelFile.java læser data fra TestCase.xlsx.
- Sådan ser arket ud:
- Baseret på de nøgleord, der er skrevet i Excel-filen, udfører frameworket den tilsvarende handling på brugergrænsefladen.
- Hvis du for eksempel klikker på en knap mærket "Login", gemmer Excel-arket nøgleordet "Klik". For at identificere Login-knappen blandt mange på en side definerer Excel-rækken Objektnavn som loginButton og Objekttype som navn (se den fremhævede række på billedet). Objekttypen kan også være XPath, CSS, klasse eller enhver anden lokaliseringsstrategi.
Trin 3) LæsGuru99ExcelFile.java sender de parsede data tilbage til driverscriptet Execute.java.
Trin 4)
- For alle UI-webelementer vedligeholder du et objektlager, der gemmer elementlokaliseringspunkter såsom XPath, navn, CSS eller klassenavn.
- Execute.java (driverscriptet) læser hele objektarkivet og gemmer det i en variabel.
- En hjælperklasse ReadObject eksponerer en getObjectRepository-metode, der indlæser repositoryet under kørsel.
BEMÆRK VENLIGST: Du undrer dig måske over, hvorfor et objektlager er nødvendigt. Svaret er vedligeholdelsesvenlighed. Hvis en knap med navn = btnlogin bruges i 10 testcases, og udvikleren omdøber den til submit, ville du ellers redigere 10 filer. Med et objektlager ændrer du locatoren ét sted.
Trin 5)
- Driveren sender data fra Excel og objektarkivet til brugergrænsefladenOperation klasse.
- UIOperation indeholder funktioner, der knytter hvert nøgleord, f.eks. CLICK og SETTEXT, til en konkret WebDriver-handling.
- UIOperation er en Java klasse, der indeholder den virkelige implementering til interaktion med webelementer.
Den komplette projektstruktur ser således ud:
Lad os se på et praktisk eksempel:
Testscenarie: Vi udfører 2 testcases.
- Testcase 1:
- Gå til
https://demo.guru99.com/V4/ - Indtast bruger-id
- Indtast adgangskode
- Klik på Nulstil
- Testcase 2:
- Gå til
https://demo.guru99.com/V4/ - Indtast bruger-id
- Indtast adgangskode
- Klik på Login
objekt.egenskaber
url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset
LæsGuru99ExcelFile.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");
}
}
}
}
Efter udførelse ser outputtet således ud:
Download Selenium Projektfiler til demoen i denne vejledning
Hybriddrevet rammeværk
Hybriddrevet rammeværk in Selenium kombinerer styrkerne ved både Keyword Driven og Data Driven frameworks. Det er en brugervenlig model, der giver manuelle testere mulighed for at oprette testcases ved blot at redigere nøgleord, testdata og objektarkivet uden at skulle skrive nogen framework-kode.
Her vedligeholder Excel-filer nøgleordene for hvert trin, og TestNG's dataudbyder leverer testdataene. Denne opdeling giver dig mulighed for at skalere både handlingsvokabularet og inputvariationerne uafhængigt.
I vores hybride framework ændres der ikke noget i den nøgleordsdrevne struktur: vi erstatter blot ExecuteTest.java med HybridExecuteTest.java.
Denne HybridExecuteTest-fil indeholder den fulde nøgleordsdrevne logik kombineret med TestNGs dataleverandørmekanisme.
Den komplette billedlige repræsentation af hybridframeworket ser sådan 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 {
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 Selenium Projektfiler til demoen i denne vejledning












