Sivun kohteen malli ja tehdas Selenium
Mikä on sivuobjektimalli?
Sivun objektimalli (POM) on suunnittelumalli, jota käytetään yleisesti testiautomaatiossa ja joka luo objektivaraston web-käyttöliittymäelementeille. Mallin etuna on, että se vähentää koodin päällekkäisyyttä ja parantaa testien ylläpitoa.
Tässä mallissa jokaisella sovelluksen verkkosivulla tulisi olla vastaava sivuluokka. Tämä Page-luokka tunnistaa kyseisen verkkosivun WebElementit ja sisältää myös sivumenetelmiä, jotka suorittavat toimintoja näille WebElementeille. Näiden menetelmien nimet tulee antaa niiden suorittaman tehtävän mukaan, eli jos lataaja odottaa maksuyhdyskäytävän ilmestymistä, POM-menetelmän nimi voi olla waitForPaymentScreenDisplay().
Miksi sivuobjektimalli?
Käyttöliittymän automatisoinnin käynnistäminen Selenium WebDriver EI ole vaikea tehtävä. Sinun tarvitsee vain löytää elementtejä, suorittaa toimintoja sille.
Harkitse tätä yksinkertaista komentosarjaa kirjautuaksesi verkkosivustolle
Kuten huomaat, me vain etsimme elementtejä ja täytämme niille elementtejä.
Tämä on pieni käsikirjoitus. Skriptin ylläpito näyttää helpolta. Mutta ajan myötä testipaketti kasvaa. Kun lisäät yhä enemmän rivejä koodiisi, asiat muuttuvat vaikeiksi.
Komentosarjojen ylläpidon suurin ongelma on, että jos 10 eri komentosarjaa käyttää samaa sivuelementtiä, sinun on vaihdettava kaikki 10 komentosarjaa, jos elementtiä muutetaan. Tämä on aikaa vievää ja virhealtista.
Parempi tapa skriptien ylläpitoon on luoda erillinen luokkatiedosto, joka löytää verkkoelementtejä, täyttää ne tai tarkistaa ne. Tätä luokkaa voidaan käyttää uudelleen kaikissa kyseistä elementtiä käyttävistä skripteistä. Jatkossa, jos verkkoelementissä tapahtuu muutos, meidän on tehtävä muutos vain yhteen luokkatiedostoon, ei kymmeneen eri komentosarjaan.
Tätä lähestymistapaa kutsutaan sivuobjektimalliksi Selenium. Se auttaa tekemään koodista luettavamman, ylläpidettävämmän ja uudelleenkäytettävän.
POM:n edut
- Page Object Design Pattern sanoo, että käyttöliittymän toiminnot ja virrat tulee erottaa todentamisesta. Tämä konsepti tekee koodistamme selkeämmän ja helposti ymmärrettävän.
- Toinen etu on, että objektivarasto on riippumaton testitapauksista, joten voimme käyttää samaa objektivarastoa eri tarkoitukseen eri työkaluilla. Voimme esimerkiksi integroida sivuobjektimallin Selenium with TestNG/JUnit toiminnallisille Testaus ja samaan aikaan JBehaven kanssa/Cucumber hyväksymistestausta varten.
- Koodi vähenee ja optimoidaan POM-luokkien uudelleenkäytettävien sivumenetelmien ansiosta.
- Menetelmät saavat realistisempia nimiä, jotka voidaan helposti kartoittaa käyttöliittymässä tapahtuvan toiminnan kanssa. eli jos painikkeen painamisen jälkeen pääsemme kotisivulle, menetelmän nimi on kuin 'gotoHomePage()'.
Kuinka ottaa POM käyttöön?
Yksinkertainen POM:
Se on sivuobjektimallikehyksen perusrakenne, jossa kaikki Web-elementit AUT ja näissä Web-elementeissä toimiva menetelmä säilytetään luokkatiedostossa.Tehtävän, kuten todentamisen, tulisi olla erillinen osana Testimenetelmiä.
Täydellinen esimerkki
Testitapaus: Siirry Guru99-demosivustolle.
Vaihe 1) Siirry Guru99-demosivustolle
Vaihe 2) Kotisivulla on tarkistusteksti "Guru99 Bank".
Vaihe 3) Kirjaudu sisään sovellukseen
Vaihe 4) Varmista, että kotisivulla on tekstiä "Manger Id: demo"
Tässä käsittelemme 2 sivua
- Kirjaudu Page
- Kotisivu (näkyy, kun kirjaudut sisään)
Sen mukaisesti luomme 2 POM-in Selenium luokat
Guru99 Kirjautumissivu 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 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 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 kotisivu POM sisään 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 Simple POM sisään Selenium Testitapaus
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("manger id : mgr123")); }
Mitä Page Factory sisältää Selenium?
Sivun tehdas sisään Selenium on sisäänrakennettu Page Object Model -kehyskonsepti Selenium WebDriver, mutta se on erittäin optimoitu. Sitä käytetään sivu-objektien alustamiseen tai itse sivu-objektin luomiseen. Sitä käytetään myös sivuluokan elementtien alustamiseen ilman "FindElement/s" käyttöä.
Tässäkin noudatamme käsitettä sivuobjektivaraston ja testimenetelmien erottamisesta. Lisäksi luokan PageFactory in avulla Selenium, käytämme huomautuksia @FindBy löytääksesi WebElementin. Käytämme initElements-menetelmää verkkoelementtien alustamiseen
@FindBy voi hyväksyä tagName, partialLinkText, name, linkText, id, css, className, xpath määritteinä.
Katsotaanpa samaa esimerkkiä kuin yllä käyttäen Page Factory -ohjelmaa
Guru99 kirjautumissivu Page Factorylla
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 kotisivu sivutehtaalla
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 Page Factory -konseptilla
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("manger id : mgr123")); } }
Täydellinen projektirakenne näyttää kaaviolta:
AjaxElementLocatorFactory
AjaxElementLocatorFactory on PageFactory in laiska latauskonsepti Selenium. Sitä käytetään verkkoelementtien etsimiseen vain, kun elementtejä käytetään missä tahansa toiminnassa. Se määrittää WebElementeille aikakatkaisun objektisivuluokalle. Yksi PageFactory-kuvion käytön tärkeimmistä eduista Selenium on AjaxElementLocatorFactory-luokka.
Tässä kun elementille suoritetaan toimenpide, sen näkyvyyden odotus alkaa vasta siitä hetkestä. Jos elementtiä ei löydy annetulla aikavälillä, Testitapaus suoritus aiheuttaa NoSuchElementException-poikkeuksen.
Yhteenveto
- Sivun objektimalli sisään Selenium WebDriver on Object Repository -suunnittelumalli.
- Selenium sivuobjektimalli luo testauskoodimme ylläpidettäväksi, uudelleen käytettäväksi.
- Page Factory on optimoitu tapa luoda objektivarasto Page Object Model -kehyskonseptissa.
- AjaxElementLocatorFactory on Page Factoryn laiska latauskonsepti – sivuobjektin suunnittelumalli, joka tunnistaa WebElementit vain, kun niitä käytetään missä tahansa toiminnossa.
Lataa Selenium Projektitiedostot esittelyä varten tässä opetusohjelmassa