t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как хранить локаторы для нескольких окружений

Теги: #<Tag:0x00007f7489d04d00> #<Tag:0x00007f7489d04c10> #<Tag:0x00007f7489d04a80> #<Tag:0x00007f7489d04990> #<Tag:0x00007f7489d048a0> #<Tag:0x00007f7489d04760>

Доброго времени суток.
А вот хотел бы спросить экспертов.
Например у меня есть 2 приложения: вэб и десктоп
Структура и поведение идентичны.
Есть уже готовые тесты для web. Работают нормально. Содержат пейдж обжекты с локаторами.
Хотелось бы это же запускать и для десктопа.
Вопрос как быть с локаторами?
Действия одни и теже, но локаторы в десктопе и вэбе разные.
Как быть тогда?

Можно попробовать для каждого типа приложения, хранить в двух разных классах (для каждого page object), реализующих один интерфейс. В зависимости от приложения инициализировать нужные локаторы.

я б просто анотации на них разние ставил и в коде хендлил

ИМХО самый простой вариант - иметь 2 property файла с локаторами. Имена локаторов (пропертей) должны 100% совпадать, значения - различаться.
Затем добавляем параметр на запуск теста, определяющий тип приложения. В зависимости от этого параметра где-нибудь на BeforeTest или любой другой фазе инициализации по выбору подставлять соответствующий property файл. Профит.

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

Зачем 2? можно в одной XMLке хранить

Если локаторов много - в 1 xml можно будет потеряться.

Потому хранить локаторы в файлах это плохая идея вообще. )

1 Симпатия

Пока решил использовать вариант при котором прописываю 2 локатора в одном.
Например, есть элемент с именем Element. Для вэб это будет //[@name=‘Element’] для десктопа - //[@Name=‘Element’]. Объединяем все:
By.xpath(//[@name=‘Element’] | //[@Name=‘Element’]) и получаем вполне нормальный вариант как для вэб так и для десктопа. Также можно использовать нотацию @FindAll. В коде выглядет неплохо.
Всем спасибо.

2 Симпатий

Необычный подход

Зато работает. :slight_smile:

Для FindAll это будет виглядеть как:


@FindBy(
@FindBy(xpath="//[@name=‘Element’]"),
@FindBy(xpath="//
[@Name=‘Element’]")
)
public SelenideElement element;

1 Симпатия

А почему бы собственно и нет?

Единственное что смущает - не решает проблему разной структуры страниц для десктопа и мобайла

В моем случае действия над страницей и сама структура одинакова как для вэба так и для десктопа

Дай бог так и будет дальше. Но почему то ощущение что потом обязательно будет -

НА ДЕСКТОПЕ ДРОПДАУН А НА МОБАЙЛЕ СДЕЛАЕМ ГАМБУРГЕР СЛАЙДМЕНЮ

5 Симпатий