Реализация паттерна 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
– используется, если нужно выделить поддерево, в рамках которого выполнять дальнейший поиск элементов (Parent
–byCss
,byTestId
,byXpath
,byRole
).
Соглашения о разработке
Структура пакетов теста
- pages и components – классы, описывающие Page Object и_Component Object_.
- components – компоненты внутри страницы.
- tests – тесты, внутри нужно делить по функциональности.
- utils – утильные инструменты, константы и т.п.