Selenium Framework: Data, Keyword & Hybrid Driven

โšก Chytrรฉ shrnutรญ

Selenium Framework: Pล™รญstupy ล™รญzenรฉ daty, klรญฤovรฝmi slovy a hybridem definujรญ, jak testeล™i organizujรญ automatizaฤnรญ kรณd, oddฤ›lujรญ testovacรญ data a logiku opฤ›tovnรฉho pouลพitรญ. Tento ฤlรกnek vysvฤ›tluje kaลพdรฝ typ frameworku, jeho architekturu, vรฝhody a jak je krok za krokem implementovat s praktickรฝmi pokyny. Selenium Pล™รญklady kรณdu WebDriveru.

  • (Tj. Zรกkladnรญ definice: A Selenium Framework je architektura strukturovanรฉho kรณdu, kterรก zlepลกuje opฤ›tovnou pouลพitelnost, pล™enositelnost a รบdrลพbu automatizovanรฝch testovacรญch skriptลฏ.
  • ๐Ÿ“Š Implementace zaloลพenรก na datech: Oddฤ›lte testovacรญ data od logiky pomocรญ Excelu, CSV nebo XML a ฤtฤ›te vstupy prostล™ednictvรญm Apache POI (HSSF pro XLS, XSSF pro XLSX).
  • ๐Ÿ”‘ Design ล™รญzenรฝ klรญฤovรฝmi slovy: ล˜รญzenรญ akcรญ uลพivatelskรฉho rozhranรญ prostล™ednictvรญm listลฏ klรญฤovรฝch slov a repozitรกล™ลฏ objektลฏ, aby manuรกlnรญ testeล™i mohli vytvรกล™et pล™รญpady bez psanรญ Java kรณd.
  • โš™๏ธ Hybridnรญ optimalizace: Kombinovat TestNG poskytovatelรฉ dat s provรกdฤ›nรญm klรญฤovรฝch slov pro zรญskรกnรญ flexibility, ลกkรกlovatelnosti a niลพลกรญch reลพijnรญch nรกkladลฏ na รบdrลพbu skriptลฏ.
  • ๐Ÿงฉ Vรฝhody รบloลพiลกtฤ› objektลฏ: Centralizujte lokรกtory v souboru vlastnostรญ, aby zmฤ›ny prvkลฏ vyลพadovaly aktualizaci pouze jednoho umรญstฤ›nรญ napล™รญฤ vลกemi testovacรญmi pล™รญpady.

Selenium Rรกmec

Co je to Selenium Rรกmec?

Jedno Selenium automatizaฤnรญ rรกmec je strukturovanรก architektura kรณdu, kterรก zjednoduลกuje, ลกkรกluje a zefektivลˆuje รบdrลพbu testลฏ. Bez frameworku testeล™i ฤasto umisลฅujรญ kรณd a data na stejnรฉ mรญsto, kterรฉ nenรญ ani opakovanฤ› pouลพitelnรฉ, ani ฤitelnรฉ. Pล™ijetรญ frameworku pล™inรกลกรญ mฤ›ล™itelnรฉ vรฝhody, jako je vyลกลกรญ opakovanรก pouลพitelnost kรณdu, lepลกรญ pล™enositelnost, snรญลพenรฉ nรกklady na รบdrลพbu skriptลฏ, lepลกรญ ฤitelnost a jasnฤ›jลกรญ oddฤ›lenรญ odpovฤ›dnostรญ mezi testovacรญ logikou a vstupnรญmi daty.

Proฤ pouลพรญvat a Selenium Rรกmec pro automatizaci?

Dobล™e navrลพenรฝ Selenium Framework ล™eลกรญ tล™i pล™etrvรกvajรญcรญ problรฉmy v automatizaci testovรกnรญ: duplikaci kรณdu, kล™ehkรฉ lokรกtory a nezvlรกdnutelnรก testovacรญ data. Vynucenรญm jasnรฉ struktury mohou tรฝmy ลกkรกlovat svรฉ sady z hrstky skriptลฏ na stovky, aniลพ by ztratily kontrolu.

  • Udrลพitelnost: Centralizovanรฉ lokรกtory a pomocnรฉ metody znamenajรญ, ลพe jedna zmฤ›na aktualizuje kaลพdรฝ test, kterรฝ danรฝ prvek pouลพรญvรก.
  • Opฤ›tovnรก pouลพitelnost: Bฤ›ลพnรฉ operace, jako je pล™ihlรกลกenรญ, navigace nebo zadรกvรกnรญ formulรกล™ลฏ, se zapisujรญ jednou a volajรญ se v mnoha testovacรญch pล™รญpadech.
  • ล kรกlovatelnost: Pล™idรกvรกnรญ novรฝch testovacรญch pล™รญpadลฏ se stรกvรก spรญลกe aktualizacรญ dat neลพ kรณdovacรญm รบkolem, coลพ umoลพลˆuje pล™ispรญvat scรฉnรกล™i i tฤ›m, kteล™รญ nejsou vรฝvojรกล™i.
  • Reporting a spoluprรกce: Standardizovanรก struktura usnadลˆuje integraci s nรกstroji pro tvorbu reportลฏ, kanรกly CI/CD a sprรกvou verzรญ.

Druhy Selenium Rรกmec

Primรกrnรญ jsou tล™i typy rรกmcลฏ postaven na Selenium WebDriver pro automatizaci manuรกlnรญch testovacรญch pล™รญpadลฏ. Kaลพdรฝ styl se zamฤ›ล™uje na jinou rovnovรกhu mezi รบsilรญm vรฝvojรกล™e, zapojenรญm testerลฏ a flexibilitou dat.

  • Data Driven Framework
  • Framework ล™รญzenรฝ klรญฤovรฝmi slovy
  • Hybrid Driven Framework

Druhy Selenium Rรกmec

V nรกsledujรญcรญch ฤรกstech jsou jednotlivรฉ frameworky podrobnฤ› vysvฤ›tleny, poฤรญnaje nejjednoduลกลกรญm datovฤ› ล™รญzenรฝm pล™รญstupem a postupnฤ› aลพ k nejflexibilnฤ›jลกรญmu hybridnรญmu modelu.

Data Driven Framework v Selenium

Data Driven Framework v Selenium je metoda oddฤ›lenรญ testovacรญch datovรฝch sad od logiky testovacรญho pล™รญpadu. Jakmile jsou data oddฤ›lena, mลฏลพete upravovat vstupy pro konkrรฉtnรญ funkci, aniลพ byste se museli dotรฝkat testovacรญho kรณdu. Bฤ›ลพnฤ› se pouลพรญvรก k naฤรญtรกnรญ testovacรญch pล™รญpadลฏ a sad z externรญch zdrojลฏ, jako jsou vynikat, .csv, .xml nebo databรกzovรฉ tabulky.

Data Driven Framework v Selenium

Pro ฤtenรญ a zรกpis souborลฏ Excel nabรญzรญ Apache znรกmou knihovnu POI. Tato knihovna zvlรกdรก jak XLS a XLSX formรกty. HSSF implementace ฤte starลกรญ soubory XLS, zatรญmco XSSF implementace zpracovรกvรก modernรญ soubory XLSX.

Testovรกnรญ ล™รญzenรฉ daty jsme jiลพ probrali v naลกem pล™edchozรญ tutoriรกl.

Keyword Driven Framework in Selenium

Keyword Driven Framework in Selenium je metoda, kterรก urychluje automatizaci oddฤ›lenรญm klรญฤovรฝch slov pro bฤ›ลพnรฉ funkce a instrukce. Vลกechny operace a instrukce jsou zapsรกny v externรญm souboru, obvykle v tabulce aplikace Excel. Testeล™i mohou specifikovat funkce, kterรฉ chtฤ›jรญ ovฤ›ล™it, aniลพ by je museli upravovat. Java kรณd, coลพ z nฤ›j dฤ›lรก ideรกlnรญ styl pro tรฝmy, kde obchodnรญ analytici nebo manuรกlnรญ QA pล™ispรญvajรญ definicemi testลฏ.

Zde je obrรกzek, jak vypadรก kompletnรญ rรกmec:

Keyword Driven Framework in Selenium

Jak vidรญte, jednรก se o 5krokovรฝ rรกmec. Pojฤme si ho podrobnฤ› prozkoumat postupnฤ›.

Krok 1)

  • Skript ovladaฤe Execute.java volรก ReadGuru99ExcelFile.java.
  • ฤรญstGuruSoubor 99ExcelFile.java obsahuje kรณd POI, kterรฝ ฤte data z Excelu.

