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.

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.
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.
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.
๐ Tilmeld dig gratis live Selenium Projekt
Fordele ved POM
- 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รฅ.
- 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.
- Code bliver mindre og optimeret, fordi den genbruger sidemetoder i POM-klasserne.
- 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.
Komplet eksempel
test sag: Gรฅ til Guru99 Demoside.
Trin 1) Gรฅ til Guru99 Demoside
Trin 2) Pรฅ hjemmesiden skal du kontrollere, at teksten "Guru"99 Bank" er til stede
Trin 3) Log ind pรฅ applikationen
Trin 4) Bekrรฆft, at hjemmesiden indeholder tekst som "Manger Id: demo"
I dette eksempel har vi at gรธre med to sider:
- Login-side
- 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.
@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:
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.
For eksempel:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Download Selenium Projektfiler til demoen i denne vejledning











