Sideobjektmodel og fabrik i Selenium

โšก Smart opsummering

Sideobjektmodel og Page Factory i Selenium definere et struktureret designmรธnster til opbygning af robuste, vedligeholdelige testautomatiseringsframeworks. Det lรฆgger vรฆgt pรฅ at skabe sidespecifikke klasser, der indkapsler WebElements og deres adfรฆrd, hvorved duplikering reduceres og lรฆsbarheden og skalerbarheden forbedres. Selenium testscripts.

  • Kernekoncept: Hver applikationsside svarer til en dedikeret sideklasse, der indeholder bรฅde WebElements og de handlinger, der udfรธres pรฅ dem, hvilket muliggรธr en klar adskillelse mellem brugergrรฆnsefladestruktur og testlogik.
  • Implementeringsfokus: POM fremmer genanvendelig og centraliseret elementstyring โ€“ รฆndringer af sideelementer krรฆver opdateringer i kun รฉn klasse i stedet for flere scripts.
  • Design fordel: Modellen sikrer renere, modulรฆre og vรฆrktรธjsuafhรฆngige objektlagre, der kan integreres med frameworks som f.eks. TestNG, JUnit, Cucumber, eller JBehave.
  • Navngivningskonvention: Metoder i sideklasser skal afspejle faktiske handlinger i brugergrรฆnsefladen (f.eks. gotoHomePage()), styrkelse af semantisk klarhed i automatiseringsarbejdsgange.
  • Forbedret struktur: Page Factory forfiner POM ved hjรฆlp af @FindBy annotationer og PageFactory.initElements() til automatisk WebElement-initialisering, hvilket eliminerer gentagne findElement opkald.
  • Ydeevneoptimering: AjaxElementLocatorFactory introducerer lazy loading โ€“ elementer findes kun, nรฅr de tilgรฅs โ€“ hvilket forbedrer udfรธrelseseffektiviteten og hรฅndterer dynamisk sideadfรฆrd problemfrit.
  • Resultat: Den samlede tilgang resulterer i en vedligeholdelig, lรฆsbar og skalerbar testautomatiseringsarkitektur, der er i overensstemmelse med moderne Selenium praksis.

Sideobjektmodel

Hvad er en sideobjektmodel? Hvad er dens nรธglekomponenter?

Sideobjektmodel (POM) er et designmรธnster, der er populรฆrt brugt i testautomatisering, og som opretter et objektlager til web-UI-elementer. Fordelen ved modellen er, at den reducerer kodeduplikering og forbedrer testvedligeholdelse.

I denne model skal der for hver webside i applikationen vรฆre en tilsvarende sideklasse. Denne sideklasse identificerer WebElements pรฅ den pรฅgรฆldende webside og indeholder ogsรฅ sidemetoder, der udfรธrer handlinger pรฅ disse WebElements. Navnene pรฅ disse metoder skal angives i henhold til den opgave, de udfรธrer. Dvs. hvis en loader venter pรฅ, at betalingsgatewayen vises, kan POM-metodenavnet vรฆre waitForPaymentScreenDisplay().

Nรธglekomponenter i sideobjektmodellen

  • Sideklasser: Reprรฆsenter hver webside som en separat klasse.
  • Lokaliseringssteder: Identificer webelementer ved hjรฆlp af ID'er, XPaths eller CSS-selektorer.
  • Metoder: Indeholder handlinger eller operationer udfรธrt pรฅ .page-elementerne.
  • Genanvendelighed: PromoGenbrug af tes-kode og nemmere vedligeholdelse pรฅ tvรฆrs af tests.
  • Adskillelse af bekymringer: Holder sidestrukturen uafhรฆngig af testlogik for bedre organisering.

Sideobjektmodel

Hvorfor sideobjektmodel?

Start af en UI-automatisering i Selenium webdriver er IKKE en svรฆr opgave. Du skal bare finde elementer og udfรธre operationer pรฅ dem.

Overvej dette simple script til at logge ind pรฅ en hjemmeside.

Sideobjektmodel

Som du kan se, er alt, hvad vi gรธr, at finde elementer og udfylde vรฆrdier for disse elementer.

Dette er et tidskrรฆvende script, der er fejlbehรฆftet. Det virker nemt i starten, men efterhรฅnden som testpakken udvides, bliver det vanskeligt at administrere elementรฆndringer. Men med tiden vil testpakken vokse. Efterhรฅnden som du tilfรธjer flere og flere linjer til din kode, bliver tingene svรฆre.

Det stรธrste problem med scriptvedligeholdelse er, at hvis 10 forskellige scripts bruger det samme sideelement, med enhver รฆndring i det element, skal du รฆndre alle 10 scripts. Dette er tidskrรฆvende og fejludsat.

En bedre tilgang til scriptvedligeholdelse er at oprette en separat klassefil, der kan finde webelementer, udfylde dem eller verificere dem. Denne klasse kan derefter genbruges pรฅ tvรฆrs af flere testscripts, der interagerer med det samme element. Hvis der fremover sker en รฆndring i webelementet, skal vi kun foretage รฆndringen i รฉn klassefil og ikke i 10 forskellige scripts.

Denne tilgang kaldes Page Object Model i SeleniumDet hjรฆlper med at gรธre koden mere lรฆsbar, vedligeholdelsesvenlig og genanvendelig.

 Sideobjektmodel

๐Ÿ‘‰ Tilmeld dig gratis live Selenium Projekt

Fordele ved POM

  1. Page Object Design Pattern siger, at operationer og flows i brugergrรฆnsefladen skal adskilles fra verifikation. Dette koncept gรธr vores kode renere og nem at forstรฅ.
  2. Den anden fordel er, at objektarkivet er uafhรฆngigt af testcases, sรฅ vi kan bruge det samme objektarkiv til forskellige formรฅl med forskellige vรฆrktรธjer. For eksempel kan vi integrere Page Object Model i Selenium med TestNG/JUnit til funktionel Test og samtidig med JBehave/Cucumber til accepttest.
  3. Code bliver mindre og optimeret, fordi den genbruger sidemetoder i POM-klasserne.
  4. Metoder fรฅr mere realistiske navne, der nemt kan knyttes til den handling, der sker i brugergrรฆnsefladen. Dvs. hvis vi lander pรฅ hjemmesiden efter at have klikket pรฅ knappen, vil metodenavnet vรฆre som 'gotoHomePage()'.

Sรฅdan implementerer du POM i Selenium?

Simpel PLog i den grundlรฆggende struktur af et Page Object Model-framework, hvor whereManagereIDE-elementerne i AUT og metoden, der opererer pรฅ disse webelementer, vedligeholdes i en tilstoppet fil. En opgave som verifikation bรธr vรฆre separat som en del af testmetoder.

Implementer POM

Komplet eksempel

test sag: Gรฅ til Guru99 Demoside.

Trin 1) Gรฅ til Guru99 Demoside

Implementer POM

Trin 2) Pรฅ hjemmesiden skal du kontrollere, at teksten "Guru"99 Bank" er til stede

Implementer POM

Trin 3) Log ind pรฅ applikationen

Implementer POM

Trin 4) Bekrรฆft, at hjemmesiden indeholder tekst som "Manger Id: demo"

Implementer POM

I dette eksempel har vi at gรธre med to sider:

  1. Login-side
  2. Hjemmeside (vises, nรฅr du logger ind)

Derfor opretter vi 2 POM i Selenium klasser

Guru99 Login-side 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 Hjemmeside POM i 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 Simpel POM i Selenium Test tilfรฆlde

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

Hvad er Page Factory i Selenium?

Page Factory i Selenium er et indbygget Page Object Model-rammekoncept til Selenium WebDriver, der forbedrer vedligeholdelsen ved at reducere gentagne elementopslag ved hjรฆlp af annotationer, ikke ved udfรธrelseshastighed. Den bruges til initialisering af sideobjekter eller til at instantiere selve sideobjektet. Den bruges ogsรฅ til at initialisere sideklasseelementer uden at bruge "FindElement/s".

Ogsรฅ her fรธlger vi konceptet om adskillelse af Page Object Repository og testmetoder. Derudover med hjรฆlp fra klassen PageFactory i Selenium, bruger vi anmรฆrkninger @FindBy for at finde WebElement. Vi bruger initElements-metoden til at initialisere webelementer.

Side Factory In Selenium

@FindBy kan acceptere tagName, partialLinkText, name, linkText, id, css, className, xpath som attributter.

Lad os se pรฅ det samme eksempel som ovenfor ved at bruge Page Factory

Guru99 Login-side med 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 Hjemmeside med 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 med Page Factory-konceptet

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

Komplet projektstruktur vil se ud som diagrammet:

Page Factory i Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory er et dovent indlรฆsningskoncept af PageFactory i SeleniumDet bruges kun til at finde webelementer, nรฅr elementerne bruges i en hvilken som helst handling. Det tildeler en timeout for WebElements til objektets sideklasse. En af de vigtigste fordele ved at bruge PageFactory-mรธnsteret i Selenium er AjaxElementLocatorFactory Class.

Her, nรฅr en handling udfรธres pรฅ et element, starter ventetiden pรฅ dets synlighed fรธrst fra det รธjeblik. Hvis elementet ikke findes inden for det givne tidsinterval, Test sag udfรธrelse vil kaste 'NoSuchElementException' undtagelse.

AjaxElement Locator Factory

For eksempel:

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

Download Selenium Projektfiler til demoen i denne vejledning

Ofte Stillede Spรธrgsmรฅl

Sideobjektmodellen er et designmรธnster, der abstracts websideelementer i separate klasser. Det forenkler automatisering ved at adskille brugergrรฆnsefladeinteraktioner fra testlogik, hvilket fremmer klarhed, skalerbarhed og reducerer kodeduplikering.

In Selenium, POM reprรฆsenterer hver webside som en dedikeret klasse, der indeholder locators og handlinger. Den indkapsler UI-elementer, hvilket gรธr det muligt for testscripts at forblive uafhรฆngige af รฆndringer i den underliggende sidestruktur.

POM er ikke et selvstรฆndigt framework, men et designmรธnster. Det kan integreres i ethvert automatiseringsframework for at strukturere tests effektivt, hvilket sikrer bedre organisering, genbrugelighed og vedligeholdelse.

POM er et designprincip, hvor hver webside modelleres som en klasse med definerede lokatorer og metoder. Det afkobler testlogik fra brugergrรฆnsefladeelementer, hvilket forbedrer lรฆsbarhed, skalerbarhed og langsigtet vedligeholdelse.

POM definerer designstrukturen for sideabstraction, mens Page Factory leverer annoteringer og metoder (@FindBy) til effektiv initialisering af webelementer. Page Factory er en implementeringsforbedring af POM.

POM centraliserer elementlokalisering og sidehandlinger i dedikerede klasser. Enhver รฆndring af brugergrรฆnsefladen krรฆver opdateringer รฉt sted, hvilket minimerer omarbejde, forbedrer genbrug af kode og accelererer testvedligeholdelse.

Ja. AI-drevne testgeneratorer kan oprette POM-klasser automatisk ved at analysere UI-hierarkier, opretholde logisk adskillelse af problemstillinger og samtidig accelerere oprettelsen af โ€‹โ€‹end-to-end-tests.

POM fremmer modulรฆre og genanvendelige testkomponenter, hvilket muliggรธr integration med AI-baserede testvedligeholdelsesvรฆrktรธjer, der automatisk opdaterer locators, hvilket reducerer scriptsรฅrbarhed og vedligeholdelsesomkostninger.

Opsummer dette indlรฆg med: