Что такое объектная модель страницы?
Объектная модель страницы (POM) - это шаблон проектирования, широко используемый в автоматизации тестирования, который создает репозиторий объектов для элементов веб-интерфейса. Преимущество модели состоит в том, что она уменьшает дублирование кода и улучшает обслуживание тестов.
Согласно этой модели для каждой веб-страницы в приложении должен быть соответствующий класс страницы. Этот класс Page будет идентифицировать WebElements этой веб-страницы, а также содержит методы Page, которые выполняют операции с этими WebElements. Имя этих методов должно быть указано в соответствии с выполняемой ими задачей, то есть, если загрузчик ожидает появления платежного шлюза, имя метода POM может быть waitForPaymentScreenDisplay ().
В этом руководстве вы узнаете:
- Почему объектная модель страницы?
- Преимущества ПОМ
- Как реализовать ПОМ?
- Что такое фабрика страниц?
- Guru99 TestCase с концепцией фабрики страниц
- AjaxElementLocatorFactory
Почему объектная модель страницы?
Запуск автоматизации пользовательского интерфейса в Selenium WebDriver - НЕ сложная задача. Вам просто нужно найти элементы, произвести над ними операции.
Рассмотрим этот простой скрипт для входа на веб-сайт
Как видите, все, что мы делаем, - это находим элементы и заполняем значения для этих элементов.
Это небольшой сценарий. Сопровождение скрипта выглядит простым. Но со временем набор тестов будет расти. По мере того, как вы добавляете в свой код все больше и больше строк, все становится сложно.
Основная проблема с обслуживанием сценариев заключается в том, что если 10 разных сценариев используют один и тот же элемент страницы, при любом изменении этого элемента вам необходимо изменить все 10 сценариев. Это занимает много времени и подвержено ошибкам.
Лучшим подходом к обслуживанию скриптов является создание отдельного файла класса, который будет находить веб-элементы, заполнять их или проверять их. Этот класс можно повторно использовать во всех скриптах, использующих этот элемент. В будущем, если произойдет изменение в веб-элементе, нам нужно будет внести изменения только в 1 файл класса, а не в 10 разных скриптов.
Этот подход в Selenium называется объектной моделью страницы. Это помогает сделать код более читаемым, поддерживаемым и повторно используемым.
Преимущества ПОМ
- В шаблоне проектирования объектов страницы говорится, что операции и потоки в пользовательском интерфейсе должны быть отделены от проверки. Эта концепция делает наш код более чистым и понятным.
- Второе преимущество заключается в том, что репозиторий объектов не зависит от тестовых примеров, поэтому мы можем использовать один и тот же репозиторий объектов для разных целей с разными инструментами. Например, мы можем интегрировать объектную модель страницы в Selenium с TestNG / JUnit для функционального тестирования и одновременно с JBehave / Cucumber для приемочного тестирования.
- Код становится меньше и оптимизируется из-за многократно используемых методов страницы в классах POM.
- Методы получают более реалистичные имена, которые можно легко сопоставить с операцией, происходящей в пользовательском интерфейсе. т.е. если после нажатия на кнопку мы попадаем на домашнюю страницу, имя метода будет иметь вид «gotoHomePage ()».
Как реализовать ПОМ?
Простой ПОМ:
Это базовая структура структуры объектной модели страницы, в которой все веб-элементы AUT и методы, которые работают с этими веб-элементами, хранятся внутри файла класса. Такая задача, как проверка, должна быть отдельной как часть методов тестирования.
Полный пример
TestCase: перейдите на демонстрационный сайт Guru99.
Шаг 1) Перейдите на демонстрационный сайт Guru99 | |
Шаг 2) На домашней странице проверки текста «Guru99 Банк» присутствует | |
Шаг 3) Войдите в приложение | |
Шаг 4) Убедитесь, что на главной странице есть текст "Manger Id: demo". |
Вот мы имеем дело с 2 страницами
- Страница авторизации
- Домашняя страница (отображается после входа в систему)
Соответственно создаем 2 POM в классах Selenium
Guru99 Страница входа в систему POM
страницы пакета;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99Login {Драйвер WebDriver;Автор: user99GuruName = By.name ("uid");По паролю99Guru = By.name ("пароль");По titleText = By.className ("barone");По логину = By.name ("btnLogin");public Guru99Login (драйвер WebDriver) {this.driver = драйвер;}// Устанавливаем имя пользователя в текстовом полеpublic void setUserName (String strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Устанавливаем пароль в текстовом поле пароляpublic void setPassword (String strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Нажмите кнопку входа в системуpublic void clickLogin () {driver.findElement (логин) .click ();}// Получаем заголовок страницы входаpublic String getLoginTitle () {вернуть driver.findElement (titleText) .getText ();}/ *** Этот метод POM будет показан в тестовом примере для входа в приложение* @param strUserName* @param strPasword* @возвращаться* /public void loginToGuru99 (String strUserName, String strPasword) {// Заполняем имя пользователяthis.setUserName (strUserName);// Заполняем парольthis.setPassword (strPasword);// Нажмите кнопку входа в системуthis.clickLogin ();}}
POM домашней страницы Guru99 в Selenium
страницы пакета;import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;public class Guru99HomePage {Драйвер WebDriver;By homePageUserName = By.xpath ("// таблица // tr [@ class = 'heading3']");public Guru99HomePage (драйвер WebDriver) {this.driver = драйвер;}// Получаем имя пользователя с домашней страницыpublic String getHomePageDashboardUserName () {вернуть driver.findElement (homePageUserName) .getText ();}}
Guru99 Простой POM в тестовом примере Selenium
пакетный тест;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;импортировать страницы.Guru99HomePage;импортировать страницы.public class Test99GuruLogin {String driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Этот тестовый пример войдет в систему на http://demo.guru99.com/V4/* Подтвердите заголовок страницы входа в систему как банк guru99* Войти в приложение* Подтвердите домашнюю страницу с помощью сообщения на панели инструментов.* /@Test (приоритет = 0)public void test_Home_Page_Appear_Correct () {// Создание объекта страницы входаobjLogin = новый Guru99Login (драйвер);// Проверяем заголовок страницы входаСтрока loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("банк guru99"));// войти в приложениеobjLogin.loginToGuru99 («мгр123», «мгр! 23»);// перейти на следующую страницуobjHomePage = новый Guru99HomePage (драйвер);// Подтверждаем домашнюю страницуAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("идентификатор менеджера: mgr123"));}
Что такое фабрика страниц в Selenium?
Фабрика страниц в Selenium - это встроенная концепция инфраструктуры объектной модели страницы для Selenium WebDriver, но она очень оптимизирована. Он используется для инициализации объектов Page или для создания экземпляра самого объекта Page. Он также используется для инициализации элементов класса Page без использования «FindElement / s».
Здесь мы также придерживаемся концепции разделения репозитория объектов страницы и методов тестирования. Кроме того, с помощью класса PageFactory в Selenium мы используем аннотации @FindBy для поиска WebElement. Мы используем метод initElements для инициализации веб-элементов
@FindBy может принимать в качестве атрибутов tagName, partialLinkText, name, linkText, id, css, className, xpath .
Давайте посмотрим на тот же пример, что и выше, с использованием фабрики страниц.
Страница входа в Guru99 с Page Factory
пакет 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 {/ *** Все WebElements идентифицируются аннотацией @FindBy* /Драйвер WebDriver;@FindBy (name = "uid")WebElement user99GuruName;@FindBy (name = "пароль")WebElement password99Guru;@FindBy (className = "barone")WebElement titleText;@FindBy (name = "btnLogin")WebElement логин;public Guru99Login (драйвер WebDriver) {this.driver = драйвер;// Этот метод initElements создаст все WebElementsPageFactory.initElements (драйвер, это);}// Устанавливаем имя пользователя в текстовом полеpublic void setUserName (String strUserName) {user99GuruName.sendKeys (strUserName);}// Устанавливаем пароль в текстовом поле пароляpublic void setPassword (String strPassword) {password99Guru.sendKeys (strPassword);}// Нажмите кнопку входа в системуpublic void clickLogin () {login.click ();}// Получаем заголовок страницы входаpublic String getLoginTitle () {вернуть titleText.getText ();}/ *** Этот метод POM будет показан в тестовом примере для входа в приложение* @param strUserName* @param strPasword* @возвращаться* /public void loginToGuru99 (String strUserName, String strPasword) {// Заполняем имя пользователяthis.setUserName (strUserName);// Заполняем парольthis.setPassword (strPasword);// Нажмите кнопку входа в системуthis.clickLogin ();}}
Домашняя страница Guru99 с фабрикой страниц
пакет 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;@FindBy (xpath = "// таблица // tr [@ class = 'heading3']")WebElement homePageUserName;public Guru99HomePage (драйвер WebDriver) {this.driver = драйвер;// Этот метод initElements создаст все WebElementsPageFactory.initElements (драйвер, это);}// Получаем имя пользователя с домашней страницыpublic String getHomePageDashboardUserName () {return homePageUserName.getText ();}}
Guru99 TestCase с концепцией фабрики страниц
пакетный тест;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;открытый класс Test99GuruLoginWithPageFactory {String driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новый FirefoxDriver ();driver.manage (). timeouts (). implicitlyWait (10, TimeUnit.SECONDS);driver.get ("http://demo.guru99.com/V4/");}/ *** Этот тест перейдите на http://demo.guru99.com/V4/* Подтвердите заголовок страницы входа в систему как банк guru99* Войти в приложение* Подтвердите домашнюю страницу с помощью сообщения на панели инструментов.* /@Test (приоритет = 0)public void test_Home_Page_Appear_Correct () {// Создание объекта страницы входаobjLogin = новый Guru99Login (драйвер);// Проверяем заголовок страницы входаСтрока loginPageTitle = objLogin.getLoginTitle ();Assert.assertTrue (loginPageTitle.toLowerCase (). Contains ("банк guru99"));// войти в приложениеobjLogin.loginToGuru99 («мгр123», «мгр! 23»);// перейти на следующую страницуobjHomePage = новый Guru99HomePage (драйвер);// Подтверждаем домашнюю страницуAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Contains ("идентификатор менеджера: mgr123"));}}
Полная структура проекта будет выглядеть как на диаграмме:
AjaxElementLocatorFactory
AjaxElementLocatorFactory - это концепция отложенной загрузки PageFactory в Selenium. Он используется для поиска веб-элементов только тогда, когда эти элементы используются в какой-либо операции. Он назначает тайм-аут для WebElements классу страницы объекта. Одним из ключевых преимуществ использования шаблона PageFactory в Selenium является класс AjaxElementLocatorFactory.
Здесь, когда над элементом выполняется операция, ожидание его видимости начинается только с этого момента. Если элемент не найден в заданный интервал времени, выполнение тестового примера вызовет исключение NoSuchElementException.
Резюме
- Объектная модель страницы в Selenium Websdriver - это шаблон проектирования репозитория объектов.
- Объектная модель страницы Selenium создает наш тестовый код, который можно поддерживать и использовать повторно.
- Фабрика страниц - это оптимизированный способ создания репозитория объектов в концепции структуры объектной модели страницы.
- AjaxElementLocatorFactory - это концепция отложенной загрузки в Page Factory - шаблон проектирования объектов страницы, позволяющий идентифицировать WebElements только тогда, когда они используются в какой-либо операции.
Загрузите файлы проекта Selenium для демонстрации в этом руководстве