Sivun kohteen malli ja tehdas Selenium

⚡ Älykäs yhteenveto

Sivuobjektimalli ja sivutehdas Selenium määrittelee strukturoidun suunnittelumallin vankkojen ja ylläpidettävien testiautomaatiokehysten rakentamiseksi. Se korostaa sivukohtaisten luokkien luomista, jotka kapseloivat WebElements-elementit ja niiden toiminnan, mikä vähentää päällekkäisyyksiä ja parantaa luettavuutta ja skaalautuvuutta. Selenium testiskriptit.

  • Ydinkonsepti: Jokainen sovellussivu vastaa omaa sivuluokkaansa, joka sisältää sekä verkkoelementit (WebElements) että niille suoritettavat toiminnot, mikä mahdollistaa käyttöliittymärakenteen ja testilogiikan selkeän erottelun.
  • Toteutuksen painopiste: POM edistää uudelleenkäytettävää ja keskitettyä elementtien hallintaa – sivuelementtien muutokset vaativat päivityksiä vain yhdessä luokassa useiden komentosarjojen sijaan.
  • Suunnittelun etu: Malli varmistaa puhtaammat, modulaariset ja työkaluista riippumattomat objektivarastot, jotka voidaan integroida esimerkiksi seuraaviin kehyksiin: TestNG, JUnit, Cucumbertai JBehave.
  • Nimeämissopimus: Sivuluokkien metodien on peilattava todellisia käyttöliittymän toimintoja (esim. gotoHomePage()), mikä vahvistaa semanttista selkeyttä automaatiotyönkuluissa.
  • Parannettu rakenne: Page Factory tarkentaa POM:ia käyttämällä @FindBy merkinnät ja PageFactory.initElements() automaattista WebElement-alustusta varten, mikä poistaa toistuvat findElement puhelut.
  • Suorituskyvyn optimointi: AjaxElementLocatorFactory esittelee laiskan latauksen – elementit paikannetaan vain silloin, kun niitä käytetään – mikä parantaa suoritustehokkuutta ja käsittelee dynaamista sivun toimintaa sulavasti.
  • Tulokset: Yhtenäinen lähestymistapa johtaa ylläpidettävään, luettavaan ja skaalautuvaan testiautomaatioarkkitehtuuriin, joka on linjassa nykyaikaisen Selenium käytäntöjä.

Sivun objektimalli

Mikä on Page Object Model? Mitkä ovat sen keskeiset osat?

Sivun objektimalli (POM) on testiautomaatiossa yleisesti käytetty suunnittelumalli, joka luo objektisäilön verkkokäyttöliittymän elementeille. Mallin etuna on, että se vähentää koodin päällekkäisyyttä ja parantaa testien ylläpitoa.

Tässä mallissa jokaiselle sovelluksen verkkosivulle tulisi olla vastaava sivuluokka. Tämä sivuluokka tunnistaa kyseisen verkkosivun web-elementit (WebElements) ja sisältää myös sivumetodeja (Page Methods), jotka suorittavat toimintoja näille web-elementeille. Näiden metodien nimet tulisi antaa niiden suorittaman tehtävän mukaan, eli jos lataaja odottaa maksuyhdyskäytävän ilmestymistä, POM-metodin nimi voi olla waitForPaymentScreenDisplay().

Sivuobjektimallin keskeiset komponentit

  • Sivuluokat: Esittele jokainen verkkosivu erillisenä luokkana.
  • Paikannin: Tunnista verkkoelementit tunnisteiden, XPath-lausekkeiden tai CSS-valitsimien avulla.
  • Menetelmät: Sisältää .page-elementeille suoritettavia toimintoja tai toimintoja.
  • Uudelleenkäytettävyys: Promotestikoodin uudelleenkäyttö ja helpompi ylläpito eri testien välillä.
  • Huolien erottelu: Pitää sivurakenteen erillään testilogiikasta paremman organisoinnin takaamiseksi.

