Сторінка Object Model & Factory в Selenium
⚡ Розумний підсумок
Об'єктна модель сторінки та фабрика сторінок у Selenium визначити структурований шаблон проектування для створення надійних, зручних у підтримці фреймворків автоматизації тестування. Він наголошує на створенні класів, специфічних для сторінок, які інкапсулюють WebElements та їхню поведінку, тим самим зменшуючи дублювання та покращуючи читабельність і масштабованість Selenium тестові сценарії.
Що таке об'єктна модель сторінки? Які її ключові компоненти?
Об'єктна модель сторінки (POM) — це шаблон проектування, що широко використовується в автоматизації тестування, який створює сховище об'єктів для елементів веб-інтерфейсу. Перевагою цієї моделі є зменшення дублювання коду та покращення підтримки тестів.
Згідно з цією моделлю, для кожної веб-сторінки в застосунку має бути відповідний клас Page. Цей клас Page ідентифікуватиме веб-елементи цієї веб-сторінки, а також міститиме методи Page, які виконують операції з цими веб-елементами. Назви цих методів слід надавати відповідно до завдання, яке вони виконують, тобто, якщо завантажувач очікує появи платіжного шлюзу, назва методу POM може бути waitForPaymentScreenDisplay().
Ключові компоненти об'єктної моделі сторінки
- Класи сторінок: Представте кожну веб-сторінку як окремий клас.
- Локатори: Визначайте веб-елементи за допомогою ідентифікаторів, XPath або CSS-селекторів.
- методи: Містити дії або операції, що виконуються над елементами .page.
- Багаторазовість: Promoповторне використання коду TES та легше обслуговування в різних тестах.
- Відокремлення концернів: Зберігає структуру сторінки незалежною від логіки тестування для кращої організації.
Чому об’єктна модель сторінки?
Запуск автоматизації інтерфейсу користувача в Selenium веб-драйвер це НЕ складне завдання. Вам просто потрібно знайти елементи та виконати над ними операції.
Розглянемо цей простий скрипт для входу на вебсайт.
Як ви бачите, усе, що ми робимо, це знаходимо елементи та заповнюємо значення для цих елементів.
Це трудомісткий скрипт, схильний до помилок. Спочатку він здається простим, але з розширенням набору тестів керування змінами елементів стає складним. Але з часом набір тестів зростатиме. З додаванням дедалі більшої кількості рядків до коду все стає складніше.
Основна проблема з підтримкою сценаріїв полягає в тому, що якщо 10 різних сценаріїв використовують той самий елемент сторінки, при будь-якій зміні в цьому елементі вам потрібно змінити всі 10 сценаріїв. Це займає багато часу та може викликати помилки.
Кращий підхід до обслуговування скриптів полягає у створенні окремого файлу класу, який би знаходив веб-елементи, заповнював їх або перевіряв. Цей клас потім можна буде повторно використовувати в кількох тестових скриптах, які взаємодіють з одним і тим самим елементом. У майбутньому, якщо відбудуться зміни в веб-елементі, нам потрібно буде внести зміни лише в один файл класу, а не в 10 різних скриптах.
Цей підхід називається Page Object Model in SeleniumЦе допомагає зробити код більш читабельним, зручним у підтримці та придатним для повторного використання.
👉 Зареєструйтесь для безкоштовного прямого ефіру Selenium Проекти
Переваги ПОМ
- Шаблон дизайну об’єкта сторінки каже, що операції та потоки в інтерфейсі користувача мають бути відокремлені від перевірки. Ця концепція робить наш код чистішим і зрозумілішим.
- Друга перевага полягає в тому, що репозиторій об'єктів не залежить від тестових випадків, тому ми можемо використовувати той самий репозиторій об'єктів для різних цілей з різними інструментами. Наприклад, ми можемо інтегрувати модель об'єктів сторінки в Selenium з TestNG/JUnit для функціональних Тестування і в той же час з JBehave/Cucumber для приймальних випробувань.
- Код стає меншим та оптимізованим, оскільки він повторно використовує методи сторінок у класах POM.
- Методи отримують більш реалістичні назви, які можна легко зіставити з операцією, що відбувається в інтерфейсі користувача. Наприклад, якщо після натискання кнопки ми потрапляємо на головну сторінку, назва методу буде такою: «gotoHomePage()».
Як впровадити POM у Selenium?
Простий PLog у фундаментальній структурі фреймворку моделі об'єктів сторінки, де whereManagerElements AUT а методи, що працюють з цими веб-елементами, зберігаються всередині файлу clog. Таке завдання, як перевірка, має бути окремим як частина методів тестування.
Повний приклад
TestCase: Перейдіть на демонстраційний сайт Guru99.
Крок 1) Перейдіть на демонстраційний сайт Guru99
Крок 2) На головній сторінці перевірте наявність тексту «Guru99 Bank»
Крок 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"));
}
У чому полягає Page Factory Selenium?
Page Factory в Selenium це вбудована концепція каркаса об’єктної моделі сторінки для Selenium WebDriver, що покращує зручність обслуговування, зменшуючи повторювані пошуки елементів за допомогою анотацій, а не швидкість виконання. Він використовується для ініціалізації об'єктів Page або для створення екземпляра самого об'єкта Page. Він також використовується для ініціалізації елементів класу Page без використання "FindElement/s".
Тут також ми дотримуємося концепції поділу сховища об’єктів сторінки та методів тестування. Крім того, за допомогою класу PageFactory в Selenium, використовуємо анотації @FindBy щоб знайти WebElement. Ми використовуємо метод initElements для ініціалізації веб-елементів.
@FindBy може прийняти tagName, partialLinkText, 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 із 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 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("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 Файли проекту для демонстрації в цьому посібнику












