@bitande
PHP

Как правильно использовать инкапсуляцию в Page Object паттерне?

Подскажите как правильно использовать инкапсуляцию в Page Object паттерне.

Читал что клиенту должны быть доступны только методы из PageObject, например login, addToCart и т.д, и в тестах лучше не использовать методы selenium, например driver.click().

Но часто в тестах нужен доступ к элементам страницы, нужно просто на них кликнуть например или проверить видимость.

Если скрывать все элементы страницы в PageObject инкапсуляция доходит до абсурда, и придется писать геттеры под каждый элемент или методы вроде addToCartButtonClick().

Вроде бы правильно скрывать элементы внутри PageObject и использовать только методы, но на практике это очень неудобно. Как сделать правильно?
  • Вопрос задан
  • 499 просмотров
Решения вопроса 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
инкапсуляция доходит до абсурда, и придется писать геттеры под каждый элемент или методы вроде addToCartButtonClick().


Поддерживать ООП с SOLID и прочими DRY - это вообще не особо удобно, а что поделать?)

Другое дело, что вместо addToCartButtonClick должен быть метод addProductToChart, где PageObject уже решит, что ему нужно: кнопку нажать, ползунок потянуть и т.п., тогда это можно будет назвать инкапсуляцией и пропадёт абсурдность.

Если вам не нужны геттеры под каждый элемент, то делайте их private. Очевидно, что хороший ООП-код старается в классе как можно больше скрыть, сделать статическим и константным, а пользователю выставить лишь необходимое и достаточное для решения его задач
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@mipan
PageObject подразумевает работу с элементами страницы в тесте без вызова вебрайвера напрямую.
Ответ написан
Комментировать
lxsmkv
@lxsmkv
Test automation engineer
Если интерфейс контроллера предназначен для простых смертных, лучше писать функции общего плана с параметрами. Так вы сведете к минимуму возможность ошибочного использования. Например чтобы выбрать предмет из списка его нужно сперва раскрыть раскрывание будет производиться внутри общей функции напр. selectItemFromListMatchingName(String n) путем вызова приватной функции openItemList() а она будет использовать приватную функцию isListOpen() чтобы не открывать уже открытый список. Править такие тесты очень легко. Вы чините код в одной маленькой функции один раз. И все тесты которые опираются на нее чинятся автоматически.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
25 апр. 2024, в 15:51
3000 руб./за проект
25 апр. 2024, в 15:31
70000 руб./за проект
25 апр. 2024, в 15:26
15000 руб./за проект