Как построить выражение xpath с переменной для Selenium в python, используя% s - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь использовать селен, чтобы найти и выбрать определенный элемент на основе переменной, переданной в функцию при его вызове.Я думал, что это будет достаточно просто с хорошим старым:

show = browser.find_element_by_xpath("//*[contains(text(), '%s')]" % eventName)

Тем не менее, я получаю сообщение об ошибке:

selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: Unable to locate an element with the xpath expression //*[contains(text(), 'VARIABLE_TEXT')] because of the following error:
SyntaxError: Failed to execute 'evaluate' on 'Document': The string '//*[contains(text(), 'VARIABLE_TEXT')]' is not a valid XPath expression.

Вот здесь - перегнано и упрощено - часть HTMLЯ пытаюсь выбрать:

<ul>
<li class="seriesElement">
<input id="productionId_0" name="productionIds" type="checkbox" value="VALUE"><input type="hidden" name="_productionIds" value="on"><label for="productionId_0" class="prodColor0">TEXT</label>
</li>
<li class="seriesElement">
<input id="productionId_1" name="productionIds" type="checkbox" value="VALUE"><input type="hidden" name="_productionIds" value="on"><label for="productionId_1" class="prodColor1">TEXT</label>
</li>
</ul>

Есть много из этих элементов списка, и я хочу выбрать один по тексту.Я только что использовал неправильный синтаксис для своего выражения xpath, или это совершенно другой зверь?

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Чтобы найти определенный элемент на основе его переменного текста, вы можете написать метод следующим образом:

  • Использование .:

    def find_myelement_with_text(myString):
        show = browser.find_element_by_xpath("//label[.='" + myString + "']")
    
  • Использование %s:

    def find_myelement_with_text(myString):
        show = browser.find_element_by_xpath("//label[contains(text(), '%s')]" % (myString))
    
  • Использование format():

    def find_myelement_with_text(myString):
        show = browser.find_element_by_xpath('//label[contains(text(), "{}")]'.format(myString))
    

Теперь вы можете вызывать этот метод из любой точки вашей программы следующим образом:

find_myelement_with_text("TEXT")
0 голосов
/ 15 февраля 2019

Старый добрый %s сработал как положено - вы можете увидеть подстановку в сообщении об ошибке, проблема в самом xpath.
Если вы запускаете его через автономный парсер (не тот, что в браузере)вы увидите виновника ошибки:

Невозможно выполнить операцию XPath.Последовательность из более чем одного элемента недопустима в качестве первого аргумента функции contains () ("", "", ...)

(это Java, текст будетбыть похожим для других)

Короче говоря, это беспокоит вывод text() - это набор узлов;если вы измените эту функцию на ., она должна работать:

show = browser.find_element_by_xpath("//*[contains(., '%s')]" % eventName)
0 голосов
/ 15 февраля 2019

Вы можете попробовать этот способ. См., Если это помогает.

VAR_TEXT="TEXT"
print(driver.find_element_by_xpath("//label[contains(text() ,'" + VAR_TEXT + "')]").text)

ИЛИ

VAR_TEXT="TEXT"
print(driver.find_element_by_xpath("//*[contains(text() ,'" + VAR_TEXT + "')]").text)

ИЛИ

VAR_TEXT="TEXT"
print(driver.find_element_by_xpath("//label[text()[contains(.,'" + VAR_TEXT + "')]]").text)

ИЛИ

VAR_TEXT="TEXT"
print(driver.find_element_by_xpath("//*[text()[contains(.,'" + VAR_TEXT + "')]]").text)
...