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

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

Теги: #<Tag:0x00007f7487749638> #<Tag:0x00007f74877494d0> #<Tag:0x00007f74877493e0> #<Tag:0x00007f74877492c8>

Добрый день.
Есть необходимость использовать в Xpath имя переменной.
Например:

//a[contains(text(), переменная)]

Посоветуйте, каким образом это можно сделать.

path = '//a[contains(text(), переменная)]'
xpath = path.replace('переменная', new_value)

или так

find_element_by_xpath('//*[contains(text(), "%s")]' % text)

смотря что конкретно надо.

Можна так))

WebDriverWait(driver, 30).until(
        EC.element_to_be_clickable((By.XPATH, '//*[text()="{0} {1}"]'.format(variable1, variable2))))
1 Симпатия

А какой язык программирования используете? Java?

Да, Java.
Нашел такой вариант. Хотя мне он напоминает Robot Framework:

//div[contains(text(), '${имя переменной}')]

Тогда вам верно выше написали 2 способа интерполяции в Java
Ваш вариант из Groovy, если мне не изменяет память.

У меня такая реализация. И пока никак не получается:

@FindBy(how = How.XPATH, using = "//a[contains(text(), имя переменной)]")

Пока ни один из вариантов не работает. Intellij Idea ругается.

Что мешает создать переменную типа string, которая будет составляться с двух частей, а потом её передать как локатор

Сейчас пробую такой вариант:

 WebElement selectLot1forOffer=driver.findElement(By.xpath("//a[contains(text(), "+lotN1+")]"));

По крайней мере среда на него не ругается.
Не могу понять, почему через @FindBy так не разрешает.

Переменную приняло. Забыл правда кавычки по бокам добавить.

@FindBy - это аннотация. В аннотацию НЕЛЬЗЯ передавать никакие переменный (кроме констант).

driver.findElement(By.xpath("//a[contains(text(), “+lotN1+”)]")) - это будет работать. Но задекларировать этот элемент через аннотацию у Вас не получиться :frowning:

2 Симпатий

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

1 Симпатия

Да, в итоге я именно так и сделал. А когда пытался вставить переменную в xpath из @Findbay, то среда разработки ругалась и просила константу.

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

1 Симпатия

Prozorro?

Да. Один из участников системы.

1 Симпатия

String text = “переменная”;
findElement(By.xpath(String.format("//*[text()=’%s’]", text)));

1 Симпатия