Как извлечь текст из элементов webdriver, найденных через xpath, используя Selenium и Python - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть рабочий код:

options_elements = issn_dropdown.find_elements_by_xpath("//ul[contains(@id,'my_id')]//li")
options = [x.text for x in options_elements]

options_elemets - это массив 5 selenium.webdriver.remote.webelement.WebElement, каждый из которых содержит text. Результат option именно то, что мне нужно. Почему я не могу изменить его на:

options = issn_dropdown.find_elements_by_xpath("//ul[contains(@id,'my_id')]//li/text()")

? В этой строке тест просто не проходит, и никакой конкретной ошибки не отображается.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

text() в xpath возвращает текстовый узел, Selenium не поддерживает его. Ваш первый блок кода - это путь к go.

0 голосов
/ 03 февраля 2020

Вы видели это правильно. find_elements_by_xpath("//ul[contains(@id,'my_id')]//li/text()") просто потерпит неудачу при использовании Selenium .

Мы обсудили эту функцию в следующих обсуждениях

Спецификация WebDriver напрямую относится к:

, и ни один из них не препятствует ссылке WebElement быть текстовым узлом.


Таким образом, нижняя строка была, поскольку в спецификации не указано API локального конца. Клиентские привязки могут свободно выбирать API idiomati c, который имеет смысл для их языка. Здесь описан только протокол удаленного провода.

@ Саймон Стюарт заключен:

Один из вариантов может заключаться в сериализации узла Text, найденного путем выполнения javascript обрабатываться так, как если бы это был элементный элемент (то есть назначить ему идентификатор и ссылаться на него, используя это). Если пользователь попытается взаимодействовать с ним способом, который не имеет смысла (например, отправка ввода с клавиатуры), тогда может быть возвращена ошибка.

Следовательно, ваш первый вариант - это способ go:

options_elements = issn_dropdown.find_elements_by_xpath("//ul[contains(@id,'my_id')]//li")
options = [x.text for x in options_elements]
...