Selenium Raamistik: andmete, märksõnade ja hübriidpõhine

⚡ Nutikas kokkuvõte

Selenium Raamistik: andme-, märksõna- ja hübriidpõhised lähenemisviisid määratlevad, kuidas testijad korraldavad automatiseerimiskoodi, eraldavad testiandmeid ja taaskasutavad loogikat. See artikkel selgitab iga raamistiku tüüpi, selle arhitektuuri, eeliseid ja seda, kuidas neid samm-sammult praktiliste juhistega rakendada. Selenium WebDriveri koodi näited.

  • Põhidefinitsioon: A Selenium raamistik on struktureeritud koodiarhitektuur, mis parandab automatiseeritud testiskriptide korduvkasutatavust, kaasaskantavust ja hooldust.
  • 📊 Andmepõhine rakendamine: Eralda testandmed loogikast Exceli, CSV või XML-i abil ja loe sisendeid Apache POI kaudu (HSSF XLS-i jaoks, XSSF XLSX-i jaoks).
  • 🔑 Märksõnapõhine disain: Juhtige kasutajaliidese toiminguid märksõnalehtede ja objektihoidlate kaudu, et käsitsi testijad saaksid luua juhtumeid ilma kirjutamata Java kood.
  • ⚙️ Hübriidoptimeerimine: Ühendama TestNG märksõnade täitmisega andmepakkujad, et saavutada paindlikkus, skaleeritavus ja vähendada skriptide hoolduskulusid.
  • 🧩 Objektihoidla eelis: Tsentraliseeri lokaatorid omaduste faili, et elementide muudatused nõuaksid kõigis testides ainult ühe asukoha värskendamist.

Selenium Raamistik

Mis on Selenium Raamistik?

. Selenium automatiseerimise raamistik on struktureeritud koodiarhitektuur, mis muudab testide haldamise lihtsaks, skaleeritavaks ja tõhusaks. Ilma raamistikuta paigutavad testijad koodi ja andmed sageli samasse kohta, mis ei ole ei korduvkasutatav ega loetav. Raamistiku kasutuselevõtt pakub mõõdetavaid eeliseid, nagu suurem koodi korduvkasutatavus, parem kaasaskantavus, väiksemad skriptide hoolduskulud, parem loetavus ja selgem eristamine testiloogika ja sisendandmete vahel.

Miks kasutada a Selenium Automatiseerimisraamistik?

Hästi kujundatud Selenium raamistik lahendab testide automatiseerimisel kolm püsivat probleemi: koodi dubleerimine, haprad lokaatorid ja raskesti hallatavad testiandmed. Selge struktuuri jõustamisega saavad meeskonnad oma skriptide arvu suurendada käputäiest kuni sadade skriptideni, kaotamata seejuures kontrolli.

  • Hooldatavus: Tsentraliseeritud lokaatorid ja abimeetodid tähendavad, et üks muudatus uuendab iga testi, mis seda elementi kasutab.
  • Korduvkasutatavus: Levinud toimingud, nagu sisselogimine, navigeerimine või vormile sisestamine, kirjutatakse üks kord ja neid kutsutakse esile paljude testide puhul.
  • Skaalautuvuus: Uute testijuhtumite lisamine muutub pigem andmete värskendamiseks kui kodeerimisülesandeks, mis võimaldab mitte-arendajatel stsenaariumide loomisega panustada.
  • Aruandlus ja koostöö: Standardiseeritud struktuur lihtsustab integreerimist aruandlustööriistade, CI/CD torujuhtmete ja versioonikontrolliga.

Tüübid Selenium Raamistik

Põhilisi on kolm raamistike tüübid ehitatud Selenium WebDriver käsitsi testide automatiseerimiseks. Iga stiil on suunatud erinevale tasakaalule arendaja pingutuse, testija kaasamise ja andmete paindlikkuse vahel.

  • Andmepõhine raamistik
  • Märksõnapõhine raamistik
  • Hübriidajamiga raamistik

Tüübid Selenium Raamistik

Järgmistes osades selgitatakse iga raamistikku üksikasjalikult, alustades lihtsamast andmepõhisest lähenemisviisist ja liikudes edasi kõige paindlikuma hübriidmudelini.

Andmepõhine raamistik sisse Selenium

Andmepõhine raamistik sisse Selenium on meetod testandmekogumite eraldamiseks testjuhtumi loogikast. Kui andmed on lahti ühendatud, saate konkreetse funktsionaalsuse sisendeid muuta ilma testkoodi puutumata. Seda kasutatakse tavaliselt testide ja testikomplektide toomiseks välistest allikatest, näiteks Excel, .csv, .xml või andmebaasitabelid.

Andmepõhine raamistik sisse Selenium

Exceli failide lugemiseks või kirjutamiseks pakub Apache tuntud POI teeki. See teek saab hakkama nii XLS ja XLSX formaadid. See HSSF rakendus loeb pärand-XLS-faile, samas kui XSSF implementatsioon haldab kaasaegseid XLSX-faile.

Andmepõhise testimise kohta oleme juba kirjutanud eelmine juhendaja.

Märksõnapõhine raamistik sisse Selenium

Märksõnapõhine raamistik sisse Selenium on meetod, mis kiirendab automatiseerimist, eraldades märksõnad tavaliste funktsioonide ja juhiste jaoks. Kõik toimingud ja juhised kirjutatakse välisesse faili, tavaliselt Exceli tabelisse. Testijad saavad määrata funktsionaalsused, mida nad soovivad valideerida, ilma neid muutmata. Java kood, mis teeb selle stiili ideaalseks meeskondadele, kus ärianalüütikud või käsitsi kvaliteedikontrollijad panustavad testidefinitsioonidesse.

Nii näeb välja täielik raamistik:

Märksõnapõhine raamistik sisse Selenium

Nagu näete, on see viieastmeline raamistik. Uurime seda samm-sammult üksikasjalikumalt.

Step 1)

  • Draiveri skript Execute.java kutsub ReadGuru99ExcelFile.java.
  • LugenudGuru99ExcelFile.java sisaldab POI-koodi, mis loeb andmeid Excelist.

Step 2)

  • LugenudGuru99ExcelFile.java loeb andmeid failist TestCase.xlsx.
  • Nii näeb leht välja:

Märksõnapõhise raamistiku Exceli tabel Selenium

  • Exceli faili kirjutatud märksõnade põhjal teeb raamistik kasutajaliideses vastava toimingu.
  • Näiteks nupu „Logi sisse“ klõpsamiseks salvestab Exceli tabel märksõna „Klõps“. Lehel paljude sisselogimisnuppude hulgast sisselogimisnupu tuvastamiseks määratleb Exceli rida objekti nimeks loginButton ja objekti tüübiks nimena (vt pildil esiletõstetud rida). Objekti tüüp võib olla ka XPath, CSS, klass või mis tahes muu lokaliseerimisstrateegia.

Step 3) LugenudGuru99ExcelFile.java edastab parsitud andmed tagasi draiveriskriptile Execute.java.

Step 4)

  • Kõigi kasutajaliidese veebielementide jaoks haldate objektihoidlat, mis salvestab elementide lokaatoreid, näiteks XPath, nimi, CSS või klassi nimi.

Objektihoidla märksõnapõhises raamistikus

  • Execute.java (draiveriskript) loeb kogu objektihoidla ja salvestab selle muutujasse.
  • Abiklass ReadObject avaldab meetodi getObjectRepository, mis laadib repositooriumi käitusajal.

Märksõnapõhise raamistiku ReadObject abiklass

MÄRKUS: Võite mõelda, miks on vaja objektihoidlat. Vastus peitub hooldatavuses. Kui 10 testijuhtumis kasutatakse nuppu nimega btnlogin ja arendaja nimetab selle ümber esitamiseks, siis muudaksite muidu 10 faili. Objektihoidla puhul muudate lokaatorit ühes kohas.

Step 5)

  • Draiver edastab andmed Excelist ja objektihoidlast kasutajaliidesele.Operatsiooniklass.
  • UIOperation sisaldab funktsioone, mis seovad iga märksõna, näiteks CLICK ja SETTEXT, konkreetse WebDriveri toiminguga.
  • UIOperatsioon on a Java klass, mis sisaldab veebielementidega suhtlemise tegelikku implementatsiooni.

UIOperation klass märksõnapõhises raamistikus

Projekti täielik struktuur näeb välja selline:

Märksõnapõhise raamistiku täielik projekti struktuur

Vaatame praktilist näidet:

Testi stsenaarium: Me viime läbi 2 testi.

objekt.omadused

url=https://demo.guru99.com/V4/
username=uid
password=password
title=barone
loginButton=btnLogin
resetButton=btnReset

LugenudGuru99ExcelFile.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");
            }
        }
    }
}

Pärast käivitamist näeb väljund välja selline:

Märksõnapõhise raamistiku täitmise väljund

Lae alla Selenium Selle õpetuse demo projektifailid

Hübriidajamiga raamistik

Hübriidajamiga raamistik in Selenium ühendab endas nii märksõnapõhiste kui ka andmepõhiste raamistike tugevused. See on hõlpsasti kasutatav mudel, mis võimaldab käsitsi testijatel luua testjuhtumeid lihtsalt märksõnade, testiandmete ja objektihoidla redigeerimise teel, ilma raamistiku koodi kirjutamata.

Siin säilitavad Exceli failid iga sammu märksõnu ja TestNG'S andmeedastaja annab testandmed. See jaotus võimaldab teil nii toimingute sõnavara kui ka sisendvariatsioone eraldi skaleerida.

Hübriidse juhitava raamistiku arhitektuur

Meie hübriidraamistiku puhul ei muutu märksõnapõhises struktuuris midagi: me lihtsalt asendame ExecuteTest.java failiga HybridExecuteTest.java.

Hübriidse juhitava raamistiku komponentide asendamine

See HybridExecuteTesti fail sisaldab täielikku märksõnapõhist loogikat koos järgmisega: TestNGandmepakkuja mehhanism.

Hübriidraamistiku täielik pildiline esitus näeb välja selline:

Hübriidse juhitava raamistiku täielik esitus

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;
    }
}

Lae alla Selenium Selle õpetuse demo projektifailid

KKK

Valige märksõnapõhine test, kui käsitsi testijad peavad juhtumeid looma ilma kodeerimata. Valige andmepõhine test, kui sama skript peab töötama paljude sisendvariatsioonide korral. Kasutage hübriidtesti, kui vajate samaaegselt nii andmete paindlikkust kui ka märksõnatasemel testide loomist.

Apache POI loeb ja kirjutab andmeallikana kasutatavaid Exceli faile. HSSF töötleb vanemaid .xls-faile, samas kui XSSF töötleb moodsaid .xlsx-faile. Koos võimaldavad need teie testiskriptidel arvutustabelitest dünaamilisi sisendeid hankida ilma andmeid kõvakodeerimata.

Objektihoidla koondab elementide lokaatorid, näiteks XPath, CSS või nimi. Kui arendaja muudab kasutajaliidese juhtelemendi nime, uuendatakse üks kirje iga testi asemel, mis vähendab oluliselt hooldusaega ja vigaste skriptide ohtu.

Tehisintellekt paraneb Selenium raamistikke isetervenevate lokaatorite, intelligentse testiprioriseerimise ja visuaalse valideerimise abil. Tehisintellekti mootorid tuvastavad lokaatori triivi, soovitavad stabiilseid selektoreid ja analüüsivad rikkemustreid, mis hoiab hübriidpaketid testitava rakenduse arenedes töökindlana.

Jah. Kaasaegsed tehisintellekti assistendid analüüsivad testitavat rakendust ja pakuvad välja märksõnateeke, näidissisendeid ja äärmusjuhtumeid. Testijad vaatavad soovitused üle ja täpsustavad neid, mis kiirendab raamistiku seadistamist, hoides samal ajalping inimese järelevalve kriitilise valideerimisloogika üle.

Võta see postitus kokku järgmiselt: