Sideobjektmodel (POM) & Sidefabrik i selens vejledning

Indholdsfortegnelse:

Anonim

Hvad er sideobjektmodel?

Page Object Model (POM) er et designmønster, der populært bruges i testautomatisering, der opretter Object Repository til web-UI-elementer. Fordelen ved modellen er, at den reducerer duplikering af kode og forbedrer testvedligeholdelsen.

Under denne model skal der for hver webside i applikationen være en tilsvarende sideklasse. Denne sideklasse identificerer WebElements på denne webside og indeholder også sidemetoder, der udfører operationer på disse WebElements. Navnet på disse metoder skal angives i henhold til den opgave, de udfører, dvs. hvis en loader venter på, at betalingsgatewayen vises, kan navnet på POM-metoden være waitForPaymentScreenDisplay ().

I denne vejledning lærer du-

  • Hvorfor sideobjektmodel?
  • Fordele ved POM
  • Hvordan implementeres POM?
  • Hvad er Page Factory?
  • Guru99 TestCase med Page Factory koncept
  • AjaxElementLocatorFactory

Hvorfor sideobjektmodel?

At starte en UI-automatisering i Selenium WebDriver er IKKE en hård opgave. Du skal bare finde elementer, udføre operationer på det.

Overvej dette enkle script for at logge ind på et websted

Som du kan se, er alt, hvad vi laver, at finde elementer og udfylde værdier for disse elementer.

Dette er et lille script. Scriptvedligeholdelse ser let ud. Men med tiden vil testpakken vokse. Når du tilføjer flere og flere linjer til din kode, bliver tingene hårde.

Hovedproblemet med scriptvedligeholdelse er, at hvis 10 forskellige scripts bruger det samme sideelement, med enhver ændring i dette element, skal du ændre alle 10 scripts. Dette er tidskrævende og udsat for fejl.

En bedre tilgang til scriptvedligeholdelse er at oprette en separat klassefil, der finder webelementer, udfylder dem eller bekræfter dem. Denne klasse kan genbruges i alle scripts ved hjælp af dette element. I fremtiden, hvis der er en ændring i webelementet, skal vi foretage ændringen i kun 1 klassefil og ikke 10 forskellige scripts.

Denne tilgang kaldes Page Object Model in Selenium. Det hjælper med at gøre koden mere læsbar, vedligeholdelig og genanvendelig.

Fordele ved POM

  1. Sideobjektdesignmønster siger, at operationer og strømme i brugergrænsefladen skal adskilles fra verifikation. Dette koncept gør vores kode renere og let at forstå.
  2. Den anden fordel er, at objektopbevaringsstedet er uafhængigt af testtilfælde, så vi kan bruge det samme objektopbevaringssted til et andet formål med forskellige værktøjer. For eksempel kan vi integrere Page Object Model i Selen med TestNG / JUnit til funktionel testning og på samme tid med JBehave / Cucumber til accepttest.
  3. Koden bliver mindre og optimeret på grund af de genanvendelige sidemetoder i POM-klasser.
  4. Metoder får mere realistiske navne, som let kan kortlægges med den operation, der sker i brugergrænsefladen. dvs. hvis vi efter at have klikket på knappen lander på hjemmesiden, vil metodens navn være som 'gotoHomePage ()'.

Hvordan implementeres POM?

Enkel POM:

Det er den grundlæggende struktur i Page object model framework, hvor alle webelementer i AUT og metoden, der fungerer på disse webelementer, opretholdes inde i en klassefil. En opgave som verifikation skal være adskilt som en del af testmetoder.

Komplet eksempel

TestCase: Gå til Guru99 Demo Site.

Trin 1) Gå til Guru99 Demo Site
Trin 2) På startsiden er markeringsteksten "Guru99 Bank" til stede
Trin 3) Log ind på applikationen
Trin 4) Kontroller, at hjemmesiden indeholder tekst som "Manger Id: demo"

Her har vi at gøre med to sider

  1. Login side
  2. Startside (vises når du logger ind)

Derfor opretter vi 2 POM i Selenium-klasser

Guru99 Login-side POM

pakke sider;importer org.openqa.selenium.By;import org.openqa.selenium.WebDriver;offentlig klasse Guru99Login {WebDriver driver;Af user99GuruName = By.name ("uid");By password99Guru = By.name ("password");Efter titleText = By.className ("barone");Ved login = By.name ("btnLogin");offentlig Guru99Login (WebDriver-driver) {this.driver = driver;}// Indstil brugernavn i tekstbokspublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Indstil adgangskode i tekstboks med adgangskodepublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Klik på login-knappenoffentligt ugyldigt klikLogin () {driver.findElement (login). klik ();}// Få titlen på login-sidenoffentlig streng getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Denne POM-metode udsættes i test tilfælde for login i applikationen* @param strUserName* @param strPasword* @Vend tilbage* /offentlig ugyldig loginToGuru99 (String strUserName, String strPasword) {// Udfyld brugernavnthis.setUserName (strUserName);// Udfyld adgangskodethis.setPassword (strPasword);// Klik på Login-knappenthis.clickLogin ();}}

Guru99 Hjemmeside POM i selen

pakke sider;importer org.openqa.selenium.By;import org.openqa.selenium.WebDriver;offentlig klasse Guru99HomePage {WebDriver driver;Af homePageUserName = By.xpath ("// tabel // tr [@ class = 'heading3']");offentlig Guru99HomePage (WebDriver-driver) {this.driver = driver;}// Hent brugernavnet fra startsidenoffentlig streng getHomePageDashboardUserName () {returner driver.findElement (homePageUserName) .getText ();}}

Guru99 Simple POM i selen test sag

pakke 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;importer sider. Guru99HomePage;importer sider. Guru99Login;offentlig klasse Test99GuruLogin {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestoffentlig tomrumsopsætning () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Denne test sag logger ind på http://demo.guru99.com/V4/* Bekræft login-sidetitel som guru99-bank* Login til ansøgning* Bekræft startsiden ved hjælp af Dashboard-meddelelsen* /@Test (prioritet = 0)offentlig ugyldig test_Home_Page_Appear_Correct () {// Opret loginsideobjektobjLogin = ny Guru99Login (driver);// Bekræft login-sidens titelString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Indeholder ("guru99 bank"));// login til applikationobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// gå til næste sideobjHomePage = ny Guru99HomePage (driver);// Bekræft startsideAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Indeholder ("krybbe-id: mgr123"));}

Hvad er sidefabrik i selen?

Page Factory in Selenium er et indbygget rammekoncept for Page Object Model til Selenium WebDriver, men det er meget optimeret. Det bruges til initialisering af sideobjekter eller til at instantiere selve sideobjektet. Det bruges også til at initialisere sideklasseelementer uden at bruge "FindElement / s."

Også her følger vi begrebet adskillelse af Page Object Repository og testmetoder. Derudover bruger vi kommentarer fra @FindBy ved hjælp af klasse PageFactory i Selen til at finde WebElement. Vi bruger metoden initElements 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 hjælp af Page Factory

Guru99 Login-side med Page Factory

pakke PageFactory;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;offentlig klasse Guru99Login {/ *** Alle WebElements er identificeret ved @FindBy-kommentar* /WebDriver driver;@FindBy (navn = "uid")WebElement bruger99GuruName;@FindBy (name = "password")WebElement-adgangskode99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (navn = "btnLogin")WebElement login;offentlig Guru99Login (WebDriver-driver) {this.driver = driver;// Denne initElements-metode opretter alle WebElementsPageFactory.initElements (driver, dette);}// Indstil brugernavn i tekstbokspublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Indstil adgangskode i tekstboks med adgangskodepublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Klik på login-knappenoffentligt ugyldigt klikLogin () {login.click ();}// Få titlen på login-sidenoffentlig streng getLoginTitle () {returner titleText.getText ();}/ *** Denne POM-metode udsættes i test tilfælde for login i applikationen* @param strUserName* @param strPasword* @Vend tilbage* /offentlig ugyldig loginToGuru99 (String strUserName, String strPasword) {// Udfyld brugernavnthis.setUserName (strUserName);// Udfyld adgangskodethis.setPassword (strPasword);// Klik på Login-knappenthis.clickLogin ();}}

Guru99-startside med sidefabrik

pakke PageFactory;import org.openqa.selenium.WebDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.support.FindBy;import org.openqa.selenium.support.PageFactory;offentlig klasse Guru99HomePage {WebDriver driver;@FindBy (xpath = "// tabel // tr [@ class = 'heading3']")WebElement homePageUserName;offentlig Guru99HomePage (WebDriver-driver) {this.driver = driver;// Denne initElements-metode opretter alle WebElementsPageFactory.initElements (driver, dette);}// Hent brugernavnet fra startsidenoffentlig streng getHomePageDashboardUserName () {returner homePageUserName.getText ();}}

Guru99 TestCase med Page Factory koncept

pakke 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;importere PageFactory.Guru99HomePage;importere PageFactory.Guru99Login;offentlig klasse Test99GuruLoginWithPageFactory {Streng driverPath = "C: \\ geckodriver.exe";WebDriver driver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestoffentlig tomrumsopsætning () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = ny FirefoxDriver ();driver.manage (). timeouts (). implicitWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Denne test gå til http://demo.guru99.com/V4/* Bekræft login-sidetitel som guru99-bank* Login til ansøgning* Bekræft startsiden ved hjælp af Dashboard-meddelelsen* /@Test (prioritet = 0)offentlig ugyldig test_Home_Page_Appear_Correct () {// Opret loginsideobjektobjLogin = ny Guru99Login (driver);// Bekræft login-sidens titelString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Indeholder ("guru99 bank"));// login til applikationobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// gå til næste sideobjHomePage = ny Guru99HomePage (driver);// Bekræft startsideAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Indeholder ("krybbe-id: mgr123"));}}

Komplet projektstruktur vil se ud som diagrammet:

AjaxElementLocatorFactory

AjaxElementLocatorFactory er et dovendigt ladningskoncept for PageFactory i selen. Det bruges kun til at finde webelementerne, når elementerne bruges i enhver handling. Det tildeler en timeout for WebElements til objektsideklassen. En af de vigtigste fordele ved at bruge mønsteret PageFactory i selen er AjaxElementLocatorFactory Class.

Her, når en operation udføres på et element, starter ventetiden på dets synlighed kun fra det øjeblik. Hvis elementet ikke findes i det givne tidsinterval, kører Test Case-udførelse undtagelsen 'NoSuchElementException'.

Resumé

  1. Page Object Model i Selenium Websdriver er et Object Repository designmønster.
  2. Selen-side-objektmodel opretter vores testkode, der kan vedligeholdes, genanvendes.
  3. Page Factory er en optimeret måde at oprette objektlager på i rammekonceptet Page Object Model.
  4. AjaxElementLocatorFactory er et koncept for doven belastning i Page Factory - design af mønster til sideobjekter, der kun identificerer WebElements, når de bruges i enhver handling.

Download Selenium-projektfiler til demo i denne vejledning