Model obiektu strony i fabryka w Selenium

โšก Inteligentne podsumowanie

Model obiektรณw stron i fabryka stron w Selenium Zdefiniuj ustrukturyzowany wzorzec projektowy do budowania solidnych i ล‚atwych w utrzymaniu struktur automatyzacji testรณw. Kล‚adzie on nacisk na tworzenie klas specyficznych dla stron, ktรณre hermetyzujฤ… elementy WebElement i ich zachowania, redukujฤ…c w ten sposรณb duplikacjฤ™ oraz poprawiajฤ…c czytelnoล›ฤ‡ i skalowalnoล›ฤ‡. Selenium skrypty testowe.

  • Koncepcja gล‚รณwna: Kaลผda strona aplikacji odpowiada dedykowanej klasie strony zawierajฤ…cej zarรณwno elementy WebElements, jak i wykonywane na nich akcje, co pozwala na wyraลบne oddzielenie struktury interfejsu uลผytkownika od logiki testu.
  • Cel wdroลผenia: POM promuje moลผliwoล›ฤ‡ ponownego wykorzystania i scentralizowane zarzฤ…dzanie elementami โ€” modyfikacje elementรณw strony wymagajฤ… aktualizacji tylko jednej klasy, a nie wielu skryptรณw.
  • Zaleta projektu: Model ten zapewnia czystsze, moduล‚owe i niezaleลผne od narzฤ™dzi repozytoria obiektรณw, ktรณre moลผna zintegrowaฤ‡ z frameworkami takimi jak TestNG, JUnit, Cucumberlub JBehave.
  • Konwencja nazewnictwa: Metody w klasach stron muszฤ… odzwierciedlaฤ‡ rzeczywiste dziaล‚ania interfejsu uลผytkownika (np. gotoHomePage()), wzmacniajฤ…c przejrzystoล›ฤ‡ semantycznฤ… w przepล‚ywach pracy automatyzacji.
  • Ulepszona struktura: Page Factory udoskonala POM za pomocฤ… @FindBy adnotacje i PageFactory.initElements() do automatycznej inicjalizacji WebElement, eliminujฤ…c powtarzalnoล›ฤ‡ findElement wzywa.
  • Optymalizacja wydajnoล›ci: AjaxElementLocatorFactory wprowadza leniwe ล‚adowanie โ€” elementy sฤ… lokalizowane tylko w momencie dostฤ™pu do nich โ€” co zwiฤ™ksza wydajnoล›ฤ‡ wykonywania i sprawnie obsล‚uguje dynamiczne zachowanie strony.
  • Wynik: Zunifikowane podejล›cie skutkuje ล‚atwฤ… w utrzymaniu, czytelnฤ… i skalowalnฤ… architekturฤ… automatyzacji testรณw, zgodnฤ… z nowoczesnymi standardami Selenium praktyki.

Model obiektu strony

Czym jest Page Object Model? Jakie sฤ… jego kluczowe komponenty?

Model obiektowy strony (POM) To wzorzec projektowy, popularnie stosowany w automatyzacji testรณw, ktรณry tworzy repozytorium obiektรณw dla elementรณw interfejsu uลผytkownika. Zaletฤ… tego modelu jest redukcja duplikacji kodu i usprawnienie utrzymania testรณw.

W tym modelu, dla kaลผdej strony internetowej w aplikacji powinna istnieฤ‡ odpowiadajฤ…ca jej klasa Page. Klasa ta identyfikuje elementy WebElement danej strony internetowej, a takลผe zawiera metody Page, ktรณre wykonujฤ… operacje na tych elementach WebElement. Nazwy tych metod powinny byฤ‡ podane zgodnie z wykonywanym przez nie zadaniem, np. jeล›li moduล‚ ล‚adujฤ…cy oczekuje na pojawienie siฤ™ bramki pล‚atnoล›ci, nazwฤ… metody POM moลผe byฤ‡ waitForPaymentScreenDisplay().

Kluczowe komponenty modelu obiektรณw stron

  • Klasy stron: Kaลผdฤ… stronฤ™ internetowฤ… naleลผy przedstawiฤ‡ jako osobnฤ… klasฤ™.
  • Lokalizatory: Identyfikuj elementy sieciowe za pomocฤ… identyfikatorรณw, ล›cieลผek XPath lub selektorรณw CSS.
  • metody: Zawierajฤ… akcje lub operacje wykonywane na elementach .page.
  • Moลผliwoล›ฤ‡ ponownego wykorzystania: Promoponowne wykorzystanie kodu testowego i ล‚atwiejsza konserwacja testรณw.
  • Oddzielenie obaw: Utrzymuje strukturฤ™ strony niezaleลผnฤ… od logiki testu, co zapewnia lepszฤ… organizacjฤ™.

Model obiektu strony

Dlaczego model obiektowy strony?

Uruchamianie automatyzacji interfejsu uลผytkownika w Selenium Sterownik sieciowy NIE jest trudnym zadaniem. Wystarczy znaleลบฤ‡ pierwiastki i wykonaฤ‡ na nich operacje.

Rozwaลผ ten prosty skrypt umoลผliwiajฤ…cy zalogowanie siฤ™ do witryny internetowej.

Model obiektu strony

Jak widaฤ‡, jedyne, co robimy, to znajdowanie elementรณw i wypeล‚nianie dla nich wartoล›ci.

To czasochล‚onny skrypt, podatny na bล‚ฤ™dy. Poczฤ…tkowo wydaje siฤ™ prosty, ale wraz z rozbudowฤ… zestawu testรณw zarzฤ…dzanie zmianami elementรณw staje siฤ™ trudne. Z czasem jednak zestaw testรณw bฤ™dzie siฤ™ rozrastaล‚. W miarฤ™ dodawania kolejnych linii kodu, sytuacja staje siฤ™ trudniejsza.

Gล‚รณwny problem zwiฤ…zany z konserwacjฤ… skryptรณw polega na tym, ลผe jeล›li 10 rรณลผnych skryptรณw uลผywa tego samego elementu strony, kaลผda zmiana w tym elemencie wymaga zmiany wszystkich 10 skryptรณw. Jest to czasochล‚onne i podatne na bล‚ฤ™dy.

Lepszym podejล›ciem do obsล‚ugi skryptรณw jest utworzenie osobnego pliku klasy, ktรณry bฤ™dzie wyszukiwaล‚ elementy webowe, wypeล‚niaล‚ je lub weryfikowaล‚. Tฤ™ klasฤ™ moลผna nastฤ™pnie wykorzystaฤ‡ ponownie w wielu skryptach testowych, ktรณre oddziaล‚ujฤ… na ten sam element. W przyszล‚oล›ci, jeล›li nastฤ…pi zmiana w elemencie webowym, bฤ™dziemy musieli wprowadziฤ‡ jฤ… w jednym pliku klasy, a nie w dziesiฤ™ciu rรณลผnych skryptach.

To podejล›cie nazywa siฤ™ modelem obiektowym strony SeleniumPomaga uczyniฤ‡ kod bardziej czytelnym, ล‚atwiejszym w utrzymaniu i nadajฤ…cym siฤ™ do ponownego wykorzystania.

 Model obiektu strony

๐Ÿ‘‰ Zarejestruj siฤ™ bezpล‚atnie na ลผywo Selenium Projekt

Zalety POM

  1. Wzorzec projektowy obiektu strony mรณwi, ลผe operacje i przepล‚ywy w interfejsie uลผytkownika powinny byฤ‡ oddzielone od weryfikacji. Ta koncepcja sprawia, ลผe โ€‹โ€‹nasz kod jest czystszy i ล‚atwiejszy do zrozumienia.
  2. Drugฤ… korzyล›ciฤ… jest to, ลผe repozytorium obiektรณw jest niezaleลผne od przypadkรณw testowych, dziฤ™ki czemu moลผemy uลผywaฤ‡ tego samego repozytorium obiektรณw do rรณลผnych celรณw i za pomocฤ… rรณลผnych narzฤ™dzi. Na przykล‚ad, moลผemy zintegrowaฤ‡ Page Object Model zโ€ฆ Selenium w TestNG/JUnit za funkcjonalne Testy i jednoczeล›nie z JBehave/Cucumber do testรณw akceptacyjnych.
  3. Code staje siฤ™ mniej rozbudowany i zoptymalizowany, poniewaลผ ponownie wykorzystuje metody stron w klasach POM.
  4. Metody otrzymujฤ… bardziej realistyczne nazwy, ktรณre moลผna ล‚atwo odwzorowaฤ‡ na operacje wykonywane w interfejsie uลผytkownika. Np. jeล›li po klikniฤ™ciu przycisku zostaniemy przeniesieni na stronฤ™ gล‚รณwnฤ…, nazwa metody bฤ™dzie wyglฤ…daฤ‡ nastฤ™pujฤ…co: 'gotoHomePage()'.

