Сторінка Object Model & Factory в Selenium

⚡ Розумний підсумок

Об'єктна модель сторінки та фабрика сторінок у Selenium визначити структурований шаблон проектування для створення надійних, зручних у підтримці фреймворків автоматизації тестування. Він наголошує на створенні класів, специфічних для сторінок, які інкапсулюють WebElements та їхню поведінку, тим самим зменшуючи дублювання та покращуючи читабельність і масштабованість Selenium тестові сценарії.

  • Основна концепція: Кожній сторінці застосунку відповідає окремий клас сторінки, що містить як веб-елементи, так і дії, що виконуються над ними, що дозволяє чітко розділити структуру інтерфейсу користувача та логіку тестування.
  • Фокус реалізації: POM сприяє багаторазовому використанню та централізованому управлінню елементами — зміни елементів сторінки вимагають оновлень лише в одному класі, а не в кількох скриптах.
  • Перевага дизайну: Модель забезпечує чистіші, модульні та незалежні від інструментів репозиторії об'єктів, які можна інтегрувати з такими фреймворками, як TestNG, JUnit, Cucumberабо JBehave.
  • Конвенція про найменування: Методи в класах сторінок повинні відображати фактичні дії інтерфейсу користувача (наприклад, gotoHomePage()), посилення семантичної ясності в автоматизованих робочих процесах.
  • Покращена структура: Фабрика сторінок удосконалює POM за допомогою @FindBy анотації та PageFactory.initElements() для автоматичної ініціалізації WebElement, що усуває повторюваність findElement дзвінки
  • Оптимізація продуктивності: AjaxElementLocatorFactory запроваджує ліниве завантаження — елементи знаходять місцезнаходження лише під час звернення до них, що покращує ефективність виконання та коректну обробку динамічної поведінки сторінки.
  • Результат: Уніфікований підхід призводить до підтримки, читабельності та масштабованості архітектури автоматизації тестування, що відповідає сучасним стандартам. Selenium практики.

Об'єктна модель сторінки

Що таке об'єктна модель сторінки? Які її ключові компоненти?

Об'єктна модель сторінки (POM) — це шаблон проектування, що широко використовується в автоматизації тестування, який створює сховище об'єктів для елементів веб-інтерфейсу. Перевагою цієї моделі є зменшення дублювання коду та покращення підтримки тестів.

Згідно з цією моделлю, для кожної веб-сторінки в застосунку має бути відповідний клас Page. Цей клас Page ідентифікуватиме веб-елементи цієї веб-сторінки, а також міститиме методи Page, які виконують операції з цими веб-елементами. Назви цих методів слід надавати відповідно до завдання, яке вони виконують, тобто, якщо завантажувач очікує появи платіжного шлюзу, назва методу POM може бути waitForPaymentScreenDisplay().

Ключові компоненти об'єктної моделі сторінки

  • Класи сторінок: Представте кожну веб-сторінку як окремий клас.
  • Локатори: Визначайте веб-елементи за допомогою ідентифікаторів, XPath або CSS-селекторів.
  • методи: Містити дії або операції, що виконуються над елементами .page.
  • Багаторазовість: Promoповторне використання коду TES та легше обслуговування в різних тестах.
  • Відокремлення концернів: Зберігає структуру сторінки незалежною від логіки тестування для кращої організації.

Об'єктна модель сторінки

Чому об’єктна модель сторінки?

Запуск автоматизації інтерфейсу користувача в Selenium веб-драйвер це НЕ складне завдання. Вам просто потрібно знайти елементи та виконати над ними операції.

Розглянемо цей простий скрипт для входу на вебсайт.

Об'єктна модель сторінки

Як ви бачите, усе, що ми робимо, це знаходимо елементи та заповнюємо значення для цих елементів.

Це трудомісткий скрипт, схильний до помилок. Спочатку він здається простим, але з розширенням набору тестів керування змінами елементів стає складним. Але з часом набір тестів зростатиме. З додаванням дедалі більшої кількості рядків до коду все стає складніше.

Основна проблема з підтримкою сценаріїв полягає в тому, що якщо 10 різних сценаріїв використовують той самий елемент сторінки, при будь-якій зміні в цьому елементі вам потрібно змінити всі 10 сценаріїв. Це займає багато часу та може викликати помилки.

Кращий підхід до обслуговування скриптів полягає у створенні окремого файлу класу, який би знаходив веб-елементи, заповнював їх або перевіряв. Цей клас потім можна буде повторно використовувати в кількох тестових скриптах, які взаємодіють з одним і тим самим елементом. У майбутньому, якщо відбудуться зміни в веб-елементі, нам потрібно буде внести зміни лише в один файл класу, а не в 10 різних скриптах.

Цей підхід називається Page Object Model in SeleniumЦе допомагає зробити код більш читабельним, зручним у підтримці та придатним для повторного використання.

 Об'єктна модель сторінки

👉 Зареєструйтесь для безкоштовного прямого ефіру Selenium Проекти

Переваги ПОМ

  1. Шаблон дизайну об’єкта сторінки каже, що операції та потоки в інтерфейсі користувача мають бути відокремлені від перевірки. Ця концепція робить наш код чистішим і зрозумілішим.
  2. Друга перевага полягає в тому, що репозиторій об'єктів не залежить від тестових випадків, тому ми можемо використовувати той самий репозиторій об'єктів для різних цілей з різними інструментами. Наприклад, ми можемо інтегрувати модель об'єктів сторінки в Selenium з TestNG/JUnit для функціональних Тестування і в той же час з JBehave/Cucumber для приймальних випробувань.
  3. Код стає меншим та оптимізованим, оскільки він повторно використовує методи сторінок у класах POM.
  4. Методи отримують більш реалістичні назви, які можна легко зіставити з операцією, що відбувається в інтерфейсі користувача. Наприклад, якщо після натискання кнопки ми потрапляємо на головну сторінку, назва методу буде такою: «gotoHomePage()».

Як впровадити POM у Selenium?

Простий PLog у фундаментальній структурі фреймворку моделі об'єктів сторінки, де whereManagerElements AUT а методи, що працюють з цими веб-елементами, зберігаються всередині файлу clog. Таке завдання, як перевірка, має бути окремим як частина методів тестування.

Впровадити POM

Повний приклад

TestCase: Перейдіть на демонстраційний сайт Guru99.

Крок 1) Перейдіть на демонстраційний сайт Guru99

Впровадити POM

Крок 2) На головній сторінці перевірте наявність тексту «Guru99 Bank»

Впровадити POM

Крок 3) Увійдіть у програму

Впровадити POM

Крок 4) Переконайтеся, що домашня сторінка містить текст як «Ідентифікатор менеджера: демо»

Впровадити POM

У цьому прикладі ми маємо справу з двома сторінками:

  1. Увійти сторінку
  2. Домашня сторінка (відображається після входу)

Відповідно, створюємо 2 POM в Selenium класів

Guru99 Сторінка входу 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 POM в 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 Простий POM в Selenium Тестовий випадок

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

У чому полягає Page Factory Selenium?

Page Factory в Selenium це вбудована концепція каркаса об’єктної моделі сторінки для Selenium WebDriver, що покращує зручність обслуговування, зменшуючи повторювані пошуки елементів за допомогою анотацій, а не швидкість виконання. Він використовується для ініціалізації об'єктів Page або для створення екземпляра самого об'єкта Page. Він також використовується для ініціалізації елементів класу Page без використання "FindElement/s".

Тут також ми дотримуємося концепції поділу сховища об’єктів сторінки та методів тестування. Крім того, за допомогою класу PageFactory в Selenium, використовуємо анотації @FindBy щоб знайти WebElement. Ми використовуємо метод initElements для ініціалізації веб-елементів.

Page Factory In Selenium

@FindBy може прийняти tagName, partialLinkText, name, linkText, id, css, className, xpath як атрибути.

Давайте розглянемо той самий приклад, що й вище, із використанням Page Factory

Сторінка входу Guru99 із 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 із 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 TestCase із концепцією 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"));
    }
}

Повна структура проекту виглядатиме так, як показано на схемі:

Page Factory в Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory це концепція ледачого завантаження PageFactory в SeleniumВін використовується для пошуку веб-елементів лише тоді, коли ці елементи використовуються в будь-якій операції. Він призначає тайм-аут для WebElements класу сторінки об'єкта. Одна з ключових переваг використання шаблону PageFactory у Selenium є класом AjaxElementLocatorFactory.

Тут, коли над елементом виконується операція, очікування його видимості починається лише з цього моменту. Якщо елемент не знайдено в заданому інтервалі часу, Тестовий випадок виконання викличе виняток "NoSuchElementException".

Фабрика локаторів AjaxElement

Наприклад:

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

Завантажити Selenium Файли проекту для демонстрації в цьому посібнику

Поширені запитання

Модель об'єктів сторінки (Page Object Model) – це шаблон проектування, який абстрагує елементи веб-сторінки в окремі класи. Він спрощує автоматизацію, відокремлюючи взаємодії з інтерфейсом користувача від логіки тестування, що сприяє зрозумілості, масштабованості та зменшує дублювання коду.

In SeleniumPOM представляє кожну веб-сторінку як спеціалізований клас, що містить локатори та дії. Він інкапсулює елементи інтерфейсу користувача, дозволяючи тестовим скриптам залишатися незалежними від змін структури сторінки.

POM — це не окремий фреймворк, а шаблон проектування. Його можна інтегрувати в будь-який фреймворк автоматизації для ефективного структурування тестів, забезпечуючи кращу організацію, можливість повторного використання та зручність обслуговування.

POM – це принцип дизайну, де кожна веб-сторінка моделюється як клас із визначеними локаторами та методами. Він відокремлює логіку тестування від елементів інтерфейсу користувача, покращуючи читабельність, масштабованість та довгострокову підтримку.

POM визначає структуру дизайну для абстракції сторінки, тоді як Page Factory надає анотації та методи (@FindBy) для ефективної ініціалізації веб-елементів. Фабрика сторінок – це вдосконалення реалізації POM.

POM централізує локатори елементів та дії сторінок у межах спеціалізованих класів. Будь-яка модифікація інтерфейсу користувача вимагає оновлень лише в одному місці, що мінімізує переробку, покращує повторне використання коду та пришвидшує підтримку тестів.

Так. Генератори тестів на основі штучного інтелекту можуть автоматично створювати класи POM, аналізуючи ієрархії інтерфейсу користувача, підтримуючи логічний розділення проблем та пришвидшуючи створення тестів від початку до кінця.

POM сприяє модульним та багаторазовим компонентам тестування, що дозволяє інтеграцію з інструментами підтримки тестування на основі штучного інтелекту, які автоматично оновлюють локатори, зменшуючи нестабільність скриптів та накладні витрати на обслуговування.

Підсумуйте цей пост за допомогою: