Реализация паттерна Page Object для Playwright
Подключение
Maven
<dependency>
<groupId>ru.romanow-alex</groupId>
<artifactId>playwright-page-object</artifactId>
<version>${playwright-page-object.version}</version>
</dependency>
Gradle
testImplementation "ru.romanow-alex: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 – утильные инструменты, константы и т.п.