Jak wdroลผyฤ‡ POM w Selenium?

Prosty PLog w podstawowej strukturze struktury Page Object Model, gdzie whereManagereIDElements AUT a metody dziaล‚ajฤ…ce na tych elementach sieciowych sฤ… przechowywane w pliku Clog. Zadanie takie jak weryfikacja powinno byฤ‡ oddzielone w ramach metod testowych.

Wdraลผaj POM

Kompletny przykล‚ad

Przypadek testowy: Iล›ฤ‡ do Guru99 Strona demonstracyjna.

Krok 1) Przejdลบ do Guru99 Strona demonstracyjna

Wdraลผaj POM

Krok 2) Na stronie gล‚รณwnej sprawdลบ, czy tekst โ€žGuruโ€ž99 Bankโ€ jest obecny

Wdraลผaj POM

Krok 3) Zaloguj siฤ™ do aplikacji

Wdraลผaj POM

Krok 4) Sprawdลบ, czy strona gล‚รณwna zawiera tekst โ€žIdentyfikator menedลผera: demoโ€

Wdraลผaj POM

W tym przykล‚adzie mamy do czynienia z dwiema stronami:

  1. Strona logowania
  2. Strona gล‚รณwna (wyล›wietlana po zalogowaniu)

W zwiฤ…zku z tym tworzymy 2 POM w Selenium Klasy

Guru99 Strona logowania 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 Strona gล‚รณwna POM w 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 Prosty POM w Selenium Przypadek testowy

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"));
    }

W czym jest Page Factory Selenium?

Strona Fabryki w Selenium jest wbudowanฤ… koncepcjฤ… frameworka Page Object Model dla Selenium WebDriver, ktรณry poprawia ล‚atwoล›ฤ‡ utrzymania poprzez redukcjฤ™ powtarzajฤ…cych siฤ™ wyszukiwaล„ elementรณw za pomocฤ… adnotacji, a nie poprzez szybkoล›ฤ‡ wykonywania. Sล‚uลผy do inicjalizacji obiektรณw Page lub tworzenia instancji samego obiektu Page. Sล‚uลผy rรณwnieลผ do inicjalizacji elementรณw klasy Page bez uลผycia funkcji โ€žFindElement/sโ€.

Tutaj rรณwnieลผ kierujemy siฤ™ koncepcjฤ… rozdzielenia Repozytorium Obiektรณw Strony i Metod Testowania. Dodatkowo przy pomocy klasy PageFactory w Selenium, uลผywamy adnotacji @FindBy Aby znaleลบฤ‡ WebElement. Uลผywamy metody initElements do inicjalizacji elementรณw webowych.

Fabryka strony w Selenium

@FindBy Mogฤ™ zaakceptowaฤ‡ tagName, czฤ™ล›ciowyLinkText, nazwa, linkText, identyfikator, css, nazwa klasy, xpath jako atrybuty.

Spรณjrzmy na ten sam przykล‚ad co powyลผej, uลผywajฤ…c Page Factory

Guru99 Strona logowania z 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 Strona gล‚รณwna z 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 przypadkรณw testowych z koncepcjฤ… Page Factory

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"));
    }
}

Kompletna struktura projektu bฤ™dzie wyglฤ…daฤ‡ jak na diagramie:

Strona Fabryki w Selenium

Fabryka AjaxElementLocator

Fabryka AjaxElementLocator to koncepcja leniwego ล‚adowania PageFactory w SeleniumSล‚uลผy do znajdowania elementรณw sieciowych tylko wtedy, gdy sฤ… one uลผywane w dowolnej operacji. Przypisuje limit czasu dla elementรณw sieciowych do klasy strony obiektu. Jednฤ… z kluczowych zalet stosowania wzorca PageFactory w Selenium jest klasฤ… AjaxElementLocatorFactory.

W tym przypadku, gdy operacja jest wykonywana na elemencie, oczekiwanie na jego widocznoล›ฤ‡ rozpoczyna siฤ™ dopiero od tego momentu. Jeล›li element nie zostanie znaleziony w podanym przedziale czasu, Przypadek testowy wykonanie zgล‚osi wyjฤ…tek โ€žNoSuchElementExceptionโ€.

Fabryka lokalizatorรณw AjaxElement

Na przykล‚ad:

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

Pobierz Selenium Pliki projektu dla wersji demonstracyjnej w tym samouczku

FAQ

Page Object Model to wzorzec projektowy, ktรณrytracElementy strony internetowej ts dzielฤ… siฤ™ na osobne klasy. Upraszcza automatyzacjฤ™ poprzez oddzielenie interakcji interfejsu uลผytkownika od logiki testรณw, co przekล‚ada siฤ™ na przejrzystoล›ฤ‡, skalowalnoล›ฤ‡ i redukcjฤ™ duplikacji kodu.

In SeleniumPOM reprezentuje kaลผdฤ… stronฤ™ internetowฤ… jako dedykowanฤ… klasฤ™ zawierajฤ…cฤ… lokalizatory i akcje. Hermetyzuje elementy interfejsu uลผytkownika, umoลผliwiajฤ…c skryptom testowym zachowanie niezaleลผnoล›ci od zmian w strukturze strony.

POM nie jest samodzielnym frameworkiem, lecz wzorcem projektowym. Moลผna go zintegrowaฤ‡ z dowolnym frameworkiem automatyzacji, aby efektywnie ustrukturyzowaฤ‡ testy, zapewniajฤ…c lepszฤ… organizacjฤ™, moลผliwoล›ฤ‡ ponownego uลผycia i ล‚atwoล›ฤ‡ konserwacji.

POM to zasada projektowania, w ktรณrej kaลผda strona internetowa jest modelowana jako klasa ze zdefiniowanymi lokalizatorami i metodami. Oddziela logikฤ™ testรณw od elementรณw interfejsu uลผytkownika, zwiฤ™kszajฤ…c czytelnoล›ฤ‡, skalowalnoล›ฤ‡ i uล‚atwiajฤ…c dล‚ugoterminowe utrzymanie.

POM definiuje strukturฤ™ projektu dla strony abstraccja, podczas gdy Page Factory zapewnia adnotacje i metody (@FindBy) do efektywnego inicjowania elementรณw internetowych. Page Factory to udoskonalenie implementacji POM.

POM centralizuje lokalizatory elementรณw i akcje stron w ramach dedykowanych klas. Kaลผda modyfikacja interfejsu uลผytkownika wymaga aktualizacji tylko w jednym miejscu, co minimalizuje koniecznoล›ฤ‡ przerรณbek, usprawnia ponowne wykorzystanie kodu i przyspiesza utrzymanie testรณw.

Tak. Generatory testรณw oparte na sztucznej inteligencji mogฤ… automatycznie tworzyฤ‡ klasy POM, analizujฤ…c hierarchie interfejsu uลผytkownika, zachowujฤ…c logiczny podziaล‚ zagadnieล„ i przyspieszajฤ…c tworzenie kompleksowych testรณw.

POM promuje moduล‚owe i wielokrotnego uลผytku komponenty testowe, umoลผliwiajฤ…c integracjฤ™ z opartymi na sztucznej inteligencji narzฤ™dziami do konserwacji testรณw, ktรณre automatycznie aktualizujฤ… lokalizatory, zmniejszajฤ…c kruchoล›ฤ‡ skryptรณw i obciฤ…ลผenie zwiฤ…zane z konserwacjฤ….

Podsumuj ten post nastฤ™pujฤ…co: