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

webdriver
locators
page-object
selenium
selenide
java
Теги: #<Tag:0x00007f3d445a7778> #<Tag:0x00007f3d445a7638> #<Tag:0x00007f3d445a74d0> #<Tag:0x00007f3d445a7318> #<Tag:0x00007f3d445a7188> #<Tag:0x00007f3d445a7048>

(Sergey Brit) #1

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


(Viktor Yakushenko) #2

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


(Taras) #3

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


(Дмитрий Мирошник) #4

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

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


(Yaroslav Pernerovskyy) #5

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


(Дмитрий Мирошник) #6

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


(Yaroslav Pernerovskyy) #7

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


(Sergey Brit) #8

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


(Евгений Салмин) #9

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


(Sergey Brit) #10

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


(Sergey Brit) #11

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


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


(Oleksandr Khotemskyi) #12

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

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


(Sergey Brit) #13

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


(Oleksandr Khotemskyi) #14

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

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