Модель об'єкта сторінки (POM) & Фабрика сторінок у підручнику з селену

Зміст:

Anonim

Що таке об'єктна модель сторінки?

Сторінкова об'єктна модель (POM) - це шаблон дизайну, який широко використовується в тестовій автоматизації, який створює сховище об'єктів для елементів веб-інтерфейсу. Перевага моделі полягає в тому, що вона зменшує дублювання коду та покращує технічне обслуговування.

Згідно з цією моделлю для кожної веб-сторінки у програмі повинен бути відповідний клас сторінки. Цей клас Page визначає WebElements цієї веб-сторінки, а також містить методи Page, які виконують операції з такими WebElements. Назва цих методів повинна бути вказана відповідно до завдання, яке вони виконують, тобто, якщо завантажувач чекає появи шлюзу платежів, ім'я методу POM може бути waitForPaymentScreenDisplay ().

У цьому підручнику ви дізнаєтесь-

  • Чому об'єктна модель сторінки?
  • Переваги POM
  • Як реалізувати POM?
  • Що таке Page Factory?
  • Guru99 TestCase з концепцією Page Factory
  • AjaxElementLocatorFactory

Чому об'єктна модель сторінки?

Запуск автоматизації інтерфейсу користувача в Selenium WebDriver - НЕ важке завдання. Потрібно просто знайти елементи, виконати над ними операції.

Розгляньте цей простий сценарій для входу на веб-сайт

Як ви можете помітити, все, що ми робимо - це пошук елементів та заповнення значень для цих елементів.

Це невеликий сценарій. Обслуговування сценарію виглядає легко. Але з часом набір тестів буде зростати. Коли ви додаєте все більше і більше рядків до свого коду, все стає жорстким.

Основна проблема обслуговування скриптів полягає в тому, що якщо 10 різних сценаріїв використовують один і той же елемент сторінки, при будь-яких змінах цього елемента, вам потрібно змінити всі 10 сценаріїв. Це трудомістке та схильне до помилок.

Кращий підхід до обслуговування сценаріїв - це створення окремого файлу класу, який знаходив би веб-елементи, заповнював їх або перевіряв. Цей клас можна використовувати повторно у всіх сценаріях, використовуючи цей елемент. Надалі, якщо відбудеться зміна веб-елемента, нам потрібно внести зміни лише в 1 файл класу, а не в 10 різних сценаріїв.

Цей підхід називається Page Object Model в Selenium. Це допомагає зробити код більш читабельним, ремонтопридатним та багаторазовим.

Переваги POM

  1. Шаблон дизайну об’єкта сторінки говорить, що операції та потоки в інтерфейсі користувача слід відокремлювати від перевірки. Ця концепція робить наш код чистішим та зрозумілішим.
  2. Друга перевага - сховище об’єктів не залежить від тестових випадків, тому ми можемо використовувати одне і те ж сховище об’єктів для різних цілей з різними інструментами. Наприклад, ми можемо інтегрувати Page Object Model в Selenium з TestNG / JUnit для функціонального тестування і одночасно з JBehave / Cucumber для приймального тестування.
  3. Код стає меншим та оптимізованим через багаторазові методи сторінки в класах POM.
  4. Методи отримують більш реалістичні імена, які можна легко зіставити з операцією, що відбувається в інтерфейсі користувача. тобто якщо після натискання кнопки ми потрапляємо на домашню сторінку, назва методу буде виглядати як 'gotoHomePage ()'.

Як реалізувати POM?

Простий POM:

Це основна структура фреймворку об'єктної моделі сторінки, де всі веб-елементи AUT та метод, що працює з цими веб-елементами, зберігаються всередині файлу класу. Таке завдання, як перевірка, має бути окремим як частина методів тестування.

Повний приклад

TestCase: Перейдіть на демонстраційний сайт Guru99.

Крок 1) Перейдіть на демонстраційний сайт Guru99
Крок 2) На головній сторінці перевірки тексту «Guru99 Банк» присутній
Крок 3) Увійдіть до програми
Крок 4) Переконайтеся, що домашня сторінка містить текст як "Manger Id: demo"

