Selenium Framework: Data, Keyword & Hybrid Driven
Co je to Selenium Rรกmec?
Jedno Selenium automatizaฤnรญ rรกmec je struktura kรณdu, kterรก usnadลuje a zefektivลuje รบdrลพbu kรณdu. Bez rรกmcลฏ mohou uลพivatelรฉ umรญstit โkรณdโ a โdataโ na stejnรฉ mรญsto, kterรฉ nenรญ znovu pouลพitelnรฉ ani ฤitelnรฉ. Frameworky pลinรกลกejรญ pลรญznivรฉ vรฝsledky, jako je zvรฝลกenรก znovupouลพitelnost kรณdu, vyลกลกรญ pลenositelnost, niลพลกรญ nรกklady na รบdrลพbu skriptลฏ, lepลกรญ ฤitelnost kรณdu atd.
Druhy Selenium Rรกmec
Jsou pลedevลกรญm tลi typ rรกmcลฏ vytvoลil Selenium WebDriver pro automatizaci manuรกlnรญch testovacรญch pลรญpadลฏ
- Data Driven Framework
- Framework ลรญzenรฝ klรญฤovรฝmi slovy
- Hybrid Driven Framework
Data Driven Framework v Selenium
Data Driven Framework v Selenium je metoda oddฤlenรญ datovรฝch sad od testovacรญho pลรญpadu. Jakmile jsou datovรฉ sady oddฤleny od testovacรญho pลรญpadu, lze je snadno upravit pro konkrรฉtnรญ funkce bez zmฤny kรณdu. Pouลพรญvรก se k naฤรญtรกnรญ testovacรญch pลรญpadลฏ a sad z externรญch souborลฏ jako vynikat, .csv, .xml nebo nฤkterรฉ databรกzovรฉ tabulky.
Pro ฤtenรญ nebo psanรญ Excelu poskytuje Apache velmi slavnou knihovnu POI. Tato knihovna je dostateฤnฤ schopnรก ฤรญst i zapisovat obojรญ XLS a XLSX formรกt souboru Excel.
ฤรญst XLS soubory, an HSSF implementaci zajiลกลฅuje knihovna POI.
ฤรญst XLSX, XSSF implementace POI knihovna bude volba. Pojฤme si tyto implementace podrobnฤ prostudovat.
O testovรกnรญ na zรกkladฤ dat jsme se jiลพ dozvฤdฤli v naลกem pลedchozรญ tutoriรกl
Keyword Driven Framework in Selenium
Keyword Driven Framework in Selenium je metoda pouลพรญvanรก pro urychlenรญ automatizovanรฉho testovรกnรญ oddฤlenรญm klรญฤovรฝch slov pro bฤลพnou sadu funkcรญ a instrukcรญ. Vลกechny operace a instrukce, kterรฉ majรญ bรฝt provedeny, jsou zapsรกny v nฤjakรฉm externรญm souboru, jako je list aplikace Excel. Uลพivatelรฉ mohou snadno ovlรกdat a specifikovat funkce, kterรฉ chtฤjรญ testovat.
Takto vypadรก kompletnรญ framework
Jak mลฏลพete vidฤt, je to 5krokovรฝ rรกmec. Pojฤme si to postupnฤ prostudovat podrobnฤ
Krok 1)
- Skript ovladaฤe Execute.java bude volat ReadGuru99ExcelFile.java
- ReadGuru99ExcelFile.java mรก skript POI pro ฤtenรญ dat z Excelu
Krok 2)
- ReadGuru99ExcelFile.java naฤte data z TestCase.xlsx
- Tady je list, jak vypadรก-
- Podle klรญฤovรฝch slov zapsanรฝch v souboru aplikace Excel provede framework operaci na uลพivatelskรฉm rozhranรญ.
- Potลebujeme napลรญklad kliknout na tlaฤรญtko 'Pลihlรกsit se'. V souladu s tรญm bude mรญt nรกลก Excel klรญฤovรฉ slovo โKliknoutโ. Nynรญ mลฏลพe mรญt AUT na strรกnce stovky tlaฤรญtek pro identifikaci tlaฤรญtka Login, v Excelu zadรกme Object Name jako loginButton a typ objektu jako jmรฉno (viz zvรฝraznฤnรฝ ลรกdek na obrรกzku vรฝลกe). Typ objektu mลฏลพe bรฝt Xpath, nรกzev CSS nebo jakรกkoli jinรก hodnota
Krok 3) ReadGuru99ExcelFile.java pลedรก tato data skriptu ovladaฤe Execute.java
Krok 4)
- Pro vลกechny naลกe webovรฉ prvky uลพivatelskรฉho rozhranรญ musรญme vytvoลit รบloลพiลกtฤ objektลฏ, kam umรญstรญme jejich lokรกtor prvkลฏ (jako Xpath, nรกzev, cesta CSS, nรกzev tลรญdy atd.)
- Execute.java (nรกลก skript ovladaฤe) naฤte celรฝ objekt Object Repository a uloลพรญ jej do promฤnnรฉ
- Ke ฤtenรญ tohoto รบloลพiลกtฤ objektลฏ potลebujeme tลรญdu ReadObject, kterรก mรก metodu getObjectRepository k jeho ฤtenรญ.
POZNรMKA: Moลพnรก si ลรญkรกte, proฤ potลebujeme vytvoลit รบloลพiลกtฤ objektลฏ. Odpovฤฤ pomรกhรก pลi รบdrลพbฤ kรณdu. Napลรญklad pouลพรญvรกme tlaฤรญtko s nรกzvem = btnlogin v 10 rลฏznรฝch testovacรญch pลรญpadech. V budoucnu se vรฝvojรกล rozhodne zmฤnit nรกzev z btnlogin na pลedloลพenรญ. Budete muset provรฉst zmฤnu ve vลกech 10 testovacรญch pลรญpadech. V pลรญpadฤ objektovรฉho รบloลพiลกtฤ provedete zmฤnu pouze jednou v รบloลพiลกti.
Krok 5)
- Ovladaฤ pลedรก data z Excel & Object Repository do uลพivatelskรฉho rozhranรญOperatลรญdy
- UIOperaTลรญda tion mรก funkce pro provรกdฤnรญ akcรญ odpovรญdajรญcรญch klรญฤovรฝm slovลฏm jako CLICK, SETTEXT atd... zmรญnฤnรฝm v excelu
- UIOperatลรญda je a Java tลรญda, kterรก mรก skuteฤnou implementaci kรณdu pro provรกdฤnรญ operacรญ s prvky webu
Celรฝ projekt bude vypadat napล.
Podรญvejme se na 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
Pลeฤtฤte si Guru99ExcelFile.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 object of File class to open xlsx file
File file = new File(filePath+"\\"+fileName);
//Create an object of FileInputStream class to read excel file
FileInputStream inputStream = new FileInputStream(file);
Workbook guru99Workbook = null;
//Find the file extension by spliting file name in substing and getting only extension name
String fileExtensionName = fileName.substring(fileName.indexOf("."));
//Check condition if the file is xlsx file
if(fileExtensionName.equals(".xlsx")){
//If it is xlsx file then create object of XSSFWorkbook class
guru99Workbook = new XSSFWorkbook(inputStream);
}
//Check condition if the file is xls file
else if(fileExtensionName.equals(".xls")){
//If it is xls file then create object of XSSFWorkbook class
guru99Workbook = new HSSFWorkbook(inputStream);
}
//Read 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 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":
//Perform click
driver.findElement(this.getObject(p,objectName,objectType)).click();
break;
case "SETTEXT":
//Set text on control
driver.findElement(this.getObject(p,objectName,objectType)).sendKeys(value);
break;
case "GOTOURL":
//Get url of application
driver.get(p.getProperty(value));
break;
case "GETTEXT":
//Get text of an element
driver.findElement(this.getObject(p,objectName,objectType)).getText();
break;
default:
break;
}
}
/**
* Find element BY using object type and value
* @param p
* @param objectName
* @param objectType
* @return
* @throws Exception
*/
private By getObject(Properties p,String objectName,String objectType) throws Exception{
//Find by xpath
if(objectType.equalsIgnoreCase("XPATH")){
return By.xpath(p.getProperty(objectName));
}
//find by class
else if(objectType.equalsIgnoreCase("CLASSNAME")){
return By.className(p.getProperty(objectName));
}
//find by name
else if(objectType.equalsIgnoreCase("NAME")){
return By.name(p.getProperty(objectName));
}
//Find by css
else if(objectType.equalsIgnoreCase("CSS")){
return By.cssSelector(p.getProperty(objectName));
}
//find by link
else if(objectType.equalsIgnoreCase("LINK")){
return By.linkText(p.getProperty(objectName));
}
//find by partial link
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 {
// TODO Auto-generated method stub
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 number of rows in excel file
int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum();
//Create a loop over all the rows of excel file to read it
for (int i = 1; i < rowCount+1; i++) {
//Loop over all the rows
Row row = guru99Sheet.getRow(i);
//Check if the first cell contain a value, if yes, That means it is the new testcase name
if(row.getCell(0).toString().length()==0){
//Print testcase detail on console
System.out.println(row.getCell(1).toString()+"----"+ row.getCell(2).toString()+"----"+
row.getCell(3).toString()+"----"+ row.getCell(4).toString());
//Call perform function to perform operation on UI
operation.perform(allObjects, row.getCell(1).toString(), row.getCell(2).toString(),
row.getCell(3).toString(), row.getCell(4).toString());
}
else{
//Print the new testcase name when it started
System.out.println("New Testcase->"+row.getCell(0).toString() +" Started");
}
}
}
}
Po provedenรญ bude vรฝstup vypadat takto โ
stรกhnฤte Selenium Soubory projektu pro ukรกzku v tomto kurzu
Hybrid Driven Framework
Hybrid Driven Framework in Selenium je koncept, kde vyuลพรญvรกme vรฝhody rรกmce ลรญzenรฉho klรญฤovรฝmi slovy i rรกmce ลรญzenรฉho daty. Je to snadno pouลพitelnรฝ rรกmec, kterรฝ umoลพลuje ruฤnรญm testerลฏm vytvรกลet testovacรญ pลรญpady pouhรฝm pohledem na klรญฤovรก slova, testovacรญ data a รบloลพiลกtฤ objektลฏ bez kรณdovรกnรญ v rรกmci.
Zde pro klรญฤovรก slova pouลพijeme soubory Excel k รบdrลพbฤ testovacรญch pลรญpadลฏ a pro testovacรญ data mลฏลพeme pouลพรญt data, poskytovatele Testng rรกmec.
Zde v naลกem hybridnรญm frameworku nepotลebujeme nic mฤnit v rรกmci klรญฤovรฝch slov, zde staฤรญ nahradit soubor ExecuteTest.java souborem HybridExecuteTest.java.
Tento soubor HybridExecuteTest obsahuje veลกkerรฝ kรณd pro klรญฤovรก slova ลรญzenรก konceptem poskytovatele dat.
Kompletnรญ obrazovรฉ znรกzornฤnรญ hybridnรญho rรกmce bude vypadat 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 {
// TODO Auto-generated method stub
if(testcaseName!=null&&testcaseName.length()!=0){
webdriver=new FirefoxDriver();
}
ReadObject object = new ReadObject();
Properties allObjects = object.getObjectRepository();
UIOperation operation = new UIOperation(webdriver);
//Call perform function to perform operation on UI
operation.perform(allObjects, keyword, objectName,
objectType, value);
}
@DataProvider(name="hybridData")
public Object[][] getDataFromDataprovider() throws IOException{
Object[][] object = null;
ReadGuru99ExcelFile file = new ReadGuru99ExcelFile();
//Read keyword sheet
Sheet guru99Sheet = file.readExcel(System.getProperty("user.dir")+"\\","TestCase.xlsx" , "KeywordFramework");
//Find number of rows in excel file
int rowCount = guru99Sheet.getLastRowNum()-guru99Sheet.getFirstRowNum();
object = new Object[rowCount][5];
for (int i = 0; i < rowCount; i++) {
//Loop over all the rows
Row row = guru99Sheet.getRow(i+1);
//Create a loop to print cell values in a row
for (int j = 0; j < row.getLastCellNum(); j++) {
//Print excel data in console
object[i][j] = row.getCell(j).toString();
}
}
System.out.println("");
return object;
}
}
Shrnutรญ
- Mลฏลพeme vytvoลit tลi typy testovacรญch rรกmcลฏ pomocรญ Selenium WebDriver.
- A Selenium automatizaฤnรญ rรกmec, kterรฝ lze rozdฤlit na datovฤ ลรญzenรฉ, klรญฤovรฝmi slovy a hybridnรญ.
- Mลฏลพeme dosรกhnout datovฤ ลรญzenรฉho rรกmce pomocรญ TestNGposkytovatel dat.
- V rรกmci klรญฤovรฝch slov jsou klรญฤovรก slova zapsรกna v nฤkterรฝch externรญch souborech, jako je soubor Excel a kรณd Java zavolรก tento soubor a spustรญ testovacรญ pลรญpady.
- Hybridnรญ rรกmec je kombinacรญ rรกmce zaloลพenรฉho na klรญฤovรฝch slovech a rรกmce zaloลพenรฉho na datech.
stรกhnฤte Selenium Soubory projektu pro ukรกzku v tomto kurzu












