Build project codecov pre-commit

Реализация паттерна Page Object для Playwright

Подключение

Maven

<dependency>
  <groupId>ru.romanow.playwright</groupId>
  <artifactId>playwright-page-object</artifactId>
  <version>${playwright-page-object.version}</version>
</dependency>

Gradle

testImplementation "ru.romanow.playwright:playwright-page-object:$playwrightPageObjectVersion"

Шаблон проектирования Page Object

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

Основные преимущества:

  • Разделение кода тестов и описания страниц.
  • Объединение всех действий по работе с веб-страницей в одном месте.

Page Object описывает действия над элементами страницы, при этом не выставляя наружу элементы страницы: т.е. коммуникация со страницей выполняются внутри метода, тест лишь вызывает действия более высокого уровня (обычно это хорошо ложится на шаги теста).

Основные элементы Playwright

  • Page – предоставляет метод для взаимодействия со страницей браузера.
  • Locator – объект для поиска элемента на странице. Вычисляется в момент обращения к элементу (click(), isVisible() и т.п.).

Структура проекта

Т.к. страницы могут содержать большое количество элементов, для большей читабельности вводится понятие Component Object – элемент страницы. Component Object на Page Object описывается с помощью аннотации @Component и инициализируется автоматически с помощью ComponentFactory наравне с полями, помеченными аннотацией @FindBy.

ComponentFactory

ComponentFactory – фабрика для создания Page Object. Принимает на вход Page (объект Playwright) и класс PageObject, который нужно создать. С помощью reflection обходит аннотации @FindBy и @Component.

Локаторы @FindBy

Локатор @FindBy используется для задания условия поиска элемента на странице. В момент создания страницы элемент может отсутствовать на странице, поиск производится в момент обращения к Location.

Есть 4 условия поиска, при этом если задано одно условие, то другие не выполняются (кроме byRole и byText – они могут идти вместе). Условия поиска перечислены в порядке приоритета:

  • byTestId – поиск по data-testid;
  • byCss – поиск по CSS селектор;
  • byRole – поиск по атрибуту role;
  • byXpath – поиск XPath;
  • byText – поиск по тексту (может применяться совместно с фильтром byRole);
  • parent – используется, если нужно выделить поддерево, в рамках которого выполнять дальнейший поиск элементов (ParentbyCss, byTestId, byXpath, byRole).

Соглашения о разработке

Структура пакетов теста

  • pages и components – классы, описывающие Page Object и_Component Object_.
  • components – компоненты внутри страницы.
  • tests – тесты, внутри нужно делить по функциональности.
  • utils – утильные инструменты, константы и т.п.