Добрый день.
Есть необходимость использовать в Xpath имя переменной.
Например:
//a[contains(text(), переменная)]
Посоветуйте, каким образом это можно сделать.
Добрый день.
Есть необходимость использовать в 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))))
А какой язык программирования используете? 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+”)]”)) - это будет работать. Но задекларировать этот элемент через аннотацию у Вас не получиться
Динамические локаторы на уровне аннотаций реализовать можно, но не при помощи стандартных селениумовских конструкций, т.к. управление полностью делегировано фабрике. Так что в самом простом случае придется формировать элемент прямо в методе.
Да, в итоге я именно так и сделал. А когда пытался вставить переменную в xpath из @Findbay, то среда разработки ругалась и просила константу.
Ну касательно констант в аннотациях, вам уже выше об этом написали. Это ограничение самого языка. С другой стороны, никто не мешает использовать плейсхолдеры в строках для последующей замены по требованию. Но для этого необходим полный контроль над процессом инициализации полей, чего вас лишают при использовании фабрики.
Prozorro?
Да. Один из участников системы.
String text = “переменная”;
findElement(By.xpath(String.format("//*[text()=’%s’]", text)));