Model stránky a továrna v Selenium
⚡ Chytré shrnutí
Objektový model stránky a továrna stránek v Selenium definovat strukturovaný návrhový vzor pro vytváření robustních a udržovatelných frameworků pro automatizaci testování. Klade důraz na vytváření tříd specifických pro stránky, které zapouzdřují WebElements a jejich chování, čímž se snižuje duplicita a zlepšuje čitelnost a škálovatelnost Selenium testovací skripty.
Co je objektový model stránky? Jaké jsou jeho klíčové komponenty?
Model objektu stránky (POM) je návrhový vzor, běžně používaný v automatizaci testování, který vytváří objektové úložiště pro prvky webového uživatelského rozhraní. Výhodou tohoto modelu je, že snižuje duplicitu kódu a zlepšuje údržbu testů.
V rámci tohoto modelu by pro každou webovou stránku v aplikaci měla existovat odpovídající třída Page. Tato třída Page identifikuje webové prvky dané webové stránky a také obsahuje metody Page, které s těmito webovými prvky provádějí operace. Názvy těchto metod by měly být uvedeny podle úkolu, který provádějí, tj. pokud zavaděč čeká na zobrazení platební brány, název metody POM může být waitForPaymentScreenDisplay().
Klíčové komponenty modelu objektů stránky
- Třídy stránek: Reprezentujte každou webovou stránku jako samostatnou třídu.
- Lokátory: Identifikujte webové prvky pomocí ID, XPath nebo CSS selektorů.
- Metody: Obsahují akce nebo operace prováděné s prvky .page.
- Opětovná použitelnost: Promoopětovné použití kódu TES a snazší údržba napříč testy.
- Rozdělení obav: Udržuje strukturu stránky nezávislou na testovací logice pro lepší organizaci.
Proč objektový model stránky?
Spuštění automatizace uživatelského rozhraní v Selenium webový ovladač Není to těžký úkol. Stačí najít prvky a provést s nimi operace.
Zvažte tento jednoduchý skript pro přihlášení na webovou stránku.
Jak můžete pozorovat, vše, co děláme, je hledání prvků a plnění hodnot pro tyto prvky.
Toto je časově náročný skript, náchylný k chybám. Zpočátku se zdá jednoduchý, ale s rozšiřováním testovací sady se správa změn prvků stává obtížnější. Postupem času se však testovací sada rozroste. Jak budete do kódu přidávat další a další řádky, věci se budou komplikovat.
Hlavním problémem údržby skriptů je, že pokud 10 různých skriptů používá stejný prvek stránky, při jakékoli změně v tomto prvku musíte změnit všech 10 skriptů. To je časově náročné a náchylné k chybám.
Lepším přístupem k údržbě skriptů je vytvoření samostatného souboru třídy, který by vyhledával webové elementy, vyplňoval je nebo ověřoval. Tuto třídu lze pak znovu použít v různých testovacích skriptech, které interagují se stejným elementem. V budoucnu, pokud dojde ke změně v elementu web, musíme tuto změnu provést pouze v jednom souboru třídy a ne v 10 různých skriptech.
Tento přístup se nazývá Page Object Model in SeleniumPomáhá to učinit kód čitelnějším, udržovatelnějším a znovu použitelnějším.
👉 Zaregistrujte se pro živé vysílání zdarma Selenium Projekt
Výhody POM
- Vzor návrhu objektu stránky říká, že operace a toky v uživatelském rozhraní by měly být odděleny od ověřování. Díky tomuto konceptu je náš kód čistší a snadno pochopitelný.
- Druhou výhodou je, že objektový repozitář je nezávislý na testovacích případech, takže můžeme stejný objektový repozitář použít pro různé účely s různými nástroji. Například můžeme integrovat objektový model stránky do... Selenium s TestNG/JUnit pro funkční Testování a zároveň s JBehave/Cucumber pro přejímací zkoušky.
- Code stává se menší a optimalizovanou, protože znovu používá metody stránky v POM třídách.
- Metody dostávají realističtější názvy, které lze snadno namapovat na operaci probíhající v uživatelském rozhraní. Např. pokud se po kliknutí na tlačítko dostaneme na domovskou stránku, název metody bude vypadat jako 'gotoHomePage()'.
Jak implementovat POM v Selenium?
Jednoduchý PLog v základní struktuře frameworku Page Object Model, kde whereManagereIDElements AUT a metody, které s těmito webovými prvky pracují, jsou uchovávány v souboru clog. Úkoly jako ověřování by měly být oddělené jako součást testovacích metod.
Kompletní příklad
modelový případ: Přejít Guru99 Demo web.
Krok 1) Přejděte na Guru99 Demo web
Krok 2) Na domovské stránce zkontrolujte, zda je zobrazen text „Guru„99 Bank“ je přítomna
Krok 3) Přihlaste se do aplikace
Krok 4) Ověřte, že domovská stránka obsahuje text jako „ID správce: demo“
V tomto příkladu se zabýváme dvěma stránkami:
- Přihlásit se Strana
- Domovská stránka (zobrazí se po přihlášení)
Podle toho vytvoříme 2 POM in Selenium třídy
Guru99 Přihlašovací stránka POM
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99Login {
WebDriver driver;
By user99GuruName = By.name("uid");
By password99Guru = By.name("password");
By titleText =By.className("barone");
By login = By.name("btnLogin");
public Guru99Login(WebDriver driver){
this.driver = driver;
}
//Set user name in textbox
public void setUserName(String strUserName){
driver.findElement(user99GuruName).sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
driver.findElement(password99Guru).sendKeys(strPassword);
}
//Click on the login button
public void clickLogin(){
driver.findElement(login).click();
}
//Get the title of Login Page
public String getLoginTitle(){
return driver.findElement(titleText).getText();
}
/**
* This POM method allows the test case to perform the login operation
* @param strUserName
* @param strPasword
* @return
*/
public void loginToGuru99(String strUserName,String strPasword){
//Fill user name
this.setUserName(strUserName);
//Fill password
this.setPassword(strPasword);
//Click Login button
this.clickLogin();
}
}
Guru99 Domovská stránka POM v Selenium
package pages;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
public class Guru99HomePage {
WebDriver driver;
By homePageUserName = By.xpath("//table//tr[@class='heading3']");
public Guru99HomePage(WebDriver driver){
this.driver = driver;
}
//Get the User name from Home Page
public String getHomePageDashboardUserName(){
return driver.findElement(homePageUserName).getText();
}
}
Guru99 Jednoduchý POM v Selenium Modelový případ
package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import pages.Guru99HomePage;
import pages.Guru99Login;
public class Test99GuruLogin {
String driverPath = "C:\\geckodriver.exe";
WebDriver driver;
Guru99Login objLogin;
Guru99HomePage objHomePage;
@BeforeTest
public void setup(){
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://demo.guru99.com/V4/");
}
/**
* This test case will login in https://demo.guru99.com/V4/
* Verify login page title as guru99 bank
* Login to application
* Verify the home page using Dashboard message
*/
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
//Create Login Page object
objLogin = new Guru99Login(driver);
//Verify login page title
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
//login to application
objLogin.loginToGuru99("mgr123", "mgr!23");
// go the next page
objHomePage = new Guru99HomePage(driver);
//Verify home page
Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
}
V čem je Page Factory Selenium?
Page Factory v Selenium je vestavěný koncept rámce Page Object Model pro Selenium WebDriver, který zlepšuje údržbu snížením opakujících se vyhledávání prvků pomocí anotací, nikoli rychlostí provádění. Používá se pro inicializaci objektů Page nebo k vytvoření instance samotného objektu Page. Používá se také k inicializaci prvků třídy Page bez použití „FindElement/s“.
I zde se řídíme konceptem oddělení Page Object Repository a testovacích metod. Navíc s pomocí třídy PageFactory v Selenium, používáme anotace @FindBy najít WebElement. K inicializaci webových elementů používáme metodu initElements.
@FindBy může přijmout tagName, částečnýLinkText, name, linkText, id, css, className, xpath jako atributy.
Podívejme se na stejný příklad jako výše pomocí Page Factory
Guru99 Přihlašovací stránka s Page Factory
package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99Login {
/**
* All WebElements are identified by @FindBy annotation
*/
WebDriver driver;
@FindBy(name="uid")
WebElement user99GuruName;
@FindBy(name="password")
WebElement password99Guru;
@FindBy(className="barone")
WebElement titleText;
@FindBy(name="btnLogin")
WebElement login;
public Guru99Login(WebDriver driver){
this.driver = driver;
//This initElements method will create all WebElements
PageFactory.initElements(driver, this);
}
//Set user name in textbox
public void setUserName(String strUserName){
user99GuruName.sendKeys(strUserName);
}
//Set password in password textbox
public void setPassword(String strPassword){
password99Guru.sendKeys(strPassword);
}
//Click on login button
public void clickLogin(){
login.click();
}
//Get the title of Login Page
public String getLoginTitle(){
return titleText.getText();
}
/**
* This POM method will be exposed in test case to login in the application
* @param strUserName
* @param strPasword
* @return
*/
public void loginToGuru99(String strUserName,String strPasword){
//Fill user name
this.setUserName(strUserName);
//Fill password
this.setPassword(strPasword);
//Click Login button
this.clickLogin();
}
}
Guru99 Domovská stránka s Page Factory
package PageFactory;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Guru99HomePage {
WebDriver driver;
@FindBy(xpath="//table//tr[@class='heading3']")
WebElement homePageUserName;
public Guru99HomePage(WebDriver driver){
this.driver = driver;
//This initElements method will create all WebElements
PageFactory.initElements(driver, this);
}
//Get the User name from Home Page
public String getHomePageDashboardUserName(){
return homePageUserName.getText();
}
}
Guru99 TestCase s konceptem Page Factory
package test;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import PageFactory.Guru99HomePage;
import PageFactory.Guru99Login;
public class Test99GuruLoginWithPageFactory {
String driverPath = "C:\\geckodriver.exe";
WebDriver driver;
Guru99Login objLogin;
Guru99HomePage objHomePage;
@BeforeTest
public void setup(){
System.setProperty("webdriver.gecko.driver", driverPath);
driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://demo.guru99.com/V4/");
}
/**
* This test go to https://demo.guru99.com/V4/
* Verify login page title as guru99 bank
* Login to application
* Verify the home page using Dashboard message
*/
@Test(priority=0)
public void test_Home_Page_Appear_Correct(){
//Create Login Page object
objLogin = new Guru99Login(driver);
//Verify login page title
String loginPageTitle = objLogin.getLoginTitle();
Assert.assertTrue(loginPageTitle.toLowerCase().contains("guru99 bank"));
//login to application
objLogin.loginToGuru99("mgr123", "mgr!23");
// go the next page
objHomePage = new Guru99HomePage(driver);
//Verify home page
Assert.assertTrue(objHomePage.getHomePageDashboardUserName().toLowerCase().contains("manager id : mgr123"));
}
}
Kompletní struktura projektu bude vypadat jako na obrázku:
AjaxElementLocatorFactory
AjaxElementLocatorFactory je koncept líného načítání PageFactory in SeleniumPoužívá se k nalezení webových elementů pouze tehdy, když jsou elementy použity v jakékoli operaci. Přiřazuje časový limit pro WebElements třídě objektu page. Jednou z klíčových výhod použití vzoru PageFactory v Selenium je třída AjaxElementLocatorFactory.
Zde, když je na prvku provedena operace, čekání na jeho viditelnost začíná až od tohoto okamžiku. Pokud prvek není v daném časovém intervalu nalezen, Testovací případ provedení vyvolá výjimku 'NoSuchElementException'.
Například:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
stáhněte Selenium Soubory projektu pro ukázku v tomto kurzu