Krok 2)

  • ฤรญstGuru99ExcelFile.java ฤte data ze souboru TestCase.xlsx.
  • Takhle vypadรก list:

Excelovรก tabulka rรกmce ล™รญzenรฉho klรญฤovรฝmi slovy v Selenium

  • Na zรกkladฤ› klรญฤovรฝch slov zapsanรฝch v souboru aplikace Excel provede framework odpovรญdajรญcรญ akci v uลพivatelskรฉm rozhranรญ.
  • Napล™รญklad pro kliknutรญ na tlaฤรญtko s oznaฤenรญm โ€žPล™ihlรกsit seโ€œ uloลพรญ excelovรฝ list klรญฤovรฉ slovo โ€žKliknoutโ€œ. Pro identifikaci tlaฤรญtka Pล™ihlรกsit mezi mnoha dalลกรญmi na strรกnce definuje ล™รกdek Excelu Nรกzev objektu jako loginButton a Typ objektu jako name (viz zvรฝraznฤ›nรฝ ล™รกdek na obrรกzku). Typ objektu mลฏลพe bรฝt takรฉ XPath, CSS, tล™รญda nebo jakรกkoli jinรก strategie lokace.

Krok 3) ฤรญstGuru99ExcelFile.java pล™edรกvรก analyzovanรก data zpฤ›t do skriptu ovladaฤe Execute.java.

