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

Что такое объектная модель страницы и каковы её ключевые компоненты?
Объектная модель страницы (POM) — это шаблон проектирования, широко используемый в автоматизации тестирования, который создаёт репозиторий объектов для элементов веб-интерфейса. Преимущество этой модели заключается в уменьшении дублирования кода и улучшении поддержки тестов.
В рамках этой модели для каждой веб-страницы в приложении должен быть соответствующий класс Page. Этот класс будет идентифицировать веб-элементы этой веб-страницы и содержать методы Page, которые выполняют операции с этими веб-элементами. Имена этих методов должны соответствовать выполняемой ими задаче. Например, если загрузчик ожидает появления платёжного шлюза, имя метода POM может быть waitForPaymentScreenDisplay().
Ключевые компоненты объектной модели страницы
- Классы страниц: Представлять каждую веб-страницу как отдельный класс.
- Локаторы: Идентифицируйте веб-элементы с помощью идентификаторов, XPath или селекторов CSS.
- Методы: Содержат действия или операции, выполняемые над элементами .page.
- Возможность повторного использования: Promoповторное использование кода tes и упрощение обслуживания при проведении тестов.
- Разделение интересов: Сохраняет структуру страницы независимой от логики теста для лучшей организации.
Почему объектная модель страницы?
Запуск автоматизации пользовательского интерфейса в Selenium Вебдрайвер Это НЕ сложная задача. Нужно просто найти элементы и выполнить над ними операции.
Рассмотрим этот простой скрипт для входа на сайт.
Как вы можете заметить, все, что мы делаем, — это находим элементы и заполняем значения для этих элементов.
Это трудоёмкий скрипт, подверженный ошибкам. Поначалу он кажется простым, но по мере расширения набора тестов управление изменениями элементов становится сложным. Однако со временем набор тестов будет расти. По мере добавления всё большего количества строк кода всё становится сложнее.
Основная проблема с обслуживанием скриптов заключается в том, что если 10 разных скриптов используют один и тот же элемент страницы, то при любом изменении этого элемента вам придется изменить все 10 скриптов. Это отнимает много времени и чревато ошибками.
Более эффективным подходом к обслуживанию скриптов является создание отдельного файла класса, который будет находить веб-элементы, заполнять их или проверять. Этот класс затем можно будет повторно использовать в нескольких тестовых скриптах, взаимодействующих с одним и тем же элементом. В будущем, если в веб-элемент будут внесены изменения, нам нужно будет вносить изменения только в один файл класса, а не в 10 разных скриптов.
Этот подход называется объектной моделью страницы. Selenium. Это помогает сделать код более читаемым, поддерживаемым и пригодным для повторного использования.
👉 Зарегистрируйтесь на бесплатный Live Selenium Проект
Преимущества ПОМ
- Шаблон проектирования объектов страницы говорит, что операции и потоки в пользовательском интерфейсе должны быть отделены от проверки. Эта концепция делает наш код чище и понятнее.
- Второе преимущество заключается в том, что репозиторий объектов не зависит от тестовых случаев, поэтому мы можем использовать один и тот же репозиторий объектов для разных целей с разными инструментами. Например, мы можем интегрировать Page Object Model в Selenium с TestNG/JUnit для функционального Тестирование и в то же время с JBehave/Cucumber для приемочных испытаний.
- Code Он становится менее ресурсоемким и оптимизированным, поскольку повторно использует методы страницы в классах POM.
- Методы получают более реалистичные имена, которые можно легко сопоставить с операциями, выполняемыми в пользовательском интерфейсе. Например, если после нажатия кнопки мы попадаем на домашнюю страницу, имя метода будет похоже на «gotoHomePage()».
Как внедрить POM в Selenium?
Простой PLog в базовой структуре фреймворка Page Object Model, где элементы whereManagereIDE AUT Методы, работающие с этими веб-элементами, хранятся в файле clog. Такая задача, как верификация, должна быть выделена в отдельную часть тестовых методов.
Полный пример
Прецедент: Перейдите на GuruДемонстрационный сайт 99.
Шаг 1) Перейти к Guru99 Демонстрационный сайт
Шаг 2) На главной странице убедитесь, что текст «GuruБанк «99» присутствует
Шаг 3) Войдите в приложение
Шаг 4) Убедитесь, что на домашней странице содержится текст «Идентификатор менеджера: демо».
В этом примере мы имеем дело с двумя страницами:
- Страница входа
- Домашняя страница (отображается после входа в систему)
Соответственно создаем 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 для инициализации веб-элементов.
@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"));
}
}
Полная структура проекта будет выглядеть так:
AjaxElementLocatorFactory
AjaxElementLocatorFactory — это концепция отложенной загрузки PageFactory в Selenium. Он используется для поиска веб-элементов только тогда, когда они используются в какой-либо операции. Он назначает тайм-аут для WebElements классу страницы объекта. Одно из ключевых преимуществ использования шаблона PageFactory в Selenium — это класс AjaxElementLocatorFactory.
Здесь, когда над элементом выполняется операция, ожидание его видимости начинается только с этого момента. Если элемент не найден в указанный интервал времени, Тестовый кейс выполнение выдаст исключение NoSuchElementException.
Например:
AjaxElementLocatorFactory factory = new AjaxElementLocatorFactory(driver, 10); PageFactory.initElements(factory, this);
Скачать Selenium Файлы проекта для демонстрации в этом руководстве