Sivun objektimalli

Miksi sivuobjektimalli?

Käyttöliittymäautomaation aloittaminen Selenium web-ajuri ei ole vaikea tehtävä. Sinun tarvitsee vain löytää elementtejä ja suorittaa niille laskutoimituksia.

Harkitse tätä yksinkertaista skriptiä verkkosivustolle kirjautumiseen.

Sivun objektimalli

Kuten huomaat, me vain etsimme elementtejä ja täytämme niille elementtejä.

Tämä on aikaa vievä ja virhealtis skripti. Aluksi se vaikuttaa helpolta, mutta testipaketin laajentuessa elementtimuutosten hallinta vaikeutuu. Ajan myötä testipaketti kuitenkin kasvaa. Kun lisäät koodiisi yhä enemmän rivejä, asiat vaikeutuvat.

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 lähestymistapa skriptien ylläpitoon on luoda erillinen luokkatiedosto, joka etsii verkkoelementtejä, täyttää ne tai tarkistaa ne. Tätä luokkaa voidaan sitten käyttää uudelleen useissa testiskripteissä, jotka ovat vuorovaikutuksessa saman elementin kanssa. Tulevaisuudessa, jos verkkoelementtiin tulee muutos, meidän on tehtävä muutos vain yhteen luokkatiedostoon eikä kymmeneen eri skriptiin.

Tätä lähestymistapaa kutsutaan sivuobjektimalliksi SeleniumSe auttaa tekemään koodista luettavampaa, ylläpidettävämpää ja uudelleenkäytettävämpää.

 Sivun objektimalli

👉 Ilmoittaudu ilmaiseen live-lähetykseen Selenium projekti

POM:n edut

  1. 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.
  2. Toinen etu on, että objektivarasto on riippumaton testitapauksista, joten voimme käyttää samaa objektivarastoa eri tarkoituksiin eri työkaluilla. Voimme esimerkiksi integroida Page Object Modelin Selenium TestNG/JUnit toiminnallisille Testaus ja samaan aikaan JBehaven kanssa/Cucumber hyväksymistestausta varten.
  3. Koodi vähenee ja optimoituu, koska se käyttää uudelleen sivumetodeja POM-luokissa.
  4. Metodeille annetaan realistisempia nimiä, jotka voidaan helposti yhdistää käyttöliittymässä tapahtuvaan toimintoon. Esimerkiksi jos painikkeen napsauttamisen jälkeen siirrytään kotisivulle, metodin nimi on muotoa 'gotoHomePage()'.

POM:n toteuttaminen Selenium?

Yksinkertainen PLog Page Object Model -kehyksen perusrakenteessa, jossa whereManagerEIelementit AUT Ja näitä verkkoelementtejä käsittelevät metodit säilytetään tukkotiedostossa. Tehtävän, kuten varmennuksen, tulisi olla erillinen osa testimetodeja.

Ota POM käyttöön

Täydellinen esimerkki

Testitapaus: Siirry Guru99-demosivustolle.

Vaihe 1) Siirry Guru99-demosivustolle

Ota POM käyttöön

Vaihe 2) Tarkista kotisivulla, että teksti ”Guru99 Bank” on läsnä.

Ota POM käyttöön

Vaihe 3) Kirjaudu sisään sovellukseen

Ota POM käyttöön

Vaihe 4) Varmista, että kotisivulla on tekstiä "Manger Id: demo"

Ota POM käyttöön

Tässä esimerkissä käsittelemme kahta sivua:

  1. Kirjaudu Page
  2. 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 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 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("manager id : mgr123"));
    }

Mitä Page Factory sisältää Selenium?

