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.

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
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.
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:
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:
- 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.
- 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.
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.
Celรก struktura projektu vypadรก takto:
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:
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ลฏ.
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.
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:
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












