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

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

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

Создаю метод

 public void selectValue(String value) {

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

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

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

cannot resolve method format

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

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

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

Когда разберетесь, попробуйте лучше прикрутить к проекту http://owner.aeonbits.org/
Он удобнее
Best Essay Writing Services 2023 | ChromaTopia.org

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

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

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

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

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

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

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

1 лайк

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

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

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

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

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

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

Смотрите, есть 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 ’)]

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

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

утопия

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

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

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

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

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

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

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

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

1 лайк