Co to jest model obiektów strony?
Page Object Model (POM) to wzorzec projektowy, powszechnie używany w automatyzacji testów, który tworzy repozytorium obiektów dla elementów interfejsu użytkownika sieci Web. Zaletą tego modelu jest to, że ogranicza powielanie kodu i usprawnia obsługę testów.
W tym modelu dla każdej strony internetowej w aplikacji powinna istnieć odpowiednia klasa strony. Ta klasa Page identyfikuje elementy WebElements tej strony internetowej, a także zawiera metody Page, które wykonują operacje na tych elementach WebElement. Nazwy tych metod należy podać zgodnie z wykonywanym zadaniem, tj. Jeśli program ładujący oczekuje na pojawienie się bramki płatności, to nazwa metody POM może mieć postać waitForPaymentScreenDisplay ().
W tym samouczku nauczysz się:
- Dlaczego model obiektów strony?
- Zalety POM
- Jak wdrożyć POM?
- Co to jest Page Factory?
- Guru99 TestCase z koncepcją Page Factory
- AjaxElementLocatorFactory
Dlaczego model obiektów strony?
Uruchomienie automatyzacji interfejsu użytkownika w Selenium WebDriver NIE jest trudnym zadaniem. Wystarczy znaleźć elementy, wykonać na nich operacje.
Rozważ ten prosty skrypt, aby zalogować się do witryny internetowej
Jak widać, wszystko, co robimy, to znajdowanie elementów i wypełnianie ich wartościami.
To jest mały skrypt. Utrzymanie skryptów wygląda na łatwe. Ale z czasem zestaw testów będzie się rozrastał. W miarę dodawania coraz większej liczby wierszy do kodu sprawy stają się trudne.
Głównym problemem związanym z obsługą skryptów jest to, że jeśli 10 różnych skryptów używa tego samego elementu strony, z jakąkolwiek zmianą w tym elemencie, musisz zmienić wszystkie 10 skryptów. Jest to czasochłonne i podatne na błędy.
Lepszym podejściem do obsługi skryptów jest utworzenie osobnego pliku z klasą, który będzie szukał elementów sieci, wypełnił je lub zweryfikował. Ta klasa może być ponownie wykorzystana we wszystkich skryptach używających tego elementu. W przyszłości, jeśli nastąpi zmiana w elemencie web, musimy dokonać zmiany tylko w 1 pliku klasy, a nie w 10 różnych skryptach.
To podejście w Selenium nazywa się Page Object Model. Pomaga uczynić kod bardziej czytelnym, łatwym w utrzymaniu i wielokrotnego użytku.
Zalety POM
- Wzorzec projektu 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 bardziej przejrzysty i łatwy 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 z różnymi narzędziami. Na przykład, możemy zintegrować Page Object Model w Selenium z TestNG / JUnit do testowania funkcjonalnego i jednocześnie z JBehave / Cucumber do testów akceptacyjnych.
- Kod staje się mniejszy i zoptymalizowany z powodu metod stron wielokrotnego użytku w klasach POM.
- Metody uzyskują bardziej realistyczne nazwy, które można łatwo odwzorować za pomocą operacji wykonywanej w interfejsie użytkownika. tzn. jeśli po kliknięciu przycisku wylądujemy na stronie głównej, nazwa metody będzie wyglądać następująco: „gotoHomePage ()”.
Jak wdrożyć POM?
Prosty POM:
Jest to podstawowa struktura struktury modelu obiektowego Page, w której wszystkie elementy WWW AUT i metoda działająca na tych elementach WWW są utrzymywane w pliku klasy. Zadanie takie jak weryfikacja powinno być oddzielne jako część metod testowych.
Kompletny przykład
TestCase: przejdź do strony demonstracyjnej Guru99.
Krok 1) Przejdź do strony demonstracyjnej Guru99 | |
Krok 2) W stronę domową tekstu check „Guru99 Bank” jest obecny | |
Krok 3) Zaloguj się do aplikacji | |
Krok 4) Sprawdź, czy strona główna zawiera tekst „Manger Id: demo” |
Tutaj mamy do czynienia z 2 stronami
- Strona logowania
- Strona główna (wyświetlana po zalogowaniu)
W związku z tym tworzymy 2 POM w klasach Selenium
Guru99 Strona logowania POM
strony pakietów;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99Login {Sterownik WebDriver;By user99GuruName = By.name ("uid");Przez password99Guru = By.name ("hasło");By titleText = By.className ("barone");By login = By.name ("btnLogin");public Guru99Login (sterownik WebDriver) {this.driver = kierowca;}// Ustaw nazwę użytkownika w polu tekstowympublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Ustaw hasło w polu tekstowym hasłapublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Kliknij przycisk logowaniapublic void clickLogin () {driver.findElement (login) .click ();}// Uzyskaj tytuł strony logowaniapublic String getLoginTitle () {return driver.findElement (titleText) .getText ();}/ *** Ta metoda POM zostanie ujawniona w przypadku testowym w celu zalogowania się do aplikacji* @param strUserName* @param strPasword* @powrót* /public void loginToGuru99 (String strUserName, String strPasword) {// Wypełnij nazwę użytkownikathis.setUserName (strUserName);// Wpisz hasłothis.setPassword (strPasword);// Kliknij przycisk Zalogujthis.clickLogin ();}}
Strona główna Guru99 POM in Selenium
strony pakietów;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99HomePage {Sterownik WebDriver;By homePageUserName = By.xpath ("// table // tr [@ class = 'header3']");public Guru99HomePage (sterownik WebDriver) {this.driver = kierowca;}// Pobierz nazwę użytkownika ze strony głównejpublic String getHomePageDashboardUserName () {return driver.findElement (homePageUserName) .getText ();}}
Guru99 Prosty POM w przypadku testu selenu
test opakowania;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";Sterownik WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („http://demo.guru99.com/V4/”);}/ *** Ten przypadek testowy będzie się logował w http://demo.guru99.com/V4/* Zweryfikuj tytuł strony logowania jako bank guru99* Zaloguj się do aplikacji* Zweryfikuj stronę główną za pomocą komunikatu Dashboard* /@Test (priorytet = 0)public void test_Home_Page_Appear_Correct () {// Utwórz obiekt strony logowaniaobjLogin = new Guru99Login (sterownik);// Zweryfikuj tytuł strony logowaniaString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Zawiera ("bank guru99"));// zaloguj się do aplikacjiobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// przejdź do następnej stronyobjHomePage = new Guru99HomePage (sterownik);// Zweryfikuj stronę głównąAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Zawiera ("id menedżera: mgr123"));}
Co to jest Page Factory w Selenium?
Page Factory w Selenium to wbudowana koncepcja frameworka Page Object Model dla Selenium WebDriver, ale jest bardzo zoptymalizowana. Służy do inicjalizacji obiektów Page lub do tworzenia instancji samego obiektu Page. Służy również do inicjowania elementów klasy Page bez użycia funkcji „FindElement / s”.
Tutaj również kierujemy się koncepcją oddzielenia repozytorium obiektów strony i metod testowych. Dodatkowo za pomocą klasy PageFactory w Selenium używamy adnotacji @FindBy, aby znaleźć WebElement. Do inicjalizacji elementów webowych używamy metody initElements
@FindBy może akceptować tagName, częścioweLinkText, name, linkText, id, css, className, xpath jako atrybuty.
Spójrzmy na ten sam przykład, co powyżej, używając Page Factory
Strona logowania Guru99 z Page Factory
pakiet 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 {/ *** Wszystkie elementy WebElement są oznaczone adnotacją @FindBy* /Sterownik WebDriver;@FindBy (name = "uid")WebElement user99GuruName;@FindBy (nazwa = "hasło")Hasło WebElement99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")Logowanie do WebElement;public Guru99Login (sterownik WebDriver) {this.driver = kierowca;// Ta metoda initElements utworzy wszystkie elementy WebElementsPageFactory.initElements (sterownik, to);}// Ustaw nazwę użytkownika w polu tekstowympublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Ustaw hasło w polu tekstowym hasłapublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Kliknij przycisk logowaniapublic void clickLogin () {login.click ();}// Uzyskaj tytuł strony logowaniapublic String getLoginTitle () {return titleText.getText ();}/ *** Ta metoda POM zostanie ujawniona w przypadku testowym w celu zalogowania się do aplikacji* @param strUserName* @param strPasword* @powrót* /public void loginToGuru99 (String strUserName, String strPasword) {// Wypełnij nazwę użytkownikathis.setUserName (strUserName);// Wpisz hasłothis.setPassword (strPasword);// Kliknij przycisk Zalogujthis.clickLogin ();}}
Strona główna Guru99 z funkcją Page Factory
pakiet 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 {Sterownik WebDriver;@FindBy (xpath = "// table // tr [@ class = 'header3']")WebElement homePageUserName;public Guru99HomePage (sterownik WebDriver) {this.driver = kierowca;// Ta metoda initElements utworzy wszystkie elementy WebElementsPageFactory.initElements (sterownik, to);}// Pobierz nazwę użytkownika ze strony głównejpublic String getHomePageDashboardUserName () {return homePageUserName.getText ();}}
Guru99 TestCase z koncepcją Page Factory
test opakowania;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";Sterownik WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);driver = nowy FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get („http://demo.guru99.com/V4/”);}/ *** Ten test można znaleźć pod adresem http://demo.guru99.com/V4/* Zweryfikuj tytuł strony logowania jako bank guru99* Zaloguj się do aplikacji* Zweryfikuj stronę główną za pomocą komunikatu Dashboard* /@Test (priorytet = 0)public void test_Home_Page_Appear_Correct () {// Utwórz obiekt strony logowaniaobjLogin = new Guru99Login (sterownik);// Zweryfikuj tytuł strony logowaniaString loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Zawiera ("bank guru99"));// zaloguj się do aplikacjiobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// przejdź do następnej stronyobjHomePage = new Guru99HomePage (sterownik);// Zweryfikuj stronę głównąAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Zawiera ("id menedżera: mgr123"));}}
Pełna struktura projektu będzie wyglądać jak diagram:
AjaxElementLocatorFactory
AjaxElementLocatorFactory to koncepcja leniwego ładowania programu PageFactory w selenie. Służy do znajdowania elementów sieci tylko wtedy, gdy elementy są używane w dowolnej operacji. Przypisuje limit czasu dla WebElements do klasy strony obiektu. Jedną z kluczowych zalet używania wzorca PageFactory w Selenium jest klasa AjaxElementLocatorFactory.
Tutaj, gdy operacja jest wykonywana na elemencie, oczekiwanie na jego widoczność zaczyna się dopiero od tego momentu. Jeśli element nie zostanie znaleziony w podanym przedziale czasu, wykonanie przypadku testowego zgłosi wyjątek „NoSuchElementException”.
Podsumowanie
- Page Object Model w Selenium Websdriver to wzorzec projektowy repozytorium obiektów.
- Model obiektowy strony Selenium tworzy nasz kod testowy, który można konserwować i używać wielokrotnie.
- Page Factory to zoptymalizowany sposób tworzenia repozytorium obiektów w koncepcji struktury Page Object Model.
- AjaxElementLocatorFactory to koncepcja leniwego ładowania w Page Factory - wzorzec projektowania obiektów strony, który identyfikuje elementy WebElement tylko wtedy, gdy są używane w dowolnej operacji.
Pobierz pliki projektu Selenium do wersji demonstracyjnej w tym samouczku