Sivun tehdas sisään Selenium on sisäänrakennettu Page Object Model -kehyskonsepti Selenium WebDriver, joka parantaa ylläpidettävyyttä vähentämällä toistuvia elementtihakuja merkintöjen avulla, ei suoritusnopeuden avulla. Sitä käytetään sivuobjektien alustamiseen tai itse sivuobjektin luomiseen. Sitä käytetään myös sivuluokan elementtien alustamiseen ilman "FindElement/s"-metodia.

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-metodia web-elementtien alustamiseen.

Sivun tehdas Selenium

@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("manager id : mgr123"));
    }
}

Täydellinen projektirakenne näyttää kaaviolta:

Sivun tehdas sisään Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory on PageFactory in laiska latauskonsepti SeleniumSitä käytetään verkkoelementtien löytämiseen vain silloin, kun elementtejä käytetään jossakin toiminnossa. Se määrittää WebElements-elementeille aikakatkaisun objektisivuluokalle. Yksi PageFactory-kuvion käytön tärkeimmistä eduista Selenium on AjaxElementLocatorFactory-luokka.

Tässä, kun elementille suoritetaan toiminto, sen näkyvyyden odotus alkaa vasta kyseisestä hetkestä. Jos elementtiä ei löydy annetussa aikavälissä, Testitapaus suoritus aiheuttaa NoSuchElementException-poikkeuksen.

AjaxElement Locator -tehdas

Esimerkiksi:

AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10);
PageFactory.initElements(factory, this);

Lataa Selenium Projektitiedostot esittelyä varten tässä opetusohjelmassa

UKK

Page Object Model on suunnittelumalli, joka abstraktoi verkkosivun elementit erillisiksi luokiksi. Se yksinkertaistaa automaatiota erottamalla käyttöliittymän vuorovaikutukset testilogiikasta, mikä edistää selkeyttä, skaalautuvuutta ja vähentää koodin päällekkäisyyttä.

In SeleniumPOM edustaa kutakin verkkosivua erillisenä luokkana, joka sisältää paikantimia ja toimintoja. Se kapseloi käyttöliittymäelementtejä, jolloin testiskriptit pysyvät riippumattomina taustalla olevista sivurakenteen muutoksista.

POM ei ole itsenäinen kehys, vaan suunnittelumalli. Se voidaan integroida mihin tahansa automaatiokehykseen testien tehokkaan jäsentämisen varmistamiseksi, mikä varmistaa paremman organisoinnin, uudelleenkäytettävyyden ja ylläpidettävyyden.

POM on suunnitteluperiaate, jossa jokainen verkkosivu mallinnetaan luokkana, jolla on määritellyt paikantimet ja metodit. Se irrottaa testilogiikan käyttöliittymäelementeistä, mikä parantaa luettavuutta, skaalautuvuutta ja pitkäaikaista ylläpitoa.

POM määrittelee sivun abstraktion suunnittelurakenteen, kun taas Page Factory tarjoaa merkintöjä ja metodeja (@FindBy) verkkoelementtien tehokkaaseen alustamiseen. Page Factory on POM:n toteutuksen parannus.

POM keskittää elementtien paikantimet ja sivutoiminnot omiin luokkiinsa. Kaikki käyttöliittymämuutokset vaativat päivityksiä vain yhdessä paikassa, mikä minimoi uudelleentyön tarpeen, parantaa koodin uudelleenkäyttöä ja nopeuttaa testien ylläpitoa.

Kyllä. Tekoälypohjaiset testigeneraattorit voivat luoda POM-luokkia automaattisesti analysoimalla käyttöliittymähierarkioita, ylläpitämällä huolenaiheiden loogista erottelua ja samalla nopeuttamalla testien luomista alusta loppuun.

POM edistää modulaarisia ja uudelleenkäytettäviä testikomponentteja, mikä mahdollistaa integroinnin tekoälypohjaisiin testien ylläpitotyökaluihin, jotka päivittävät paikantimet automaattisesti, mikä vähentää skriptien haavoittuvuutta ja ylläpitokustannuksia.

Tiivistä tämä viesti seuraavasti: