Pagina-objectmodel en fabriek in Selenium

โšก Slimme samenvatting

Pagina-objectmodel en paginafabriek in Selenium Definieer een gestructureerd ontwerppatroon voor het bouwen van robuuste, onderhoudbare testautomatiseringsframeworks. Het benadrukt het creรซren van paginaspecifieke klassen die webelementen en hun gedrag inkapselen, waardoor duplicatie wordt verminderd en de leesbaarheid en schaalbaarheid van Selenium testscripts.

  • Kernbegrip: Elke toepassingspagina komt overeen met een speciale paginaklasse die zowel de WebElements als de acties die erop worden uitgevoerd bevat. Hierdoor is een duidelijke scheiding tussen de UI-structuur en de testlogica mogelijk.
  • Implementatiefocus: POM bevordert herbruikbaar en gecentraliseerd elementbeheer: wijzigingen in pagina-elementen vereisen updates in slechts รฉรฉn klasse in plaats van meerdere scripts.
  • Ontwerpvoordeel: Het model zorgt voor schonere, modulaire en tool-onafhankelijke objectrepositories die kunnen worden geรฏntegreerd met frameworks zoals TestNG, JUnit, Cucumber, of JBehave.
  • Naamgeving: Methoden binnen paginaklassen moeten daadwerkelijke UI-acties weerspiegelen (bijv. gotoHomePage()), waardoor de semantische duidelijkheid in automatiseringsworkflows wordt versterkt.
  • Verbeterde structuur: Page Factory verfijnt POM door gebruik te maken van @FindBy annotaties en PageFactory.initElements() voor automatische WebElement-initialisatie, waardoor repetitieve findElement noemt.
  • Prestatieoptimalisatie: AjaxElementLocatorFactory introduceert lazy loading: elementen worden alleen gevonden wanneer ze worden benaderd. Dit verbetert de uitvoeringsefficiรซntie en zorgt voor een soepele verwerking van dynamisch paginagedrag.
  • Resultaat: De uniforme aanpak resulteert in een onderhoudbare, leesbare en schaalbare testautomatiseringsarchitectuur die is afgestemd op moderne Selenium praktijken.

Pagina-objectmodel

Wat is een pagina-objectmodel? Wat zijn de belangrijkste componenten?

Paginaobjectmodel (POM) is een ontwerppatroon dat veel wordt gebruikt in testautomatisering en dat een objectrepository creรซert voor web-UI-elementen. Het voordeel van dit model is dat het codeduplicatie vermindert en het testonderhoud verbetert.

In dit model zou er voor elke webpagina in de applicatie een bijbehorende paginaklasse moeten zijn. Deze paginaklasse identificeert de webelementen van die webpagina en bevat ook paginamethoden die bewerkingen op die webelementen uitvoeren. De namen van deze methoden moeten worden opgegeven op basis van de taak die ze uitvoeren. Als een loader bijvoorbeeld wacht tot de betalingsgateway verschijnt, kan de POM-methode de naam waitForPaymentScreenDisplay() hebben.

Belangrijkste componenten van het pagina-objectmodel

  • Paginaklassen: Geef elke webpagina weer als een aparte klasse.
  • Locators: Identificeer webelementen met behulp van ID's, XPaths of CSS-selectors.
  • Methoden: Bevatten acties of bewerkingen die worden uitgevoerd op de .page-elementen.
  • Herbruikbaarheid: Promohergebruik van tes-code en eenvoudiger onderhoud tijdens tests.
  • Scheiding van zorgen: Houdt de paginastructuur onafhankelijk van de testlogica voor een betere organisatie.

Pagina-objectmodel

Waarom een โ€‹โ€‹paginaobjectmodel?

Een UI-automatisering starten in Selenium webdriver is GEEN moeilijke taak. Je hoeft alleen maar elementen te vinden en er bewerkingen op uit te voeren.

Denk aan dit eenvoudige script om in te loggen op een website.

Pagina-objectmodel

Zoals je kunt zien, is het enige wat we doen het vinden van elementen en het invullen van waarden voor die elementen.

Dit is een tijdrovend script dat gevoelig is voor fouten. Het lijkt in eerste instantie eenvoudig, maar naarmate de testsuite groeit, wordt het beheren van elementwijzigingen lastiger. Maar na verloop van tijd zal de testsuite groeien. Naarmate je meer regels aan je code toevoegt, wordt het lastiger.

Het grootste probleem met scriptonderhoud is dat als tien verschillende scripts hetzelfde pagina-element gebruiken, je bij elke wijziging in dat element alle tien de scripts moet wijzigen. Dit is tijdrovend en foutgevoelig.

Een betere aanpak voor scriptonderhoud is het aanmaken van een apart klassebestand dat webelementen vindt, vult of verifieert. Deze klasse kan vervolgens worden hergebruikt in meerdere testscripts die met hetzelfde element interacteren. Als er in de toekomst een wijziging in het webelement plaatsvindt, hoeven we de wijziging slechts in รฉรฉn klassebestand door te voeren in plaats van in 10 verschillende scripts.

Deze aanpak wordt Page Object Model genoemd SeleniumHet zorgt ervoor dat de code beter leesbaar, beter onderhoudbaar en herbruikbaar wordt.

 Pagina-objectmodel

๐Ÿ‘‰ Schrijf je gratis in voor Live Selenium Project

Voordelen van POM

  1. Page Object Design Pattern zegt dat bewerkingen en stromen in de UI gescheiden moeten worden van verificatie. Dit concept maakt onze code schoner en gemakkelijk te begrijpen.
  2. Het tweede voordeel is dat de objectrepository onafhankelijk is van testcases, waardoor we dezelfde objectrepository voor verschillende doeleinden en met verschillende tools kunnen gebruiken. Zo kunnen we bijvoorbeeld het Page Object Model integreren in Selenium with TestNG/JUnit voor functioneel Testen en tegelijkertijd met JBehave/Cucumber voor acceptatietesten.
  3. Code Het wordt kleiner en geoptimaliseerd doordat paginamethoden in de POM-klassen worden hergebruikt.
  4. Methoden krijgen realistischere namen die eenvoudig kunnen worden gekoppeld aan de bewerking die in de gebruikersinterface wordt uitgevoerd. Als we bijvoorbeeld op de startpagina terechtkomen nadat we op de knop hebben geklikt, ziet de methodenaam er bijvoorbeeld zo uit: 'gotoHomePage()'.

Hoe POM te implementeren in Selenium?

Eenvoudige PLog in de fundamentele structuur van een Page Object Model-framework, waarbij de whereManagereIDElements van de AUT en de methoden die op deze webelementen werken, worden bijgehouden in een clogbestand. Een taak als verificatie zou apart onderdeel moeten zijn van testmethoden.

POM implementeren

Compleet voorbeeld

Testcase: Ga naar Guru99 Demo-site.

Stap 1) Ga naar Guru99 Demo-site

POM implementeren

Stap 2) Controleer op de homepage of de tekst โ€œGuru"99 Bank" is aanwezig

POM implementeren

Stap 3) Log in op de applicatie

POM implementeren

Stap 4) Controleer of de startpagina tekst bevat als โ€œManger Id: demoโ€

POM implementeren

In dit voorbeeld hebben we te maken met twee pagina's:

  1. Login Pagina
  2. Homepagina (wordt weergegeven zodra u inlogt)

Dienovereenkomstig creรซren we 2 POM in Selenium klassen

Guru99 Inlogpagina 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 Startpagina POM in 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 eenvoudige POM in Selenium Testgeval

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"));
    }

Waar zit Page Factory in? Selenium?

Pagina Fabriek in Selenium is een ingebouwd Page Object Model-frameworkconcept voor Selenium WebDriver die de onderhoudbaarheid verbetert door het verminderen van herhaaldelijke elementopzoekingen met behulp van annotaties, niet door de uitvoeringssnelheid. Het wordt gebruikt voor de initialisatie van pagina-objecten of om het pagina-object zelf te instantiรซren. Het wordt ook gebruikt om elementen van de paginaklasse te initialiseren zonder "FindElement/s" te gebruiken.

Ook hier volgen we het concept van scheiding tussen Page Object Repository en Testmethoden. Bovendien, met behulp van de klasse PageFactory in Selenium, gebruiken we annotaties @FindBy om WebElement te vinden. We gebruiken de initElements-methode om webelementen te initialiseren.

Pagina Fabriek In Selenium

@FindBy kan accepteren tagName, gedeeltelijkeLinkText, naam, linkText, id, css, className, xpath als attributen.

Laten we naar hetzelfde voorbeeld als hierboven kijken met behulp van Page Factory

Guru99 Inlogpagina met 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 Startpagina met 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 testcases met het Page Factory-concept

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"));
    }
}

De volledige projectstructuur ziet eruit als het diagram:

Pagina Fabriek in Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory is een lazyloadingconcept van PageFactory in SeleniumHet wordt gebruikt om webelementen alleen te vinden wanneer de elementen in een bewerking worden gebruikt. Het wijst een time-out toe voor WebElements aan de objectpaginaklasse. Een van de belangrijkste voordelen van het gebruik van het PageFactory-patroon in Selenium is AjaxElementLocatorFactory-klasse.

Wanneer hier een bewerking op een element wordt uitgevoerd, begint het wachten op de zichtbaarheid ervan pas vanaf dat moment. Als het element niet binnen het opgegeven tijdsinterval wordt gevonden, Testgeval uitvoering genereert de uitzondering 'NoSuchElementException'.

AjaxElement-locatorfabriek

Bijvoorbeeld:

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

Download de Selenium Projectbestanden voor de demo in deze zelfstudie

Veelgestelde vragen

Het Page Object Model is een ontwerppatroon dat abstraheerttracHet onderbrengen van webpagina-elementen in aparte klassen vereenvoudigt de automatisering door UI-interacties te scheiden van de testlogica, wat de duidelijkheid, schaalbaarheid en code-duplicatie bevordert.

In SeleniumPOM representeert elke webpagina als een speciale klasse met locators en acties. Het kapselt UI-elementen in, waardoor testscripts onafhankelijk blijven van onderliggende wijzigingen in de paginastructuur.

POM is geen op zichzelf staand framework, maar een ontwerppatroon. Het kan in elk automatiseringsframework worden geรฏntegreerd om tests efficiรซnt te structureren en zo een betere organisatie, herbruikbaarheid en onderhoudbaarheid te garanderen.

POM is een ontwerpprincipe waarbij elke webpagina wordt gemodelleerd als een klasse met gedefinieerde locators en methoden. Het ontkoppelt testlogica van UI-elementen, wat de leesbaarheid, schaalbaarheid en het onderhoud op lange termijn verbetert.

POM definieert de ontwerpstructuur voor pagina-abstractie, terwijl Page Factory annotaties en methoden biedt (@FindBy) voor het efficiรซnt initialiseren van webelementen. Page Factory is een implementatieverbetering van POM.

POM centraliseert elementlocators en pagina-acties binnen speciale klassen. Elke wijziging in de gebruikersinterface vereist updates op slechts รฉรฉn plek, waardoor herbewerking wordt geminimaliseerd, hergebruik van code wordt verbeterd en testonderhoud wordt versneld.

Ja. AI-gestuurde testgeneratoren kunnen automatisch POM-klassen maken door UI-hiรซrarchieรซn te analyseren. Zo blijft de logische scheiding van aandachtspunten behouden en wordt het end-to-end maken van tests versneld.

POM bevordert modulaire en herbruikbare testcomponenten en maakt integratie mogelijk met op AI gebaseerde testonderhoudstools die locators automatisch bijwerken, waardoor de kwetsbaarheid van scripts en de onderhoudskosten worden verminderd.

Vat dit bericht samen met: