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.

  • Základní koncept: Každá stránka aplikace odpovídá vyhrazené třídě Page Class obsahující jak webové prvky (WebElements), tak i akce, které se na nich provádějí, což umožňuje jasné oddělení struktury uživatelského rozhraní od testovací logiky.
  • Zaměření implementace: POM podporuje opakovaně použitelnou a centralizovanou správu prvků – úpravy prvků stránky vyžadují aktualizace pouze v jedné třídě namísto více skriptů.
  • Výhoda designu: Model zajišťuje čistší, modulární a na nástrojích nezávislé objektové repozitáře, které lze integrovat s frameworky jako například TestNG, JUnit, Cucumbernebo JBehave.
  • Konvence pojmenování: Metody v rámci tříd stránek musí odrážet skutečné akce uživatelského rozhraní (např. gotoHomePage()), což posiluje sémantickou srozumitelnost v automatizovaných pracovních postupech.
  • Vylepšená struktura: Page Factory zdokonaluje POM pomocí @FindBy anotace a PageFactory.initElements() pro automatickou inicializaci WebElement, čímž se eliminuje opakování findElement volání.
  • Optimalizace výkonu: AjaxElementLocatorFactory zavádí líné načítání – prvky se nacházejí pouze při přístupu – což zlepšuje efektivitu provádění a elegantně zvládá dynamické chování stránky.
  • Výsledek: Sjednocený přístup vede k udržovatelné, čitelné a škálovatelné architektuře automatizace testování, která je v souladu s moderními standardy. Selenium postupy.

Model objektu stránky

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.

Model objektu stránky

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.

Model objektu stránky

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.

 Model objektu stránky

👉 Zaregistrujte se pro živé vysílání zdarma Selenium Projekt

Výhody POM

  1. 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ý.
  2. 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.
  3. Code stává se menší a optimalizovanou, protože znovu používá metody stránky v POM třídách.
  4. 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.

Implementujte POM

Kompletní příklad

modelový případ: Přejít Guru99 Demo web.

Krok 1) Přejděte na Guru99 Demo web

Implementujte POM

Krok 2) Na domovské stránce zkontrolujte, zda je zobrazen text „Guru„99 Bank“ je přítomna

Implementujte POM

Krok 3) Přihlaste se do aplikace

Implementujte POM

Krok 4) Ověřte, že domovská stránka obsahuje text jako „ID správce: demo“

Implementujte POM

V tomto příkladu se zabýváme dvěma stránkami:

  1. Přihlásit se Strana
  2. 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.

Page Factory In Selenium

@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:

Page Factory v Selenium

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'.

AjaxElement Locator Factory

Například:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

stáhněte Selenium Soubory projektu pro ukázku v tomto kurzu

Nejčastější dotazy

Objektový model stránky (Page Object Model) je návrhový vzor, ​​kterýtracts rozděluje prvky webových stránek do samostatných tříd. Zjednodušuje automatizaci oddělením interakcí uživatelského rozhraní od testovací logiky, čímž podporuje přehlednost, škálovatelnost a snižuje duplicitu kódu.

In SeleniumPOM reprezentuje každou webovou stránku jako specializovanou třídu obsahující lokátory a akce. Zapouzdřuje prvky uživatelského rozhraní, což umožňuje testovacím skriptům zůstat nezávislými na změnách struktury stránky.

POM není samostatný framework, ale návrhový vzor. Lze jej integrovat do libovolného automatizačního frameworku pro efektivní strukturování testů, což zajišťuje lepší organizaci, opětovnou použitelnost a udržovatelnost.

POM je designový princip, kde je každá webová stránka modelována jako třída s definovanými lokátory a metodami. Odděluje testovací logiku od prvků uživatelského rozhraní, čímž zlepšuje čitelnost, škálovatelnost a dlouhodobou údržbu.

POM definuje strukturu návrhu pro stránku ABStracce, zatímco Page Factory poskytuje anotace a metody (@FindBy) pro efektivní inicializaci webových prvků. Page Factory je implementační vylepšení POM.

POM centralizuje lokátory prvků a akce stránek v rámci vyhrazených tříd. Jakákoli úprava uživatelského rozhraní vyžaduje aktualizace pouze na jednom místě, což minimalizuje nutnost přepracování, zlepšuje opětovné použití kódu a urychluje údržbu testů.

Ano. Generátory testů řízené umělou inteligencí dokáží automaticky vytvářet třídy POM analýzou hierarchií uživatelského rozhraní, zachováním logického oddělení úkolů a zároveň urychlením vytváření testů od začátku do konce.

POM podporuje modulární a opakovaně použitelné testovací komponenty, což umožňuje integraci s nástroji pro údržbu testů založenými na umělé inteligenci, které automaticky aktualizují lokátory, čímž se snižuje křehkost skriptů a režijní náklady na údržbu.

Shrňte tento příspěvek takto: