Задать вопрос
@bitande
PHP

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

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

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

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

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

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


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

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

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

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

Похожие вопросы