Pagina-objectmodel (POM) & Page Factory in Selenium Tutorial

Inhoudsopgave:

Anonim

Wat is een pagina-objectmodel?

Page Object Model (POM) is een ontwerppatroon dat in de volksmond wordt gebruikt in testautomatisering waarmee Object Repository voor web-UI-elementen wordt gemaakt. Het voordeel van het model is dat het codeduplicatie vermindert en het testonderhoud verbetert.

Onder dit model moet er voor elke webpagina in de toepassing een overeenkomstige paginaklasse zijn. Deze paginaklasse identificeert de WebElements van die webpagina en bevat ook paginamethoden die bewerkingen op die WebElements uitvoeren. De naam van deze methoden moet worden opgegeven volgens de taak die ze uitvoeren, dwz als een lader wacht tot de betalingsgateway verschijnt, kan de naam van de POM-methode waitForPaymentScreenDisplay () zijn.

In deze tutorial leer je-

  • Waarom pagina-objectmodel?
  • Voordelen van POM
  • Hoe POM implementeren?
  • Wat is Page Factory?
  • Guru99 TestCase met Page Factory-concept
  • AjaxElementLocatorFactory

Waarom pagina-objectmodel?

Het starten van een UI-automatisering in Selenium WebDriver is GEEN moeilijke taak. Je hoeft alleen maar elementen te vinden, er bewerkingen op uit te voeren.

Overweeg dit eenvoudige script om in te loggen op een website

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

Dit is een klein script. Scriptonderhoud ziet er eenvoudig uit. Maar met de tijd zal de testsuite groeien. Naarmate u steeds meer regels aan uw code toevoegt, wordt het moeilijk.

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

Een betere benadering van scriptonderhoud is om een ​​apart klassenbestand te maken dat webelementen kan vinden, vullen of verifiëren. Deze klasse kan worden hergebruikt in alle scripts die dat element gebruiken. Als er in de toekomst een wijziging in het webelement is, moeten we de wijziging in slechts 1 klassebestand aanbrengen en niet in 10 verschillende scripts.

Deze benadering heet Page Object Model in Selenium. Het helpt de code beter leesbaar, onderhoudbaar en herbruikbaar te maken.

Voordelen van POM

  1. Page Object Design Pattern zegt dat bewerkingen en stromen in de gebruikersinterface moeten worden gescheiden van verificatie. Dit concept maakt onze code schoner en gemakkelijk te begrijpen.
  2. Het tweede voordeel is dat de objectrepository onafhankelijk is van testcases, dus we kunnen dezelfde objectrepository gebruiken voor een ander doel met verschillende tools. Zo kunnen we Page Object Model in Selenium integreren met TestNG / JUnit voor functioneel testen en tegelijkertijd met JBehave / Cucumber voor acceptatietesten.
  3. Code wordt minder en geoptimaliseerd vanwege de herbruikbare paginamethoden in de POM-klassen.
  4. Methoden krijgen meer realistische namen die gemakkelijk in kaart kunnen worden gebracht met de bewerking die plaatsvindt in de gebruikersinterface. dwz als we na het klikken op de knop op de startpagina terechtkomen, zal de naam van de methode zijn als 'gotoHomePage ()'.

Hoe POM implementeren?

Eenvoudige POM:

Het is de basisstructuur van het Page-objectmodelraamwerk waar alle webelementen van de AUT en de methode die op deze webelementen werken, worden bijgehouden in een klassenbestand. Een taak als verificatie moet afzonderlijk worden uitgevoerd als onderdeel van testmethoden.

Compleet voorbeeld

TestCase: Ga naar de Guru99-demosite.

Stap 1) Ga naar de demosite van Guru99
Stap 2) Op de homepagina staat dat de tekst "Guru99 Bank" aanwezig is
Stap 3) Log in op de applicatie
Stap 4) Controleer of de startpagina tekst bevat als "Manager-ID: demo"

Hier hebben we te maken met 2 pagina's

  1. Login pagina
  2. Startpagina (wordt weergegeven zodra u zich aanmeldt)

Dienovereenkomstig creëren we 2 POM in Selenium-klassen

Guru99 Inlogpagina POM

pakketpagina's;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;openbare les Guru99Login {WebDriver-stuurprogramma;By user99GuruName = By.name ("uid");By password99Guru = By.name ("wachtwoord");By titleText = By.className ("barone");By login = By.name ("btnLogin");openbare Guru99Login (WebDriver-stuurprogramma) {this.driver = bestuurder;​// Stel de gebruikersnaam in het tekstvak inpublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);​// Stel wachtwoord in in wachtwoord tekstvakpublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);​// Klik op de login-knopopenbare ongeldige clickLogin () {driver.findElement (login) .click ();​// Haal de titel van de aanmeldingspagina opopenbare String getLoginTitle () {return driver.findElement (titleText) .getText ();​​* Deze POM-methode wordt in testgeval getoond om in te loggen in de applicatie* @param strUserName* @param strPasword* @return​openbare ongeldige loginToGuru99 (String strUserName, String strPasword) {// Vul gebruikersnaam inthis.setUserName (strUserName);// Vul wachtwoord inthis.setPassword (strPasword);// Klik op de knop Loginthis.clickLogin ();​​

Guru99 Home Page POM in Selenium

pakketpagina's;import org.openqa.selenium.By;importeer org.openqa.selenium.WebDriver;openbare klas Guru99HomePage {WebDriver-stuurprogramma;By homePageUserName = By.xpath ("// table // tr [@ class = 'heading3']");openbare Guru99HomePage (WebDriver-stuurprogramma) {this.driver = bestuurder;​// Haal de gebruikersnaam op van de startpaginaopenbare String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();​​

Guru99 Simple POM in Selenium Testcase

