(данный текст написан скорее для себя, чем для кого то, но если он окажется Вам полезным, то похлопайте в ладоши :) )
Столкнулся со следующей ситуацией.
Есть 3 сайта с очень похожим функционалом. Можно сказать что "почти" одинаковые. Работают на одной платформе, но нацеленные на разные сегменты рынка.
Похожая ситуация может быть с мультиязычными сайтами. Иногда даже дизайн для разных стран может немного отличаться.
Нужно автоматизировать некоторые регрессионные тесты.
Когда мы используем PageObject pattern, мы описываем структуру страницы, привязываясь к элементам страницы с помощью селекторов.
Но штука в том, что в моем случае для разных сайтов селекторы могут различаться.
Я использую page-object gem (Ruby) для реализации паттерна PageObject. В нем привязка выполняется на этапе создания класса, когда вызываются методы класса, создающие методы экземпляра класса, с помощью которых я могу потом взаимодействовать с элементами страницы
Таким образом мы приходим к тому, что нужно создавать 3 отдельных класса для каждой страницы. Например: SiteOneHomePage, SiteTwoHomePage, SiteThreeHomePage.
В этих классах будет (как мне кажется на данный момент) одинаковый функционал и будут различаться только селекторы.
Создавать 3 почти одинаковых класса не хочется.
Нужно найти варианты, когда не будет дублирования кода класса страницы.
Пока писал этот текст, пришел в голову вариант, когда функционал страницы описывается в модули, а потом подмешивается в класс страницы. Не знаю, как это будет выглядеть на практике, но надо попробовать.
Другой вариант, который подходит не только для Руби -- это абстрактный класс HomePage, в котором описан функционал, и классы-наследники SiteOneHomePage, SiteTwoHomePage и т.д., где описываются селекторы.
Но мне все еще это не совсем нравится.
Я использую cucumber поверх page-object для создания красивых отчетов для клиентов.
Если применить сказанное выше, то мы получим нечто следующее:
Feature: change currency (SiteOne, SiteTwo, SiteThree)
Scenario Outline: Check currency changing on SiteOne site
Given I open "HomeSiteOne" page on "SiteOne" site
When I change currency to "<selected_currency>"
Then Current currency should be "<expected_currency>"
Examples:
| selected_currency | expected_currency |
| USD | USD |
| EUR | EUR |
| AUD | AUD |
| CAD | CAD |
Scenario Outline: Check currency changing on SiteTwo site
Given I open "HomeSiteTwo" page on "SiteTwo" site
When I change currency to "<selected_currency>"
Then Current currency should be "<expected_currency>"
Examples:
| selected_currency | expected_currency |
| USD | USD |
| EUR | EUR |
| AUD | AUD |
| CAD | CAD |
Получается тавтология.
Я бы хотел, чтобы название сайта не фигурировало в названии страницы.