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.

  • Kernedefinition: A Selenium Framework er en struktureret kodearkitektur, der forbedrer genbrugelighed, portabilitet og vedligeholdelse af automatiserede testscripts.
  • 📊 Datadrevet implementering: Adskil testdata fra logik ved hjælp af Excel, CSV eller XML, og læs input via Apache POI (HSSF for XLS, XSSF for XLSX).
  • 🔑 Søgeordsdrevet design: Styr UI-handlinger via søgeordsark og objektlagre, så manuelle testere kan bygge cases uden at skulle skrive Java kode.
  • 🇧🇷 Hybridoptimering: Kombiner TestNG dataudbydere med nøgleordsudførelse for at opnå fleksibilitet, skalerbarhed og lavere omkostninger til scriptvedligeholdelse.
  • 🧩 Fordel ved objektarkiv: Centraliser lokatorer i en egenskabsfil, så elementændringer kun kræver opdatering af én placering på tværs af alle testcases.

Selenium Framework

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

Typer af Selenium Framework

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.

Datadrevet rammeværk i Selenium

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:

Keyword Driven Framework i Selenium

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:

Søgeordsdrevet rammeværk Excel-ark i Selenium

  • 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.

Objektlager i Keyword Driven Framework

  • 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.

ReadObject-hjælpeklasse til Keyword Driven Framework

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.

UIOperation-klasse i Keyword Driven Framework

Den komplette projektstruktur ser således ud:

Komplet projektstruktur for Keyword Driven Framework

Lad os se på et praktisk eksempel:

Testscenarie: Vi udfører 2 testcases.

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:

Udførelsesoutput for søgeordsdrevet rammeværk

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.

Hybrid Driven Framework-arkitektur

I vores hybride framework ændres der ikke noget i den nøgleordsdrevne struktur: vi erstatter blot ExecuteTest.java med HybridExecuteTest.java.

Udskiftning af Hybrid Driven Framework-komponenter

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:

Hybrid Driven Framework komplet repræsentation

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

Ofte Stillede Spørgsmål

Vælg Søgeordsdrevet, når manuelle testere skal bygge cases uden kodning. Vælg Datadrevet, når det samme script skal køre mod mange inputvariationer. Brug Hybrid, når du har brug for både datafleksibilitet og testforfatning på søgeordsniveau på samme tid.

Apache POI læser og skriver Excel-filer, der bruges som datakilde. HSSF håndterer ældre .xls-filer, mens XSSF behandler moderne .xlsx-filer. Sammen giver de dine testscripts mulighed for at hente dynamiske input fra regneark uden at hardcode data.

Et objektlager centraliserer elementlokaliseringspunkter såsom XPath, CSS eller navn. Hvis en udvikler omdøber et UI-kontrolelement, opdaterer du én post i stedet for hver testcase, hvilket dramatisk reducerer vedligeholdelsestiden og risikoen for defekte scripts.

AI forbedres Selenium rammeværk gennem selvreparerende lokaliseringsværktøjer, intelligent testprioritering og visuel validering. AI-motorer registrerer lokaliseringsdrift, anbefaler stabile selektorer og analyserer fejlmønstre, hvilket holder hybridpakker pålidelige, efterhånden som den applikation, der testes, udvikler sig.

Ja. Moderne AI-assistenter analyserer den applikation, der testes, og foreslår nøgleordsbiblioteker, eksempelinput og edge cases. Testere gennemgår og forfiner forslagene, hvilket fremskynder opsætningen af ​​frameworket, samtidig med at det holderping menneskeligt tilsyn med kritisk valideringslogik.

Opsummer dette indlæg med: