Co je model objektu stránky?
Page Object Model (POM) je návrhový vzor, běžně používaný v automatizaci testů, který vytváří objektové úložiště pro prvky webového uživatelského rozhraní. Výhodou modelu je, že snižuje duplikaci 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 stránky. Tato třída Page bude identifikovat WebElements této webové stránky a také obsahuje Page metody, které provádějí operace s těmito WebElements. Název těchto metod by měl být uveden podle úkolu, který provádějí, tj. Pokud zavaděč čeká na zobrazení platební brány, název metody POM může být waitForPaymentScreenDisplay ().
V tomto výukovém programu se naučíte
- Proč stránkový objektový model?
- Výhody POM
- Jak implementovat POM?
- Co je Page Factory?
- Guru99 TestCase s konceptem Page Factory
- AjaxElementLocatorFactory
Proč stránkový objektový model?
Spuštění automatizace uživatelského rozhraní v selenu WebDriver NENÍ náročný úkol. Musíte jen najít prvky a provádět na nich operace.
Zvažte tento jednoduchý skript pro přihlášení na web
Jak můžete vidět, vše, co děláme, je hledání prvků a vyplňování hodnot pro tyto prvky.
Toto je malý skript. Údržba skriptů vypadá snadno. Ale s časovým testovacím balíčkem poroste. Jak do svého kódu přidáváte další a další řádky, věci se zhoršují.
Hlavní problém s údržbou skriptů spočívá v tom, že pokud stejný prvek stránky používá 10 různých skriptů, při jakékoli změně tohoto 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é prvky, vyplňoval je nebo ověřoval. Tuto třídu lze znovu použít ve všech skriptech pomocí tohoto prvku. V budoucnu, pokud dojde ke změně webového prvku, musíme provést změnu pouze v 1 souboru třídy a ne v 10 různých skriptech.
Tento přístup se nazývá Page Object Model in Selenium. Pomáhá zajistit, aby byl kód čitelnější, udržovatelnější a znovu použitelný.
Výhody POM
- Page Object Design Pattern říká, že operace a toky v uživatelském rozhraní by měly být odděleny od ověření. Díky tomuto konceptu je náš kód čistší a srozumitelnější.
- Druhou výhodou je, že úložiště objektů je nezávislé na testovacích případech, takže můžeme použít stejné úložiště objektů pro různé účely s různými nástroji. Například můžeme integrovat Page Object Model v Selenium s TestNG / JUnit pro funkční testování a současně s JBehave / Cucumber pro akceptační testování.
- Kód se zmenší a optimalizuje kvůli opakovaně použitelným metodám stránek ve třídách POM.
- Metody získají realističtější názvy, které lze snadno mapovat s operací probíhající v uživatelském rozhraní. tj. pokud po kliknutí na tlačítko přistaneme na domovské stránce, bude název metody vypadat jako 'gotoHomePage ()'.
Jak implementovat POM?
Jednoduchý POM:
Je to základní struktura rámce modelu objektu Page, kde jsou všechny webové prvky AUT a metoda, které na těchto webových prvcích fungují, udržovány uvnitř souboru třídy. Úkol jako ověření by měl být v rámci testovacích metod samostatný.
Kompletní příklad
TestCase: Přejít na ukázkovou stránku Guru99.
Krok 1) Přejděte na ukázkovou stránku Guru99 | |
Krok 2) Na domovské stránce je uveden text „Guru99 Bank“ | |
Krok 3) Přihlaste se do aplikace | |
Krok 4) Ověřte, zda domovská stránka obsahuje text jako „ID správce: ukázka“ |
Tady máme co do činění se 2 stránkami
- Přihlašovací stránka
- Domovská stránka (zobrazí se po přihlášení)
V souladu s tím vytvoříme 2 POM ve třídách selenu
Přihlašovací stránka Guru99 POM
stránky balíčku;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;veřejná třída Guru99Login {Ovladač WebDriver;Autor user99GuruName = By.name ("uid");Vytvořil password99Guru = By.name ("heslo");By titleText = By.className ("barone");Přihlašováním = By.name ("btnLogin");public Guru99Login (ovladač WebDriver) {this.driver = driver;}// Nastaví uživatelské jméno do textového polepublic void setUserName (řetězec strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Nastavit heslo do textového pole pro heslopublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Klikněte na přihlašovací tlačítkopublic void clickLogin () {driver.findElement (login) .click ();}// Získejte název přihlašovací stránkypublic String getLoginTitle () {vrátit driver.findElement (titleText) .getText ();}/ *** Tato metoda POM bude vystavena v testovacím případě pro přihlášení do aplikace* @param strUserName* @param strPasword* @vrátit se* /public void loginToGuru99 (String strUserName, String strPasword) {// Vyplňte uživatelské jménothis.setUserName (strUserName);// Vyplňte heslothis.setPassword (strPasword);// Klikněte na tlačítko Přihlášeníthis.clickLogin ();}}
Domovská stránka Guru99 POM v selenu
stránky balíčku;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;veřejná třída Guru99HomePage {Ovladač WebDriver;By homePageUserName = By.xpath ("// tabulka // tr [@ class = 'titulek3']");public Guru99HomePage (ovladač WebDriver) {this.driver = driver;}// Získejte uživatelské jméno z domovské stránkypublic String getHomePageDashboardUserName () {vrátit driver.findElement (homePageUserName) .getText ();}}
Guru99 Simple POM v testovacím případě selenu
test balení;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 stránek.Guru99HomePage;import stránek.Guru99Login;veřejná třída Test99GuruLogin {Řetězec driverPath = "C: \\ geckodriver.exe";Ovladač WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Tento testovací případ se přihlásí na adrese http://demo.guru99.com/V4/* Ověřte název přihlašovací stránky jako guru99 bank* Přihlaste se do aplikace* Ověřte domovskou stránku pomocí zprávy na řídicím panelu* /@Test (priorita = 0)public void test_Home_Page_Appear_Correct () {// Vytvořit objekt přihlašovací stránkyobjLogin = nový Guru99Login (ovladač);// Ověření názvu přihlašovací stránkyŘetězec loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Obsahuje ("banka guru99"));// přihlášení do aplikaceobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// přejít na další stránkuobjHomePage = nový Guru99HomePage (ovladač);// Ověření domovské stránkyAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("manger id: mgr123"));}
Co je Page Factory v selenu?
Page Factory v Selenium je vestavěný koncept rámce Page Object Model pro Selenium WebDriver, ale je velmi optimalizovaný. Používá se k inicializaci objektů Page nebo k vytvoření instance objektu Page samotného. Používá se také k inicializaci prvků třídy Page bez použití "FindElement / s."
I zde se řídíme konceptem oddělení úložiště objektů stránky a testovacích metod. Navíc pomocí třídy PageFactory v Selenium používáme anotace @FindBy k nalezení WebElement. K inicializaci webových prvků používáme metodu initElements
@FindBy může jako atributy přijímat tagName, partialLinkText, name, linkText, id, css, className, xpath .
Podívejme se na stejný příklad jako výše pomocí Page Factory
Přihlašovací stránka Guru99 s aplikací Page Factory
balíček PageFactory;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importovat org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;veřejná třída Guru99Login {/ *** Všechny prvky WebElements jsou označeny anotací @FindBy* /Ovladač WebDriver;@FindBy (name = "uid")WebElement user99GuruName;@FindBy (name = "heslo")Heslo WebElement99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")WebElement přihlášení;public Guru99Login (ovladač WebDriver) {this.driver = driver;// Tato metoda initElements vytvoří všechny WebElementsPageFactory.initElements (ovladač, toto);}// Nastaví uživatelské jméno do textového polepublic void setUserName (řetězec strUserName) {user99GuruName.sendKeys (strUserName);}// Nastavit heslo do textového pole pro heslopublic void setPassword (String strPassword) {heslo99Guru.sendKeys (strPassword);}// Klikněte na přihlašovací tlačítkopublic void clickLogin () {login.click ();}// Získejte název přihlašovací stránkypublic String getLoginTitle () {návrat titleText.getText ();}/ *** Tato metoda POM bude vystavena v testovacím případě pro přihlášení do aplikace* @param strUserName* @param strPasword* @vrátit se* /public void loginToGuru99 (String strUserName, String strPasword) {// Vyplňte uživatelské jménothis.setUserName (strUserName);// Vyplňte heslothis.setPassword (strPasword);// Klikněte na tlačítko Přihlášeníthis.clickLogin ();}}
Domovská stránka Guru99 se stránkou Factory
balíček PageFactory;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;importovat org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;veřejná třída Guru99HomePage {Ovladač WebDriver;@FindBy (xpath = "// tabulka // tr [@ class = 'hlavička3']")WebElement homePageUserName;public Guru99HomePage (ovladač WebDriver) {this.driver = driver;// Tato metoda initElements vytvoří všechny WebElementsPageFactory.initElements (ovladač, toto);}// Získejte uživatelské jméno z domovské stránkypublic String getHomePageDashboardUserName () {vrátit homePageUserName.getText ();}}
Guru99 TestCase s konceptem Page Factory
test balení;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;veřejná třída Test99GuruLoginWithPageFactory {Řetězec driverPath = "C: \\ geckodriver.exe";Ovladač WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = new FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Tento test najdete na adrese http://demo.guru99.com/V4/* Ověřte název přihlašovací stránky jako guru99 bank* Přihlaste se do aplikace* Ověřte domovskou stránku pomocí zprávy na řídicím panelu* /@Test (priorita = 0)public void test_Home_Page_Appear_Correct () {// Vytvořit objekt přihlašovací stránkyobjLogin = nový Guru99Login (ovladač);// Ověření názvu přihlašovací stránkyŘetězec loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Obsahuje ("banka guru99"));// přihlášení do aplikaceobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// přejít na další stránkuobjHomePage = nový Guru99HomePage (ovladač);// Ověření domovské stránkyAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("manger id: mgr123"));}}
Kompletní struktura projektu bude vypadat jako diagram:
AjaxElementLocatorFactory
AjaxElementLocatorFactory je líný koncept načítání PageFactory v selenu. Používá se k vyhledání webových prvků, pouze když jsou prvky použity v jakékoli operaci. Přiřadí časový limit pro WebElements třídě stránky objektu. Jednou z klíčových výhod používání vzoru PageFactory v selenu je AjaxElementLocatorFactory Class.
Zde, když se operace provádí na prvku, čekání na jeho viditelnost začíná pouze od tohoto okamžiku. Pokud prvek v daném časovém intervalu nebyl nalezen, vyvolá spuštění testovacího případu výjimku NoSuchElementException.
souhrn
- Page Object Model in Selenium Websdriver is a Object Repository design pattern.
- Selenový objektový model stránky vytváří náš testovací kód udržovatelný, opakovaně použitelný.
- Page Factory je optimalizovaný způsob, jak vytvořit úložiště objektů v koncepčním rámci Page Object Model Model.
- AjaxElementLocatorFactory je koncept líného načtení ve Page Factory - návrhový vzor objektu stránky k identifikaci WebElements pouze v případě, že jsou použity v jakékoli operaci.
Stáhněte si soubory projektu Selenium pro ukázku v tomto výukovém programu