Усовершенствованный паттерн Page Object и Selenium Webdriver

Усовершенствованный паттерн Page Object и Selenium Webdriver

Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

Добрый день. Недавно мы рассмотрели использование паттерна Page Object и селениум, но решил пойти немного далее, так как предыдущая версия не совсем удачная, – в ней много повторяемостей в коде. Это приводит к нарушению принципов SOLID. Таким образом, нашей целью будет создание такого ООП проекта, который будет лимитировать переиспользование кода.

Начну с основного класса Driver, в котором будут объявлятся свойства для будущей инициализации браузера, ожидания, а также методы запуска и закрытия браузера (разрушения вебдрайвера).

Список браузеров задается в перечислении:

Давайте обратимся к предыдущей версии кода:

Что здесь не так?.. Основная проблема – это то, что для каждой страницы (класса) нам приходится передавать в конструктор текущий объект вебдрайвера. Мы можем сделать некоторый рефакторинг и создать класс BasePageElementMap, от которого будут наследоваться все остальные классы инициализации элементов.

Теперь наш обновленный класс BingMainPageElementMap будет иметь вид:

Таким образом, мы вынесли повторяющийся конструктор в базовый класс.

Следующим шагом будет создание базового класса для валидации.

Предыдущий класс имел следующий вид:

Здесь мы можем переместить свойство Map и конструктор в отдельный базовый класс.

С помощью этого Generic класса у нас есть доступ к классу определения элементов.

Финальный шаг в процессе рефакторинга паттерна Page Object – это создание базового класса для вышеупомянутых классов. Раньше он имел вид:

Здесь есть несколько элементов, которые также можно вынести в отдельный класс: конструктор, методы Navigate, Validate и свойство Map. Для этого нужно прибегнуть к созданию двух дополнительных классов:

Таким образом, имея эти два класса с параметрами и конструкторы, мы можем использовать их для любого класса страниц.

Теперь класс BingMainPage состоит только с одного конструктора и метода Search, весь код бизнес-логики спрятан в базовых классах.

Ну, и сам тестовый класс, который остается практически без изменения:

Окончательный проект в солюшене должен выглядеть так:

pom-2

Связанные статьи