Page Object

R5AM, Александр Ящук, Москва, 2018г.
На главную


Пока в разработке!

Page Object
Для разделения кода тестов и кода нахождения и управления элементами на странице. Один класс описывает одну страницу. Классы Page Object имеют осмысленные имена. Скрывается логика взаимодействия со страницей и вывода наружу удобного интерфейса с логичным названием (например "создать_заметку" или "удалить_заметку, а не "driver.что-то-find.click"). Одни страницы можно наследовать от других, если есть что-то общее - от базовой страницы, например, страницу логина, страницу справочника и т.п. В хороших Page Object-ах взаимодействие с элементами происходит внутри, через методы, наружу элементы не выдаются. Все элементы на странице будут полями класса или полями созданного объекта, которые хранятся внутри класса. Не нужно делать вызов одного PageObject-а из другого - если есть действия, которые растягиваются по многим страницам, то лучше делать новую абстракцию над PageObject-ом. У PageObject-ов три типа реализации: Static, Void и Fluent.

Page Fragments (Page Elements или Page Blocks)
Приложение состоит из набора компонентов, независимых, динамично подгружаемых - тоже повторять сущности из кода в автотестах, в классах делать методы про то, что эти сущности могут делать. Можно ещё глубже - запихивать в один фрагмент ещё фрагменты, главное не переборщить с микрофрагментацией. Страница собирается из множества фрагментов - даёт хорошее переиспользование кода. Поиски элементов будут происходить не по всей странице, а только внутри фрагмента Можно создавать кастомные коллекции (списки в Python) однотипных фрагментов, например для результатов поиска или каталога товаров. В эти коллекции можно добавлять свои методы, например выбор объектов с определёнными свойствами. На Питоне есть какие-то специальные библиотеки для таких вещей. PageFragment-ы удобно наследовать от WebElement - будут иметь все его методы, будет являться валидным WebElement-ом (можно вызывать is_displayed() и т.п, можно переопределять методы от WebElement-а).
Получаемые выгоды
Переиспользование компонентов между разными страницами, PageObject становится по сути хранилищем фрагментов со всей логикой. Можно не собирать всю страницу полностью, а использовать только фрагменты, которые используются в данном тесте. Уменьшается дублирование кода. Получается больше стабильности при изменении локаторов, так как поиск происходит не на всей странице, а внутри фрагментов и изменения во внешних частях не влияют. Чище код, читабельнее, он более осознан при хорошем наименовании фрагментов. Уменьшаются издержки на поддержку изменений.
Сложности
Нужно очень чётко ориентироваться в ООП принципах. Получается больше кода. На маленьких проектов может не иметь смысла разбивать на фрагменты. Это дополнительные слои абстракции.
Антипаттерны
Типизированные элементы - Button, Link, Image, Checkbox. Нет нужды в тотальной типизации - сейчас кнопка может быть и линком, и инпутом, и т.п. Один элемент может быть сразу и картинкой, и кнопкой. В тестах на этапе компиляции эта типизция ничего не даёт - всё равно ошибки будут только после запуска тестов, в рантайме. Есть исключения: классы для Uploads, Select/Dropdawn, Tables.
Принципы S.O.L.I.D. лучше не использовать, для тестов это зло. Код в тестах выполняется всегда, в отличие от обычных программ - поэтому при рефакторинге все кривые изменения и разницы в копипастных частях сразу всплывают.
Не нужно разделять локаторы и методы в разные файлы.
Не нужно выносить константы в properties файлы.




На главную
К началу страницы