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.
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ฤ.
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.
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.
๐ Zarejestruj siฤ bezpลatnie na ลผywo Selenium Projekt
Zalety POM
- 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.
- 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.
- Code staje siฤ mniej rozbudowany i zoptymalizowany, poniewaลผ ponownie wykorzystuje metody stron w klasach POM.
- 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.
Kompletny przykลad
Przypadek testowy: Iลฤ do Guru99 Strona demonstracyjna.
Krok 1) Przejdลบ do Guru99 Strona demonstracyjna
Krok 2) Na stronie gลรณwnej sprawdลบ, czy tekst โGuruโ99 Bankโ jest obecny
Krok 3) Zaloguj siฤ do aplikacji
Krok 4) Sprawdลบ, czy strona gลรณwna zawiera tekst โIdentyfikator menedลผera: demoโ
W tym przykลadzie mamy do czynienia z dwiema stronami:
- Strona logowania
- 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.
@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:
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โ.
Na przykลad:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Pobierz Selenium Pliki projektu dla wersji demonstracyjnej w tym samouczku












