Что такое объектная модель страницы?
Объектная модель страницы (POM) — это шаблон проектирования, широко используемый в автоматизации тестирования, который создает репозиторий объектов для элементов веб-интерфейса. Преимущество модели заключается в том, что она уменьшает дублирование кода и улучшает сопровождение тестирования.
В соответствии с этой моделью для каждой веб-страницы в приложении должен быть соответствующий класс страниц. Этот класс Page идентифицирует веб-элементы этой веб-страницы, а также содержит методы Page, которые выполняют операции с этими веб-элементами. Имя этих методов следует указывать в соответствии с задачей, которую они выполняют, т. Е. Если загрузчик ожидает появления платежного шлюза, именем метода POM может быть waitForPaymentScreenDisplay ().
В этом уроке вы узнаете
- Почему объектная модель страницы?
- Преимущества ПОМ
- Как реализовать POM?
- Что такое Фабрика страниц?
- Guru99 TestCase с концепцией Page Factory
- AjaxElementLocatorFactory
Почему объектная модель страницы?
Запуск автоматизации пользовательского интерфейса в Selenium WebDriver НЕ является сложной задачей. Вам просто нужно найти элементы, выполнить над ними операции.
Рассмотрим этот простой скрипт для входа на сайт
Как вы можете заметить, все, что мы делаем, — это находим элементы и заполняем значения для этих элементов.
Это маленький сценарий. Сценарий обслуживания выглядит легко. Но со временем набор тестов будет расти. Когда вы добавляете все больше и больше строк в ваш код, все становится сложнее.
Основная проблема с обслуживанием сценариев заключается в том, что если 10 различных сценариев используют один и тот же элемент страницы, то при любом изменении этого элемента необходимо изменить все 10 сценариев. Это отнимает много времени и подвержено ошибкам.
Лучшим подходом к обслуживанию скриптов является создание отдельного файла классов, который бы находил веб-элементы, заполнял их или проверял их. Этот класс можно повторно использовать во всех сценариях, использующих этот элемент. В будущем, если в веб-элементе произошли изменения, нам нужно внести изменения только в 1 файл класса, а не в 10 различных скриптов.
Этот подход называется объектной моделью страницы (POM) . Это помогает сделать код более читабельным, поддерживаемым и повторно используемым.
Преимущества ПОМ
- Шаблон объекта страницы говорит, что операции и потоки в пользовательском интерфейсе должны быть отделены от проверки. Эта концепция делает наш код чище и понятнее.
- 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.
- Code becomes less and optimized because of the reusable page methods in the POM classes.
- 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.
Полный пример
TestCase: перейдите на демонстрационный сайт Guru99.
Вот мы имеем дело с 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 для инициализации веб-элементов
@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")); } }
Полная структура проекта будет выглядеть следующим образом:
AjaxElementLocatorFactory
Одним из ключевых преимуществ использования шаблона Page Factory является класс AjaxElementLocatorFactory.
Он работает над концепцией отложенной загрузки, т. Е. Для класса страницы объекта будет назначен тайм-аут для WebElement с помощью AjaxElementLocatorFactory.
Здесь, когда операция выполняется над элементом, ожидание его видимости начинается только с этого момента. Если элемент не найден в заданном интервале времени, выполнение тестового примера вызовет исключение NoSuchElementException.
Резюме
- Объектная модель страницы — это шаблон проектирования репозитория объектов в Selenium WebDriver.
- POM создает наш тестовый код, поддерживаемый, многократно используемый.
- Page Factory — это оптимизированный способ создания хранилища объектов в концепции POM.
- AjaxElementLocatorFactory — это ленивая концепция загрузки в шаблоне Page Factory, позволяющая идентифицировать WebElements только тогда, когда они используются в какой-либо операции.
Загрузите файлы проекта Selenium для демонстрации в этом уроке