Ось ми маємо справу з 2 сторінками

  1. Сторінка входу
  2. Домашня сторінка (відображається після входу)

Відповідно, ми створюємо 2 POM в класах Selenium

Сторінка входу Guru99 POM

сторінки пакунку;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;публічний клас Guru99Login {Драйвер WebDriver;За користувачем99GuruName = By.name ("uid");За паролем99Guru = By.name ("пароль");За titleText = By.className ("барон");За входом = By.name ("btnLogin");public Guru99Login (драйвер WebDriver) {this.driver = драйвер;}// Встановити ім'я користувача в текстовому поліpublic void setUserName (рядок strUserName) {driver.findElement (user99GuruName) .sendKeys (strUserName);}// Встановити пароль у текстовому полі пароляpublic void setPassword (рядок strPassword) {driver.findElement (password99Guru) .sendKeys (strPassword);}// Клацніть на кнопку входуpublic void clickLogin () {driver.findElement (логін) .click ();}// Отримати заголовок сторінки входуpublic String getLoginTitle () {повернути драйвер.findElement (titleText) .getText ();}/ *** Цей метод POM буде доступний у тестовому випадку для входу в програму* @param strUserName* @param strPasword* @ повернення* /public void loginToGuru99 (рядок strUserName, рядок strPasword) {// Заповнити ім'я користувачаthis.setUserName (strUserName);// Введіть парольthis.setPassword (strPasword);// Клацніть на кнопку Увійтиthis.clickLogin ();}}

Домашня сторінка Guru99 POM у селені

сторінки пакунку;імпорт org.openqa.selenium.By;імпорт org.openqa.selenium.WebDriver;публічний клас Guru99HomePage {Драйвер WebDriver;За homePageUserName = By.xpath ("// таблиця // tr [@ class = 'heading3']");public Guru99HomePage (драйвер WebDriver) {this.driver = драйвер;}// Отримати ім’я користувача з домашньої сторінкизагальнодоступний рядок getHomePageDashboardUserName () {повернути драйвер.findElement (homePageUserName) .getText ();}}

Guru99 Simple POM у тестовому випадку селену

пакетний тест;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт org.testng.Assert;імпорт org.testng.annotations.BeforeTest;імпорт org.testng.annotations.Test;імпорт сторінок.Guru99HomePage;імпорт сторінок.Guru99Login;публічний клас Test99GuruLogin {Рядок driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (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 (). Містить ("банк guru99"));// вхід до програмиobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// перейти на наступну сторінкуobjHomePage = новий Guru99HomePage (драйвер);// Перевірка домашньої сторінкиAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Містить ("ідентифікатор ясла: mgr123"));}

Що таке Page Factory у селені?

Page Factory в Selenium - це вбудована концепція рамкової моделі об'єктів сторінок для Selenium WebDriver, але вона дуже оптимізована. Він використовується для ініціалізації об'єктів Page або для створення екземпляра самого об'єкта Page. Він також використовується для ініціалізації елементів класу Page без використання "FindElement / s".

Тут також ми дотримуємося концепції розділення сховища об’єктів сторінки та методів тестування. Крім того, за допомогою класу PageFactory в Selenium ми використовуємо анотації @FindBy для пошуку WebElement. Ми використовуємо метод initElements для ініціалізації веб-елементів

@FindBy може прийняти як атрибути tagName, partLinkText, name, linkText, id, css, className, xpath .

Давайте розглянемо той самий приклад, що і вище, використовуючи Page Factory

Сторінка входу Guru99 зі сторінкою Factory

пакет PageFactory;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.support.FindBy;імпорт org.openqa.selenium.support.PageFactory;публічний клас Guru99Login {/ *** Усі WebElements ідентифікуються за допомогою анотації @FindBy* /Драйвер WebDriver;@FindBy (name = "uid")Користувач WebElement99GuruName;@FindBy (name = "пароль")Пароль WebElement99Guru;@FindBy (className = "barone")Заголовок WebElementText;@FindBy (name = "btnLogin")Логін WebElement;public Guru99Login (драйвер WebDriver) {this.driver = драйвер;// Цей метод initElements створить усі WebElementsPageFactory.initElements (драйвер, це);}// Встановити ім'я користувача в текстовому поліpublic void setUserName (рядок strUserName) {user99GuruName.sendKeys (strUserName);}// Встановити пароль у текстовому полі пароляpublic void setPassword (рядок strPassword) {password99Guru.sendKeys (strPassword);}// Клацніть на кнопку входуpublic void clickLogin () {login.click ();}// Отримати заголовок сторінки входуpublic String getLoginTitle () {повернути titleText.getText ();}/ *** Цей метод POM буде доступний у тестовому випадку для входу в програму* @param strUserName* @param strPasword* @ повернення* /public void loginToGuru99 (рядок strUserName, рядок strPasword) {// Заповнити ім'я користувачаthis.setUserName (strUserName);// Введіть парольthis.setPassword (strPasword);// Клацніть на кнопку Увійтиthis.clickLogin ();}}

Домашня сторінка Guru99 із фабрикою сторінок

пакет PageFactory;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.WebElement;імпорт org.openqa.selenium.support.FindBy;імпорт org.openqa.selenium.support.PageFactory;публічний клас Guru99HomePage {Драйвер WebDriver;@FindBy (xpath = "// таблиця // tr [@ class = 'heading3']")WebElement homePageUserName;public Guru99HomePage (драйвер WebDriver) {this.driver = драйвер;// Цей метод initElements створить усі WebElementsPageFactory.initElements (драйвер, це);}// Отримати ім’я користувача з домашньої сторінкизагальнодоступний рядок getHomePageDashboardUserName () {повернути homePageUserName.getText ();}}

Guru99 TestCase з концепцією Page Factory

пакетний тест;імпортувати java.util.concurrent.TimeUnit;імпорт org.openqa.selenium.WebDriver;імпорт org.openqa.selenium.firefox.FirefoxDriver;імпорт org.testng.Assert;імпорт org.testng.annotations.BeforeTest;імпорт org.testng.annotations.Test;імпортувати PageFactory.Guru99HomePage;імпортувати PageFactory.Guru99Login;відкритий клас Test99GuruLoginWithPageFactory {Рядок driverPath = "C: \\ geckodriver.exe";Драйвер WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestpublic void setup () {System.setProperty ("webdriver.gecko.driver", driverPath);драйвер = новий FirefoxDriver ();driver.manage (). timeouts (). неявноWait (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 (). Містить ("банк guru99"));// вхід до програмиobjLogin.loginToGuru99 ("mgr123", "mgr! 23");// перейти на наступну сторінкуobjHomePage = новий Guru99HomePage (драйвер);// Перевірка домашньої сторінкиAssert.assertTrue (objHomePage.getHomePageDashboardUserName (). ToLowerCase (). Містить ("ідентифікатор ясла: mgr123"));}}

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

AjaxElementLocatorFactory

AjaxElementLocatorFactory - концепція лінивого завантаження PageFactory в селені. Він використовується для пошуку веб-елементів лише тоді, коли елементи використовуються в будь-якій операції. Він призначає час очікування для WebElements класу сторінки об’єкта. Однією з ключових переваг використання шаблону PageFactory в Selenium є клас AjaxElementLocatorFactory.

Тут, коли операція виконується над елементом, очікування його видимості починається лише з цього моменту. Якщо елемент не знайдено в заданому інтервалі часу, тестовий випадок викличе виняток 'NoSuchElementException'.

Резюме

  1. Модель об'єктів сторінок у Selenium Websdriver - це шаблон дизайну сховища об'єктів.
  2. Сторінкова об'єктна модель селену створює наш тестовий код, який можна підтримувати та використовувати багаторазово.
  3. Page Factory - це оптимізований спосіб створення сховища об'єктів у концепції фреймворкової моделі Page Object Model.
  4. AjaxElementLocatorFactory - це концепція лінивого завантаження у Page Factory - шаблон дизайну об'єкта сторінки для ідентифікації WebElements лише тоді, коли вони використовуються в будь-якій операції.

Завантажте файли проекту Selenium для демонстрації у цьому посібнику