Модель объекта страницы и фабрика в Selenium

⚡ Умное резюме

Page Object Model и Page Factory в Selenium Определите структурированный шаблон проектирования для создания надежных и удобных в обслуживании фреймворков автоматизации тестирования. Он делает акцент на создании классов, специфичных для страниц, которые инкапсулируют веб-элементы и их поведение, тем самым уменьшая дублирование и улучшая читаемость и масштабируемость. Selenium тестовые сценарии.

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

Объектная модель страницы

Что такое объектная модель страницы и каковы её ключевые компоненты?

Объектная модель страницы (POM) — это шаблон проектирования, широко используемый в автоматизации тестирования, который создаёт репозиторий объектов для элементов веб-интерфейса. Преимущество этой модели заключается в уменьшении дублирования кода и улучшении поддержки тестов.

В рамках этой модели для каждой веб-страницы в приложении должен быть соответствующий класс Page. Этот класс будет идентифицировать веб-элементы этой веб-страницы и содержать методы Page, которые выполняют операции с этими веб-элементами. Имена этих методов должны соответствовать выполняемой ими задаче. Например, если загрузчик ожидает появления платёжного шлюза, имя метода POM может быть waitForPaymentScreenDisplay().

Ключевые компоненты объектной модели страницы

  • Классы страниц: Представлять каждую веб-страницу как отдельный класс.
  • Локаторы: Идентифицируйте веб-элементы с помощью идентификаторов, XPath или селекторов CSS.
  • Методы: Содержат действия или операции, выполняемые над элементами .page.
  • Возможность повторного использования: Promoповторное использование кода tes и упрощение обслуживания при проведении тестов.
  • Разделение интересов: Сохраняет структуру страницы независимой от логики теста для лучшей организации.

Объектная модель страницы

Почему объектная модель страницы?

Запуск автоматизации пользовательского интерфейса в Selenium Вебдрайвер Это НЕ сложная задача. Нужно просто найти элементы и выполнить над ними операции.

Рассмотрим этот простой скрипт для входа на сайт.

Объектная модель страницы

Как вы можете заметить, все, что мы делаем, — это находим элементы и заполняем значения для этих элементов.

Это трудоёмкий скрипт, подверженный ошибкам. Поначалу он кажется простым, но по мере расширения набора тестов управление изменениями элементов становится сложным. Однако со временем набор тестов будет расти. По мере добавления всё большего количества строк кода всё становится сложнее.

Основная проблема с обслуживанием скриптов заключается в том, что если 10 разных скриптов используют один и тот же элемент страницы, то при любом изменении этого элемента вам придется изменить все 10 скриптов. Это отнимает много времени и чревато ошибками.

Более эффективным подходом к обслуживанию скриптов является создание отдельного файла класса, который будет находить веб-элементы, заполнять их или проверять. Этот класс затем можно будет повторно использовать в нескольких тестовых скриптах, взаимодействующих с одним и тем же элементом. В будущем, если в веб-элемент будут внесены изменения, нам нужно будет вносить изменения только в один файл класса, а не в 10 разных скриптов.

Этот подход называется объектной моделью страницы. Selenium. Это помогает сделать код более читаемым, поддерживаемым и пригодным для повторного использования.

 Объектная модель страницы

👉 Зарегистрируйтесь на бесплатный Live Selenium Проект

Преимущества ПОМ

  1. Шаблон проектирования объектов страницы говорит, что операции и потоки в пользовательском интерфейсе должны быть отделены от проверки. Эта концепция делает наш код чище и понятнее.
  2. Второе преимущество заключается в том, что репозиторий объектов не зависит от тестовых случаев, поэтому мы можем использовать один и тот же репозиторий объектов для разных целей с разными инструментами. Например, мы можем интегрировать Page Object Model в Selenium с TestNG/JUnit для функционального Тестирование и в то же время с JBehave/Cucumber для приемочных испытаний.
  3. Code Он становится менее ресурсоемким и оптимизированным, поскольку повторно использует методы страницы в классах POM.
  4. Методы получают более реалистичные имена, которые можно легко сопоставить с операциями, выполняемыми в пользовательском интерфейсе. Например, если после нажатия кнопки мы попадаем на домашнюю страницу, имя метода будет похоже на «gotoHomePage()».

Как внедрить POM в Selenium?

Простой PLog в базовой структуре фреймворка Page Object Model, где элементы whereManagereIDE AUT Методы, работающие с этими веб-элементами, хранятся в файле clog. Такая задача, как верификация, должна быть выделена в отдельную часть тестовых методов.

Внедрить ПОМ

Полный пример

Прецедент: Перейдите на GuruДемонстрационный сайт 99.

Шаг 1) Перейти к Guru99 Демонстрационный сайт

Внедрить ПОМ

Шаг 2) На главной странице убедитесь, что текст «GuruБанк «99» присутствует

Внедрить ПОМ

Шаг 3) Войдите в приложение

Внедрить ПОМ

Шаг 4) Убедитесь, что на домашней странице содержится текст «Идентификатор менеджера: демо».

Внедрить ПОМ

В этом примере мы имеем дело с двумя страницами:

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

Что такое Фабрика страниц? Selenium?

Фабрика страниц в Selenium — это встроенная концепция структуры объектной модели страницы для Selenium WebDriver, который повышает удобство поддержки за счёт сокращения количества повторяющихся поисков элементов с помощью аннотаций, а не за счёт скорости выполнения. Он используется для инициализации объектов Page или для создания экземпляра самого объекта Page. Он также используется для инициализации элементов класса Page без использования FindElement/s.

Здесь мы также следуем концепции разделения репозитория объектов страницы и методов тестирования. Кроме того, с помощью класса PageFactory в Selenium, мы используем аннотации @FindBy Чтобы найти WebElement, мы используем метод initElements для инициализации веб-элементов.

Страница Фабрики В Selenium

@FindBy могу принять имя тега, частичный текст ссылки, имя, текст ссылки, идентификатор, CSS, имя класса, 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 тестовых случаев с использованием концепции 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"));
    }
}

Полная структура проекта будет выглядеть так:

Фабрика страниц в Selenium

AjaxElementLocatorFactory

AjaxElementLocatorFactory — это концепция отложенной загрузки PageFactory в Selenium. Он используется для поиска веб-элементов только тогда, когда они используются в какой-либо операции. Он назначает тайм-аут для WebElements классу страницы объекта. Одно из ключевых преимуществ использования шаблона PageFactory в Selenium — это класс AjaxElementLocatorFactory.

Здесь, когда над элементом выполняется операция, ожидание его видимости начинается только с этого момента. Если элемент не найден в указанный интервал времени, Тестовый кейс выполнение выдаст исключение NoSuchElementException.

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

Например:

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

Скачать Selenium Файлы проекта для демонстрации в этом руководстве

Часто задаваемые вопросы (FAQ)

Модель объектной страницы (Page Object Model) — это шаблон проектирования, который абстрактноtracЭто позволяет разделить элементы веб-страницы на отдельные классы. Это упрощает автоматизацию, отделяя взаимодействие с пользовательским интерфейсом от логики тестирования, что способствует ясности, масштабируемости и сокращению дублирования кода.

In SeleniumPOM представляет каждую веб-страницу как отдельный класс, содержащий локаторы и действия. Он инкапсулирует элементы пользовательского интерфейса, позволяя тестовым сценариям оставаться независимыми от изменений базовой структуры страницы.

POM — это не самостоятельный фреймворк, а шаблон проектирования. Его можно интегрировать в любой фреймворк автоматизации для эффективной структуризации тестов, обеспечивая лучшую организацию, возможность повторного использования и удобство поддержки.

POM — это принцип проектирования, согласно которому каждая веб-страница моделируется как класс с определёнными локаторами и методами. Он отделяет логику тестирования от элементов пользовательского интерфейса, повышая читабельность, масштабируемость и удобство долгосрочного обслуживания.

POM определяет структуру дизайна для аннотаций страниц.tracв то время как Page Factory предоставляет аннотации и методы (@FindBy) для эффективной инициализации веб-элементов. Page Factory — это усовершенствованная реализация POM.

POM централизует локаторы элементов и действия страниц в выделенных классах. Любое изменение пользовательского интерфейса требует обновления только в одном месте, что сводит к минимуму доработку, улучшает повторное использование кода и ускоряет поддержку тестов.

Да. Генераторы тестов на базе ИИ могут автоматически создавать классы POM, анализируя иерархии пользовательского интерфейса, поддерживая логическое разделение задач и ускоряя сквозное создание тестов.

POM продвигает модульные и повторно используемые тестовые компоненты, обеспечивая интеграцию с инструментами обслуживания тестов на базе ИИ, которые автоматически обновляют локаторы, снижая нестабильность скриптов и накладные расходы на обслуживание.

Подведем итог этой публикации следующим образом: