Учебники

32) POM & Page Factory

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

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

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

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

В этом уроке вы узнаете

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

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

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

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

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

Это маленький сценарий. Сценарий обслуживания выглядит легко. Но со временем набор тестов будет расти. Когда вы добавляете все больше и больше строк в ваш код, все становится сложнее.

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

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

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

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

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

  1. Шаблон объекта страницы говорит, что операции и потоки в пользовательском интерфейсе должны быть отделены от проверки. Эта концепция делает наш код чище и понятнее.
  2. The Second benefit is the object repository is independent of test cases, so we can use the same object repository for a different purpose with different tools. For example, we can integrate POM with TestNG/JUnit for functional Testing and at the same time with JBehave/Cucumber for acceptance testing.
  3. Code becomes less and optimized because of the reusable page methods in the POM classes.
  4. Methods get more realistic names which can be easily mapped with the operation happening in UI. i.e. if after clicking on the button we land on the home page, the method name will be like ‘gotoHomePage()’.

How to implement POM?

Simple POM:

Это базовая структура объектной модели страницы (POM), в которой все веб-элементы AUT и методы, которые работают с этими веб-элементами, хранятся в файле класса. Задача, подобная проверке, должна быть отдельной как часть методов Test.

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

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

TestCase: перейдите на демонстрационный сайт Guru99.

Шаг 1) Перейти на демонстрационный сайт Guru99 Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство
Шаг 2) На домашней странице проверки текста «Guru99 Банк» присутствует Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство
Шаг 3) Войдите в приложение Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство
Шаг 4) Убедитесь, что на главной странице есть текст «Manger Id: demo» Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

Вот мы имеем дело с 2 страницами

  1. Страница авторизации
  2. Домашняя страница (отображается после входа в систему)

Соответственно, мы создаем 2 класса POM

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 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 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 Домашняя страница POM

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 Тестовый кейс

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("http://demo.guru99.com/V4/");

    }

    /**

     * This test case will login in http://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("manger id : mgr123"));

    }

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

Page Factory — это встроенная концепция объектной модели страницы для Selenium WebDriver, но она очень оптимизирована.

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

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

@FindBy может принимать в качестве атрибутов tagName ,partalLinkText, 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 с фабрикой страниц

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("http://demo.guru99.com/V4/");

    }

    /**

     * This test go to http://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("manger id : mgr123"));

    }

}

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

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

AjaxElementLocatorFactory

Одним из ключевых преимуществ использования шаблона Page Factory является класс AjaxElementLocatorFactory.

Он работает над концепцией отложенной загрузки, т. Е. Для класса страницы объекта будет назначен тайм-аут для WebElement с помощью AjaxElementLocatorFactory.

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

Объектная модель страницы (POM) и фабрика страниц в Selenium: полное руководство

Резюме

  1. Объектная модель страницы — это шаблон проектирования репозитория объектов в Selenium WebDriver.
  2. POM создает наш тестовый код, поддерживаемый, многократно используемый.
  3. Page Factory — это оптимизированный способ создания хранилища объектов в концепции POM.
  4. AjaxElementLocatorFactory — это ленивая концепция загрузки в шаблоне Page Factory, позволяющая идентифицировать WebElements только тогда, когда они используются в какой-либо операции.

Загрузите файлы проекта Selenium для демонстрации в этом уроке