Использование разных наборов объектов страницы с одинаковыми тестами селена
[Это перекрестная публикация с SQA - https://sqa.stackexchange.com/questions/35081/using-different-sets-of-page-objects-with-the-same-selenium-tests]
Я работаю над набором тестов селена для набора похожих сайтов. Набор тестов будет выполняться отдельно для каждого сайта, и тесты в наборе применимы ко всем веб-сайтам.
Эти веб-сайты построены на одной базовой платформе, однако имеют разные темы / схемы, и поэтому объекты страниц для этих сайтов должны быть разными. Это не тот случай, когда один или два селектора различны, но большинство селекторов различны, но остальная структура одинакова.
Я могу легко создать два (или три, или что угодно) набора объектов страницы, однако я не могу понять, как сказать исполнителю теста (в моем случае Cucumber cli), какие объекты страницы использовать.
Самое близкое, что я могу придумать, - это использовать разные имена пакетов с общими базовыми классами, а затем отдельные страницы, выходящие из общих базовых классов. Другой возможностью является извлечение всех селекторов в файлы свойств и загрузка того или иного на основе входного параметра, однако это помешает мне использовать PageFactory. Я также, возможно, могу создавать отдельные наборы объектов страниц в разных исходных наборах, а затем компилировать один или другой в зависимости от моих потребностей - но, опять же, я могу думать о теории, но не о ее выполнении.
Итак, каков правильный подход и как этого добиться? Если это имеет значение, проект построен с использованием gradle.
2 ответа
Поскольку тесты подходят для всех сайтов, я предполагаю, что единственная разница между страницами заключается в селекторах за объектами.
cssSelector
а также xpath
обеспечивает or
, Предполагая, что текстовое поле имеет идентификатор id1
, id2
или же id3
зависит от страницы, которую вы можете использовать
@FindBy(how = How.CSS, using = "#id1, #id2, #id3")
private WebElement textField;
Это вернет WebElement
соответствует одному из идентификаторов.
Решением стало использование пользовательских ElementLocator и ElementLocatorFactory с соответствующей пользовательской аннотацией. Это немного больше работы, но это очень четкое решение. Я опубликовал это на github. Короче говоря, реализация позволяет сделать это:
public class MyPage {
@SearchWith(page="MyPage", name="myElement", locatorsFile="{locators}")
WebElement someElement
...
}
Затем запустите весь тест с -Dlocators=site1.json
или же -Dlocators=site2.json
- и соответствующие локаторы будут загружены с одного или другого. Это даже позволяет указать -Dlocators=[site3.json]
и загрузить локаторы из site3.json
ресурс (как получено с использованием this.getClass().getResourceAsStream(locatorsFile)
)