Что пишут в блогах

Подписаться

Что пишут в блогах (EN)

Разделы портала

Онлайн-тренинги

Начинающим автоматизаторам: руководство для новичков по Page Object Model (POM) и Page Factory
22.06.2022 00:00

Автор: Теодор Жеррад (Theodore Gerrad)
Оригинал статьи
Перевод: Ольга Алифанова

Если вы интересуетесь тест-автоматизацией, то в какой-то момент зададитесь одним (или всеми) из следующих вопросов – что такое Page Object Model (POM)? Важна ли тест-автоматизация? Надо ли этому учиться? Сколько времени это обучение займет? Если вы похожи на меня – а вы, скорее всего, похожи – то вы впадете в панику, быстро и последовательно спрашивая себя обо всем этом. Хоть я и не эксперт (пока что), я могу предложить свой взгляд на эту проблему. Хоть я и не могу явно ответить на все эти вопросы, я хотел бы поделиться рядом мыслей в этой статье.

Page Object Model(POM)

Если вы знакомы с любым видом фронтенд-веб-разработки, то, возможно, сталкивались с Document Object Model (DOM). DOM широко признан как тип API для документов HTML и XML, позволяющий получать доступ к логической структуре документа и манипулировать ей. Page Object Model работает по схожему принципу. Можно сказать, что POM относится к тест-автоматизации веб-приложений так же, как DOM – к фронтенд-веб-разработке. Page Object Model – это паттерн проектирования в Selenium, создающий репозиторий объектов для хранения всех веб-элементов. Это полезно, так как помогает инженерам-автоматизаторам снизить дупликацию кода и улучшить поддержку тест-кейсов. Каждый файл класса хранит все элементы определенной веб-страницы. Эти элементы затем используются тестировщиками для выполнения операций над тестируемым сайтом.

Преимущества

  1. Очевидное преимущество POM – это простота, позволяющая поддерживать тест-кейсы в случае изменений в UI/веб-элементе. Хороший пример: выпадающее меню изменилось на чек-бокс. POM поможет вам выявить изменившуюся страницу, так как каждая страница имеет отдельный файл класса.
  2. Репозиторий объектов не зависит от тест-кейсов – это отдельные сущности, и это значит, что один и тот же репозиторий можно использовать для разных задач и при помощи различных инструментов. К примеру, репозиторий можно использовать для запуска функциональных тестов через фреймворк вроде TestNG, и в то же самое время – для приемочного тестирования с Cucumber.
  3. При разделении объектов репозитория и тест-кейсов требуется меньше кода, и операции оптимизируются, так как страницы можно использовать повторно.
  4. Скрипты становятся читабельнее, и за ними легко следить – методы получают более реалистичные имена, которые легко ассоциировать с выполняемыми ими операциями.

Внедрение

Допустим, тестируемое приложение – это ваш личный Gmail-аккаунт, базовая структура POM-фреймворка, где все веб-элементы и применяющиеся к ним методы содержатся в файле класса. Простая задача вроде верификации должна быть отделена, будучи частью тест-методов.

Для внедрения POM мы воспользуемся демо-сайтом Guru99, на который можно перейти по ссылке demo.guru99.com/v4. Вначале сайт попросит вас ввести email-адрес для получения доступа к демо-сайту. Не волнуйтесь, это безопасно – введите валидный адрес, и через несколько мгновений для вас будет создан профиль пользователя с ID и паролем, дающим доступ к демо-сайту.

Тест-кейс: Переход к демо-сайту Guru99.

  1. Перейти на страницу авторизации Guru99: demo.guru99.com/v4
  2. Для проверки, что страница верна, убедиться, что на ней присутствует текст "Guru99bank".
  3. Авторизоваться в приложении с полученными данными.
  4. Убедиться, что домашняя страница содержит текст "Welcome To Manager's Page of GTPL Bank".

В этом сценарии использования нас интересуют две страницы, а именно:

  1. Страница авторизации.
  2. Страница менеджера (страница, открывающаяся после успешной авторизации). Поэтому мы создаем два разных java-класса для объектов/веб-элементов в Selenium.

POM для страницы авторизации Guru99

Рассматривая эту страницу, можно отметить ряд важных веб-элементов, использующихся на ней:

  1. Элемент имени пользователя.
  2. Элемент пароля.
  3. Текст заголовка (который мы проверяем, чтобы убедиться, что мы на верной странице).
  4. Кнопка авторизации.

Код ниже определяет все элементы страницы авторизации.


Для проверки, что эта страница приложения работает как нужно, тест-страница имеет следующий код:


Страница менеджера Guru99 в Selenium

Для этой страницы важным элементом будет заголовок страницы, подтверждающий, что авторизация была успешно завершена.


Page Factory

Page Factory – это встроенная концепция фреймворка Page Object Model в Selenium Web Driver. Она хорошо оптимизирована и используется для инициализации объектов страницы или для создания объекта страницы в целом. Page Factory инициализирует элементы класса страницы, не используя "FindElement(s)" – вместо этого применяется аннотация @FindBy, служащая для поиска веб-элементов. Аннотация может найти элементы по tagName, partialLinkText, linkText, name, id, css, xpath, и className. Она также использует метод initElements для инициализации веб-элементов.

Внедрение

Для предыдущего примера PageFactory можно применить так.

Для практического упражнения код ниже идентифицирует элементы домашней страницы BrowserStack, в частности, заголовок страницы. Как упоминалось выше, это делается при помощи аннотации "@FindBy" для обеих страниц тестируемого приложения.

@FindBy(xpath = "//h1")

WebElement Header;

После того, как элементы идентифицированы, следующий шаг – инициализировать их, используя сниппет ниже. Это также делается для обеих страниц приложения.

public "ClassName"(WebDriver driver) {

this.driver = driver;

PageFactory.initElements(driver, this);

}

Действия над идентифицированными элементами выполняются с использованием методов public void. Это повторяется для обеих страниц тестируемого приложения.

public void "methodName"(){

//код, который определяет, что метод должен делать – например, проверить, заголовок страницы String getheadertext = Header.getText(); assertEquals("Testing Made Easy", getheadertext);

}

После идентификации объектов и их инициализации следующим шагом будет создание теста. Тест создается в отдельном файле класса. В этом файле вы пишете ваши тесты. Так как у нас две страницы, имеет смысл использовать тест-аннотации Test NG для инициализации объекта браузера и перехода на сайт. Затем можно использовать "priority=0" для приоритезации кейсов в порядке, который имеет смысл для их запуска. Однако для эффективного выполнения тестов надо убедиться, что тест верно ссылается на созданные нами для обеих страниц приложения объекты. Этого можно добиться, импортируя обе страницы приложения на тест-страницу. Выглядеть это будет примерно так: import PackageName.ApplicationPage;. Теперь мы можем верно сослаться на инициализированные элементы. Наша тест-аннотация выглядит похожей на сниппет ниже:

@Test(priority = 1)

public void navigate_to_homepage_click_on_getstarted() {


objApplicationHomePage = new ApplicationHomePage(driver);

objApplicationHomePage.verifyHeader();

objApplicatHomePage.clickOnLogin();


}

В целом POM и PageFactory эффективны для создания репозиториев page object, которые полезны для автоматизации тестов веб-приложения. Это ключевой навык, который вы должны продемонстрировать в ходе технического собеседования. Этот подход демонстрирует потенциальному нанимателю, что вы держите в уме общую картину подхода к тестированию, не забывая про такие аспекты, как долгосрочная поддерживаемость тест-кейсов – и это помимо того, что внедрение POM делает ваш код более структурированным и читабельным для документирования.

Вот пример кода тест-автоматизации в формате POM:


Для сравнения, тот же самый код без POM займет примерно столько же строк кода. Знаю, о чем вы думаете – "но почему особой разницы нет, я думал, что POM должен делать код более кратким! Почему я пишу столько же кода? Не вижу различий". Да, вы абсолютно правы, и в норме я бы согласился с вами, но помните, что это простое внедрение POM. Имея дело с более сложными проектами с множеством страниц и веб-элементов, с которыми нужно взаимодействовать, вы увидите явную разницу, и выгоды POM станут очевиднее. Есть мнение, что результаты внедрения POM не стоят затраченных усилий. Хоть я и согласен, что иногда его внедрение для простых базовых задач веб-автоматизации – это "овер-инжиниринг", подход POM можно считать хорошей практикой для веб-автоматизации. Чтобы узнать больше о POM и Page Factory, загляните на сайты guru99.com и browserstack.com – оба этих ресурса ценны для начинающих автоматизаторов. Также зайдите на Test Automation University – у них много полезных ресурсов, и они дают более структурированный подход к карьере автоматизатора. На этом я завершаю эту статью для начинающих. Надеюсь, вам понравилось!

Обсудить в форуме