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

Добрый день.
Есть необходимость использовать в 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 лайк