Krok 4)

  • Pro vลกechny webovรฉ prvky uลพivatelskรฉho rozhranรญ udrลพujete รบloลพiลกtฤ› objektลฏ, kterรฉ uklรกdรก lokรกtory prvkลฏ, jako je XPath, nรกzev, CSS nebo nรกzev tล™รญdy.

รšloลพiลกtฤ› objektลฏ v frameworku ล™รญzenรฉm klรญฤovรฝmi slovy

  • Soubor Execute.java (skript ovladaฤe) naฤte celรฝ objektovรฝ repozitรกล™ a uloลพรญ jej do promฤ›nnรฉ.
  • Pomocnรก tล™รญda ReadObject zpล™รญstupลˆuje metodu getObjectRepository, kterรก naฤรญtรก repozitรกล™ za bฤ›hu.

Pomocnรก tล™รญda ReadObject pro framework ล™รญzenรฝ klรญฤovรฝmi slovy

POZNรMKA: Moลพnรก vรกs zajรญmรก, proฤ je potล™eba objektovรฝ repozitรกล™. Odpovฤ›dรญ je udrลพovatelnost. Pokud je tlaฤรญtko s nรกzvem btnlogin pouลพito v 10 testovacรญch pล™รญpadech a vรฝvojรกล™ ho pล™ejmenuje na โ€žsubmitโ€œ, jinak byste upravili 10 souborลฏ. U objektovรฉho repozitรกล™e zmฤ›nรญte lokรกtor na jednom mรญstฤ›.

Krok 5)

  • Ovladaฤ pล™edรกvรก data z Excelu a รบloลพiลกtฤ› objektลฏ do uลพivatelskรฉho rozhranรญ.Operatล™รญda.
  • UIOperation obsahuje funkce, kterรฉ mapujรญ kaลพdรฉ klรญฤovรฉ slovo, jako napล™รญklad CLICK a SETTEXT, na konkrรฉtnรญ akci WebDriveru.
  • UIOperace je a Java tล™รญda, kterรก obsahuje skuteฤnou implementaci pro interakci s webovรฝmi prvky.

UIOperatล™รญda tion v rรกmci Keyword Driven Framework

Celรก struktura projektu vypadรก takto:

Kompletnรญ struktura projektu frameworku ล™รญzenรฉho klรญฤovรฝmi slovy

Podรญvejme se na praktickรฝ pล™รญklad:

Scรฉnรกล™ testu: Provรกdรญme 2 testovacรญ pล™รญpady.

  • Testovacรญ pล™รญpad 1:
  • Jรญt https://demo.guru99.com/V4/
  • Zadejte ID uลพivatele
  • Zadejte heslo
  • Kliknฤ›te na Resetovat
  • Testovacรญ pล™รญpad 2:
  • Jรญt https://demo.guru99.com/V4/
  • Zadejte ID uลพivatele
  • Zadejte heslo
  • Kliknฤ›te na Pล™ihlรกsit

objekt.vlastnosti

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

ฤรญstGuru99ExcelFile.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");
            }
        }
    }
}

Po provedenรญ vypadรก vรฝstup takto:

Vรฝstup provedenรญ rรกmce ล™รญzenรฉho klรญฤovรฝmi slovy

stรกhnฤ›te Selenium Soubory projektu pro ukรกzku v tomto kurzu

Hybrid Driven Framework

Hybrid Driven Framework in Selenium kombinuje silnรฉ strรกnky frameworkลฏ ล™รญzenรฝch klรญฤovรฝmi slovy (Keyword Driven) a Data Driven. Jednรก se o snadno pouลพitelnรฝ model, kterรฝ umoลพลˆuje manuรกlnรญm testerลฏm vytvรกล™et testovacรญ pล™รญpady pouhou รบpravou klรญฤovรฝch slov, testovacรญch dat a objektovรฉho repozitรกล™e, aniลพ by bylo nutnรฉ psรกt jakรฝkoli kรณd frameworku.

Zde soubory aplikace Excel uchovรกvajรญ klรญฤovรก slova pro kaลพdรฝ krok a TestNGJe poskytovatel dat dodรกvรก testovacรญ data. Toto rozdฤ›lenรญ umoลพลˆuje nezรกvisle ลกkรกlovat slovnรญk akcรญ i variace vstupลฏ.

Architektura hybridnรญho ล™รญzenรฉho rรกmce

V naลกem hybridnรญm frameworku se ve struktuล™e ล™รญzenรฉ klรญฤovรฝmi slovy nic nemฤ›nรญ: jednoduลกe nahradรญme ExecuteTest.java souborem HybridExecuteTest.java.

Vรฝmฤ›na komponenty hybridnรญho ล™รญzenรฉho rรกmce

Tento soubor HybridExecuteTest obsahuje kompletnรญ logiku ล™รญzenou klรญฤovรฝmi slovy v kombinaci s TestNGmechanismus poskytovatele dat.

Kompletnรญ obrazovรฉ znรกzornฤ›nรญ hybridnรญho rรกmce vypadรก takto:

Kompletnรญ reprezentace hybridnรญho ล™รญzenรฉho rรกmce

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

stรกhnฤ›te Selenium Soubory projektu pro ukรกzku v tomto kurzu

Nejฤastฤ›jลกรญ dotazy

Volbu โ€žล˜รญzenรฉ klรญฤovรฝmi slovyโ€œ zvolte, pokud manuรกlnรญ testeล™i potล™ebujรญ vytvรกล™et pล™รญpady bez kรณdovรกnรญ. Volbu โ€žล˜รญzenรฉ datyโ€œ zvolte, pokud musรญ stejnรฝ skript bฤ›ลพet s mnoha variantami vstupลฏ. Hybridnรญ variantu pouลพijte, pokud poลพadujete souฤasnฤ› flexibilitu dat a tvorbu testลฏ na รบrovni klรญฤovรฝch slov.

Apache POI ฤte a zapisuje soubory Excelu pouลพรญvanรฉ jako zdroj dat. HSSF zpracovรกvรก starลกรญ soubory .xls, zatรญmco XSSF zpracovรกvรก modernรญ soubory .xlsx. Spoleฤnฤ› umoลพลˆujรญ testovacรญm skriptลฏm naฤรญtat dynamickรฉ vstupy z tabulek bez nutnosti pevnรฉho kรณdovรกnรญ dat.

Objektovรฝ repozitรกล™ centralizuje lokรกtory prvkลฏ, jako je XPath, CSS nebo nรกzev. Pokud vรฝvojรกล™ pล™ejmenuje ovlรกdacรญ prvek uลพivatelskรฉho rozhranรญ, aktualizuje se jeden zรกznam, nikoli kaลพdรฝ testovacรญ pล™รญpad, coลพ dramaticky sniลพuje dobu รบdrลพby a riziko poลกkozenรฝch skriptลฏ.

AI se zlepลกuje Selenium frameworky pomocรญ samoopravnรฝch lokรกtorลฏ, inteligentnรญ prioritizace testลฏ a vizuรกlnรญ validace. Enginey umฤ›lรฉ inteligence detekujรญ posun lokรกtoru, doporuฤujรญ stabilnรญ selektory a analyzujรญ vzorce selhรกnรญ, coลพ udrลพuje hybridnรญ sady spolehlivรฉ s vรฝvojem testovanรฉ aplikace.

Ano. Modernรญ asistenti umฤ›lรฉ inteligence analyzujรญ testovanou aplikaci a navrhujรญ knihovny klรญฤovรฝch slov, vzorovรฉ vstupy a hraniฤnรญ pล™รญpady. Testeล™i nรกvrhy kontrolujรญ a vylepลกujรญ, coลพ urychluje nastavenรญ frameworku a zรกroveลˆ zachovรกvรก...ping lidskรฝ dohled nad logikou kritickรฉho ovฤ›ล™ovรกnรญ.

Shrลˆte tento pล™รญspฤ›vek takto: