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.
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.
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.
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.
๐ Schrijf je gratis in voor Live Selenium Project
Voordelen van POM
- 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.
- 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.
- Code Het wordt kleiner en geoptimaliseerd doordat paginamethoden in de POM-klassen worden hergebruikt.
- 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.
Compleet voorbeeld
Testcase: Ga naar Guru99 Demo-site.
Stap 1) Ga naar Guru99 Demo-site
Stap 2) Controleer op de homepage of de tekst โGuru"99 Bank" is aanwezig
Stap 3) Log in op de applicatie
Stap 4) Controleer of de startpagina tekst bevat als โManger Id: demoโ
In dit voorbeeld hebben we te maken met twee pagina's:
- Login Pagina
- 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.
@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:
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'.
Bijvoorbeeld:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Download de Selenium Projectbestanden voor de demo in deze zelfstudie












