Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как вставить имя переменной в локатор ??

selenium
webdriver
Теги: #<Tag:0x00007f7b61e1ed88> #<Tag:0x00007f7b61e1e9c8>

(stek) #1

Здравствуйте подскажите пожалуйста.

Есть файл properties, в нем локатор type = //li[contains(text(),’%s’)]`

Создаю метод

 public void selectValue(String value) {

        String listValue = format(value, $(objMap.locator("type")));
        $(By.xpath(listValue)).click();
    }

Как мне правильно, передавать value в локатор?


(Dmitry Klymenchuk) #2

String.format($(objMap.locator(“type”)), value)


(stek) #3

cannot resolve method format


(Vatslau) #4
 String listValue = String.format("//li[contains(text(),'%s')]", value);

(stek) #5

Да, про это я вкурсе. Мне нужно локатор вытащить из properties и впихнуть переменную в него


(Дмитрий Еремин) #6

Пример чтения из пропертей гуглится легко
https://www.mkyong.com/java/java-properties-file-examples/ - вот тут второй пример про вас, если у вас без сложностей

Когда разберетесь, попробуйте лучше прикрутить к проекту http://owner.aeonbits.org/
Он удобнее
http://owner.aeonbits.org/docs/usage/


(stek) #7

Да мне не нужно чтения из проперти. Я знаю как это делать. Мне нужно переменную запихнуть в локатор, который тянется из проперти


(Alexandr D.) #8

Рефлексия в помощь.


(Vatslau) #9

Простите за глупый вопрос - зачем локаторы хранить в пропертях?
Хотите внешний файл для редакторов?


(stek) #10

Ну смотрите, например если я использую этот локатор в 10ти тестах, то проще потом поменять его один раз в пропертях, чем в каждом тесте.


(Alexandr D.) #11

Page Object Pattern решает эту проблему.

Ну или хотя бы какой-нибудь статичный класс с локаторами.

Хранить их в проперти нет смысла.


(stek) #12

А если например использую для интеграции Jenkins, я могу просто в интерфейсе зайти в файлик проперти и изменить локатор, не влезая в код
Кстати, рефлексию вашу, никак не могу понять как применить в данной ситуации


(Alexandr D.) #13

Вот эта экономия “могу изменить проперти, не меняя код” - это конечно хорошо, когда относится к каким-то масштабным проектам, которые собираются по 20 минут, потом деплоятся ещё 20 минут (образно).

А ваш проект с тестами собирается настолько ничтожно малое количество времени, что намного проще это делать в коде, имхо, чем городить лишнюю логику, к тому же ваш файл проперти сможет кто угодно менять без PR и истории.

Я уже забыл, что именно вы хотите. А перечитав не очень понял.
Можете более детально написать, что же вы всё-таки хотите, и зачем вам в данном контексте вообще какие-то переменные?


(Dmitry Klymenchuk) #14

А если например использую для интеграции Jenkins, я могу просто в интерфейсе зайти в файлик проперти и изменить локатор, не влезая в код

Зайди в git, поменяй локатор и выйдет по времени одно и то же =)


(stek) #15

Смотрите, есть drop down , в нем список значений.
Мне нужно выбрать некоторые из этих значений и кликнуть в разных тестах. Раньше, у меня было 6 разных локаторов, и я писал к примеру //li[contains(text(),’films’)] и далле click . Решил , что лучше создать один метод и юзать только один локатор (заменить, название films на строку %s). Дальше вызываю этот метод, и просто пишу значение которое мне нужно в данный момент.

Если в методе написать так: String listValue = String.format("//li[contains(text(),'%s')]", value);, то все отлично, а я хочу локатор свой вытянуть с помощью objectMap:

 public void selectValue(String value) {

        String listValue = format(value, $(objMap.locator("type")));
        $(By.xpath(listValue)).click();
    }

Сам локатор у меня в пропертях: type = //li[contains(text(),’ %s ’)]


(stek) #16

Не понимаю, в чем плохие проперти? Как по мне, очень даже удобно. Любой пользователь не разбираясь в тестах, может изменить локатор в случае необходимости.


(Dmitry Klymenchuk) #17


Тот кто не шарит в автотестах, не будет менять локаторы - это ваша фантазия =)


(Vatslau) #18

утопия

единственный кейс если у вас есть специально обученный человек который пишет только локаторы за копейки и он гуру хpath

Даже вынос тестовых данных резко ухудшает связи
т.к. нельзя тыкнуть на метод и увидеть переменную
а вы хотите и локаторы загнать туда

для переменных чтобы быстро код писать лучше для простых случаев
подходят хпас хелперы статические

  public static String nodeContainsClass(String className) {
    return String.format("//*[contains(@class, '%s')]", className);
  }

и то не у добно дебажить если закралась ошибка


(stek) #19

Ну смотрите, если к примеру есть локатор, который используется в разных тестах (например 10 раз). Если вдруг dev хочет изменить?Придется править в 10 местах данный локатор, вместо того, чтобы зайти в проперти и измененить 1 локатор.

тут то согласен, сначала надо зайти в метод, а затем с метода в локатор


(Alexandr D.) #20

Для этого есть Page Object, который как раз хранит локатор в одном месте. Так же как методы, которые вы просто используете в тестах.
Вы придумываете велосипед.