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

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

xpath
locators
selenium
webdriver
Теги: #<Tag:0x00007f7b656c58f8> #<Tag:0x00007f7b656c57b8> #<Tag:0x00007f7b656c5678> #<Tag:0x00007f7b656c5510>

(Алексей Смиян) #1

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

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

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


(Виталий Коряков) #2
path = '//a[contains(text(), переменная)]'
xpath = path.replace('переменная', new_value)

или так

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

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


(Ярослав Бойко) #3

Можна так))

WebDriverWait(driver, 30).until(
        EC.element_to_be_clickable((By.XPATH, '//*[text()="{0} {1}"]'.format(variable1, variable2))))

(Lev Yarushin) #4

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


(Алексей Смиян) #5

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

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

(Lev Yarushin) #6

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


(Алексей Смиян) #7

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

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

(Алексей Смиян) #8

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


(Bohdan Harasym) #9

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


(Алексей Смиян) #10

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

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

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

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


(Oleg Kuzovkov) #11

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

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


(Sergey Korol) #12

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


(Алексей Смиян) #13

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


(Sergey Korol) #14

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


(Ярослав Бойко) #15

Prozorro?


(Алексей Смиян) #16

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


(James Howlett) #17

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