pakkettest;importeer java.util.concurrent.TimeUnit;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.Assert;importeer org.testng.annotations.BeforeTest;importeer org.testng.annotations.Test;pagina's importeren.Guru99HomePage;pagina's importeren.Guru99Login;openbare klasse Test99GuruLogin {String driverPath = "C: \\ geckodriver.exe";WebDriver-stuurprogramma;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestopenbare ongeldige instelling () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");​​* Deze testcase zal inloggen op http://demo.guru99.com/V4/* Verifieer de titel van de inlogpagina als guru99 bank* Log in op de applicatie* Verifieer de startpagina met behulp van het Dashboard-bericht​@Test (prioriteit = 0)openbare ongeldige test_Home_Page_Appear_Correct () {// Aanmeldingspagina-object makenobjLogin = nieuwe Guru99Login (stuurprogramma);// Controleer de titel van de aanmeldingspaginaString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Bevat ("guru99 bank"));// login op applicatieobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// ga naar de volgende paginaobjHomePage = nieuwe Guru99HomePage (stuurprogramma);// Verifieer de startpaginaAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Bevat ("manager-id: mgr123"));​

Wat is Paginafabriek in Selenium?

Page Factory in Selenium is een ingebouwd Page Object Model Framework-concept voor Selenium WebDriver, maar het is sterk geoptimaliseerd. Het wordt gebruikt voor het initialiseren van pagina-objecten of om het pagina-object zelf te instantiëren. Het wordt ook gebruikt om Page-klasse-elementen te initialiseren zonder "FindElement / s" te gebruiken.

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

@FindBy kan tagName , PartialLinkText, name, linkText, id, css, className, xpath als attributen accepteren .

Laten we naar hetzelfde voorbeeld kijken als hierboven met Page Factory

Guru99 Login-pagina met Page Factory

pakket PageFactory;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.support.FindBy;importeer org.openqa.selenium.support.PageFactory;openbare les Guru99Login {​* Alle WebElements worden geïdentificeerd door @FindBy-annotatie​WebDriver-stuurprogramma;@FindBy (name = "uid")WebElement user99GuruName;@FindBy (name = "wachtwoord")WebElement wachtwoord99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (naam = "btnLogin")Inloggen bij WebElement;openbare Guru99Login (WebDriver-stuurprogramma) {this.driver = bestuurder;// Deze initElements-methode zal alle WebElements makenPageFactory.initElements (stuurprogramma, dit);​// Stel de gebruikersnaam in het tekstvak inpublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);​// Stel wachtwoord in in wachtwoord tekstvakpublic void setPassword (String strPassword) {wachtwoord99Guru.sendKeys (strPassword);​// Klik op de login-knopopenbare ongeldige clickLogin () {login.click ();​// Haal de titel van de aanmeldingspagina opopenbare String getLoginTitle () {retourneer titleText.getText ();​​* Deze POM-methode wordt in testgeval getoond om in te loggen in de applicatie* @param strUserName* @param strPasword* @return​openbare ongeldige loginToGuru99 (String strUserName, String strPasword) {// Vul gebruikersnaam inthis.setUserName (strUserName);// Vul wachtwoord inthis.setPassword (strPasword);// Klik op de knop Loginthis.clickLogin ();​​

Guru99-startpagina met Page Factory

pakket PageFactory;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.WebElement;importeer org.openqa.selenium.support.FindBy;importeer org.openqa.selenium.support.PageFactory;openbare klas Guru99HomePage {WebDriver-stuurprogramma;@FindBy (xpath = "// table // tr [@ class = 'heading3']")WebElement homePageUserName;openbare Guru99HomePage (WebDriver-stuurprogramma) {this.driver = bestuurder;// Deze initElements-methode zal alle WebElements makenPageFactory.initElements (stuurprogramma, dit);​// Haal de gebruikersnaam op van de startpaginaopenbare String getHomePageDashboardUserName () {terugkeer homePageUserName.getText ();​​

Guru99 TestCase met Page Factory-concept

pakkettest;importeer java.util.concurrent.TimeUnit;importeer org.openqa.selenium.WebDriver;importeer org.openqa.selenium.firefox.FirefoxDriver;importeer org.testng.Assert;importeer org.testng.annotations.BeforeTest;importeer org.testng.annotations.Test;importeer PageFactory.Guru99HomePage;importeer PageFactory.Guru99Login;openbare klasse Test99GuruLoginWithPageFactory {String driverPath = "C: \\ geckodriver.exe";WebDriver-stuurprogramma;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestopenbare ongeldige instelling () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nieuwe FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");​​* Deze test gaat naar http://demo.guru99.com/V4/* Verifieer de titel van de inlogpagina als guru99 bank* Log in op de applicatie* Verifieer de startpagina met behulp van het Dashboard-bericht​@Test (prioriteit = 0)openbare ongeldige test_Home_Page_Appear_Correct () {// Aanmeldingspagina-object makenobjLogin = nieuwe Guru99Login (stuurprogramma);// Controleer de titel van de aanmeldingspaginaString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Bevat ("guru99 bank"));// login op applicatieobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// ga naar de volgende paginaobjHomePage = nieuwe Guru99HomePage (stuurprogramma);// Verifieer de startpaginaAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Bevat ("manager-id: mgr123"));​​

De volledige projectstructuur ziet eruit als het diagram:

AjaxElementLocatorFactory

AjaxElementLocatorFactory is een lui laadconcept van PageFactory in Selenium. Het wordt alleen gebruikt om de webelementen 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 patroon PageFactory in Selenium is AjaxElementLocatorFactory Class.

Hier, wanneer een bewerking wordt uitgevoerd op een element, begint het wachten op zijn zichtbaarheid pas vanaf dat moment. Als het element niet wordt gevonden in het opgegeven tijdsinterval, genereert de uitvoering van Test Case de uitzondering 'NoSuchElementException'.

Overzicht

  1. Page Object Model in Selenium Websdriver is een ontwerppatroon voor Object Repository.
  2. Selenium-paginaobjectmodel creëert onze testcode onderhoudbaar, herbruikbaar.
  3. Page Factory is een geoptimaliseerde manier om een ​​objectrepository te maken in het Page Object Model Framework-concept.
  4. AjaxElementLocatorFactory is een lazy load-concept in Page Factory - pagina-objectontwerppatroon om WebElements alleen te identificeren wanneer ze in een bewerking worden gebruikt.

Download de Selenium-projectbestanden voor de demo in deze zelfstudie