Ошибка TypeError: Не удалось выполнить «оценить» в «Документе»: результат не является набором узлов и, следовательно, не может быть преобразован с использованием Xpath через Selenium - PullRequest
0 голосов
/ 13 марта 2019

Часть страницы источника:

<span style="display:block; overflow:hidden; white-space: nowrap">Gi2/0/20</span>

Части кода:

from selenium import webdriver
...
driver = webdriver.Chrome()
...
IP_CLICK = browser.find_element_by_xpath('//span[@style="display:block; overflow:hidden; white-space: nowrap"]/text()="Gi2/0/20"').click()

Я пытаюсь выбрать элемент на моей веб-странице с выражением xpath, ноЯ получаю следующую ошибку:

InvalidSelectorException: invalid selector: Unable to locate an element with the xpath expression //span[@style="display:block; overflow:hidden; white-space: nowrap"]/text()="Gi2/0/20" because of the following error:

TypeError: Не удалось выполнить «оценку» для «Документа»: результат не является набором узлов и поэтому не может быть преобразован в нужный тип,(Информация о сеансе: chrome = 72.0.3626.121) (Информация о драйвере: chromedriver = 73.0.3683.20 (8e2b610813e167eee3619ac4ce6e42e3ec622017), платформа = Windows NT 6.1.7601 SP1 x86_64)

Ответы [ 4 ]

0 голосов
/ 13 марта 2019

Это сообщение об ошибке ...

TypeError: Failed to execute 'evaluate' on 'Document': The result is not a node set, and therefore cannot be converted to the desired type. 
 (Session info: chrome=72.0.3626.121) (Driver info: chromedriver=73.0.3683.20 (8e2b610813e167eee3619ac4ce6e42e3ec622017),platform=Windows NT 6.1.7601 SP1 x86_64)

... означает, что результатом выполнения выражения xpath не был установлен узел.

Синтаксически,выражение xpath , которое вы использовали, является выражением legal xpath , которое использует узел text(), как в parent_element/text()="Gi2/0/20" после xpath v3.0 .

К сожалению Selenium реализует xpath v1.0 , который не поддерживает text() узлов.

Кроме того, click() не возвращаетничего, поэтому IP_CLICK не требуется.

Решение

К click() на элементе, вы можете использовать любое из следующих решений:

  • Xpath 1 :

    browser.find_element_by_xpath("//span[text()='Gi2/0/20']").click()
    
  • Xpath 2 :

    browser.find_element_by_xpath("//span[contains(., 'Gi2/0/20')]").click()
    
0 голосов
/ 13 марта 2019

Вы используете недопустимое выражение xpath, используйте приведенный ниже измененный xpath:

IP_CLICK = browser.find_element_by_xpath("//span[text()='Gi2/0/20']");
IP_CLICK.click();

Если есть несколько совпадений, используйте индексацию, я имею в виду передачу соответствующего номера индекса в указанном ниже xpath:

xpath = "(//span[text()='Gi2/0/20'])[Matching index number goes here]";
IP_CLICK = browser.find_element_by_xpath(xpath);
IP_CLICK.click();
0 голосов
/ 13 марта 2019

Проблема в том, что вы не можете использовать текстовый узел в селене, чтобы найти элемент, например, //span/text()

. Вы должны найти альтернативу, чтобы найти элемент, подобный этому

//span[contains(.,'matching_text')]

ИЛИ

//span[text()='exact _text')]

Существует альтернатива для определения местоположения элемента с использованием текста, а не javascriptexecutor

Вот пример кода Java

JavascriptExecutor js = (JavascriptExecutor)driver;
Object message = js.executeScript("var value = document.evaluate(\"//p[@class='artdeco-toast-message']/node()[not(self::button)]\",document, null, XPathResult.STRING_TYPE, null ); return value.stringValue;");
System.out.println(message.toString().trim());

См. this ссылка для более

0 голосов
/ 13 марта 2019

Ваш xpath должен быть:

//span[@style="display:block; overflow:hidden; white-space: nowrap" and text()="Gi2/0/20"]

Будет искать элемент span, соответствующий значениям @style и text().

...