Модел на обект на страница (POM) & Фабрика за страници в урок за селен

Съдържание:

Anonim

Какво представлява Page Object Model?

Page Object Model (POM) е модел на проектиране, широко използван в тестовата автоматизация, който създава Object Repository за уеб елементи на потребителския интерфейс. Предимството на модела е, че намалява дублирането на код и подобрява поддръжката на теста.

При този модел за всяка уеб страница в приложението трябва да има съответния клас на страница. Този клас Page ще идентифицира WebElements на тази уеб страница и също така съдържа методи на Page, които извършват операции върху тези WebElements. Името на тези методи трябва да бъде дадено според задачата, която изпълняват, т.е. ако зареждащият продукт чака шлюза за плащане да се появи, името на метода на POM може да бъде waitForPaymentScreenDisplay ().

В този урок ще научите -

  • Защо Page Object Model?
  • Предимства на POM
  • Как да приложим POM?
  • Какво е Page Factory?
  • Guru99 TestCase с концепция Page Factory
  • AjaxElementLocatorFactory

Защо Page Object Model?

Стартирането на автоматизация на потребителския интерфейс в Selenium WebDriver НЕ е трудна задача. Трябва само да намерите елементи, да извършите операции върху него.

Помислете за този прост скрипт, за да влезете в уебсайт

Както можете да забележите, всичко, което правим, е да намираме елементи и да попълваме стойности за тези елементи.

Това е малък скрипт. Поддръжката на скриптове изглежда лесно. Но с времето тестовият пакет ще расте. Докато добавяте все повече и повече редове към вашия код, нещата стават трудни.

Основният проблем при поддръжката на скриптове е, че ако 10 различни скрипта използват един и същ елемент на страницата, с всяка промяна в този елемент, трябва да промените всички 10 скрипта. Това отнема много време и е склонна към грешки.

По-добър подход за поддръжка на скриптове е да се създаде отделен файл на класа, който да намира уеб елементи, да ги попълва или да ги проверява. Този клас може да бъде използван повторно във всички скриптове, използващи този елемент. В бъдеще, ако има промяна в уеб елемента, трябва да направим промяната само в 1 файл на класа, а не в 10 различни скрипта.

Този подход се нарича Page Object Model в Selenium. Той помага да направите кода по-четлив, поддържаем и многократно използван.

Предимства на POM

  1. Page Object Design Pattern казва, че операциите и потоците в потребителския интерфейс трябва да бъдат отделени от проверката. Тази концепция прави нашия код по-чист и лесен за разбиране.
  2. Второто предимство е, че хранилището на обекти е независимо от тестовите случаи, така че можем да използваме едно и също хранилище на обекти за различна цел с различни инструменти. Например, можем да интегрираме Page Object Model в Selenium с TestNG / JUnit за функционално тестване и едновременно с JBehave / Cucumber за тестове за приемане.
  3. Кодът става по-малко и оптимизиран поради многократно използваните методи на страница в класовете POM.
  4. Методите получават по-реалистични имена, които могат лесно да бъдат картографирани с операцията, която се случва в потребителския интерфейс. т.е. ако след щракване върху бутона кацнем на началната страница, името на метода ще бъде като 'gotoHomePage ()'.

Как да приложим POM?

Обикновено POM:

Това е основната структура на рамката на обектния модел Page, където всички уеб елементи на AUT и метода, които работят с тези уеб елементи, се поддържат във файл на клас. Задача като проверка трябва да бъде отделна като част от методите за тестване.

Пълен пример

TestCase: Отидете на демонстрационния сайт на Guru99.

Стъпка 1) Отидете на демонстрационния сайт на Guru99
Стъпка 2) В началната страница на проверка на текст "Guru99 банка" е налице
Стъпка 3) Влезте в приложението
Стъпка 4) Проверете дали началната страница съдържа текст като „Id на Manger: demo“

Тук имаме работа с 2 страници

  1. Страница за вход
  2. Начална страница (показва се след като влезете)

Съответно, ние създаваме 2 POM в селенови класове

Страница за вход в Guru99 POM

страници с пакети;внос org.openqa.selenium.By;импортиране на org.openqa.selenium.WebDriver;публичен клас Guru99Login {Драйвер за WebDriver;От user99GuruName = By.name ("uid");По парола99Guru = By.name ("парола");Чрез titleText = By.className ("barone");Чрез вход = By.name ("btnLogin");публичен 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 ();}// Вземете заглавието на страницата за входпубличен низ getLoginTitle () {връщане на драйвер.findElement (titleText) .getText ();}/ *** Този метод POM ще бъде изложен в тестов случай за влизане в приложението* @param strUserName* @param strPasword* @ завръщане* /public void loginToGuru99 (String strUserName, String strPasword) {// Попълнете потребителско имеthis.setUserName (strUserName);// Попълнете паролаthis.setPassword (strPasword);// Щракнете върху бутона Loginthis.clickLogin ();}}

Начална страница на Guru99 POM в селен

страници с пакети;внос org.openqa.selenium.By;импортиране на org.openqa.selenium.WebDriver;публична класа Guru99HomePage {Драйвер за WebDriver;Чрез homePageUserName = By.xpath ("// таблица // tr [@ class = 'heading3']");публичен Guru99HomePage (драйвер за WebDriver) {this.driver = драйвер;}// Вземете потребителското име от началната страницапубличен низ getHomePageDashboardUserName () {връщане на драйвер.findElement (homePageUserName) .getText ();}}

Guru99 Simple POM в тестов калъф за селен

пакет тест;импортиране на java.util.concurrent.TimeUnit;импортиране на org.openqa.selenium.WebDriver;импортиране на org.openqa.selenium.firefox.FirefoxDriver;import org.testng.Assert;внос org.testng.annotations.BeforeTest;внос org.testng.annotations.Test;страници за импортиране.Guru99HomePage;страници за импортиране.Guru99Login;публичен клас Test99GuruLogin {String driverPath = "C: \\ geckodriver.exe";Драйвер за WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestпублична настройка за невалидни () {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 bank* Влезте в приложението* Проверете началната страница, като използвате съобщение на таблото за управление* /@ Тест (приоритет = 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 (). Съдържа ("id на ясла: mgr123"));}

Какво е Page Factory в селен?

Page Factory в Selenium е вградена рамкова концепция на Page Object Model за Selenium WebDriver, но е много оптимизирана. Използва се за инициализация на обектите Page или за създаване на екземпляр на самия обект Page. Също така се използва за инициализиране на елементи от клас Page, без да се използва „FindElement / s“.

И тук следваме концепцията за разделяне на хранилището на обекти на страницата и методи за тестване. Освен това, с помощта на клас PageFactory в Селен, ние използваме анотации @FindBy, за да намерим WebElement. Използваме метода initElements за инициализиране на уеб елементи

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

Нека разгледаме същия пример, както по-горе, използвайки Page Factory

Страница за вход в Guru99 с Фабрика на страници

пакет 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")WebElement titleText;@FindBy (name = "btnLogin")Вход за WebElement;публичен 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 ();}// Вземете заглавието на страницата за входпубличен низ getLoginTitle () {върнете titleText.getText ();}/ *** Този метод POM ще бъде изложен в тестов случай за влизане в приложението* @param strUserName* @param strPasword* @ завръщане* /public void loginToGuru99 (String strUserName, String strPasword) {// Попълнете потребителско имеthis.setUserName (strUserName);// Попълнете паролаthis.setPassword (strPasword);// Щракнете върху бутона Loginthis.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;публичен 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;import org.testng.Assert;внос org.testng.annotations.BeforeTest;внос org.testng.annotations.Test;импортиране на PageFactory.Guru99HomePage;импортиране на PageFactory.Guru99Login;публичен клас Test99GuruLoginWithPageFactory {String driverPath = "C: \\ geckodriver.exe";Драйвер за WebDriver;Guru99Login objLogin;Guru99HomePage objHomePage;@BeforeTestпублична настройка за невалидни () {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 bank* Влезте в приложението* Проверете началната страница, като използвате съобщение на таблото за управление* /@ Тест (приоритет = 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 (). Съдържа ("id на ясла: mgr123"));}}

Пълната структура на проекта ще изглежда като диаграмата:

AjaxElementLocatorFactory

AjaxElementLocatorFactory е мързелива концепция за зареждане на PageFactory в Селен. Използва се за намиране на уеб елементите само когато елементите се използват при някаква операция. Той присвоява време на изчакване за WebElements на класа на обектната страница. Едно от ключовите предимства на използването на шаблона PageFactory в Selenium е AjaxElementLocatorFactory Class.

Тук, когато се извършва операция върху елемент, изчакването за неговата видимост започва само от този момент. Ако елементът не бъде намерен в дадения интервал от време, изпълнението на Test Case ще изведе изключение „NoSuchElementException“.

Обобщение

  1. Модел на обект на страница в Selenium Websdriver е модел на дизайн на хранилище на обекти.
  2. Обектният модел на страницата на селен създава нашия тестов код, който може да се поддържа и може да се използва многократно.
  3. Page Factory е оптимизиран начин за създаване на хранилище на обекти в рамковата концепция на Page Object Model.
  4. AjaxElementLocatorFactory е концепция за мързеливо зареждане в Page Factory - шаблон за дизайн на обект на страница, за да се идентифицират WebElements само когато се използват във всяка операция.

Изтеглете файловете за проект на Selenium за демонстрацията в този урок