Ошибка типа: не удалось выполнить ‘evaluate’ для ‘Document’: Результат не является набором узлов и, следовательно, не может быть преобразован с использованием Xpath через Selenium

#python #selenium #selenium-webdriver #xpath #xpath-1.0

#python #selenium #selenium-webdriver #xpath #xpath-1.0

Вопрос:

Частью исходного кода страницы:

 <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:
  

Ошибка типа: не удалось выполнить ‘evaluate’ для ‘Document’: Результат не является набором узлов и, следовательно, не может быть преобразован в желаемый тип.
(Информация о сеансе: chrome = 72.0.3626.121)
(Информация о драйвере: chromedriver = 73.0.3683.20 (8e2b610813e167eee3619ac4ce6e42e3ec622017), платформа = Windows NT 6.1.7601 SP1 x86_64)

Комментарии:

1. Потратьте несколько минут на правильное форматирование вашего вопроса, чтобы HTML и код были отформатированы как код, а ошибка — как цитата. Это значительно облегчает чтение вопроса.

Ответ №1:

Вы используете недопустимое выражение 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();
  

Ответ №2:

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

 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 является законным 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()
      

Ответ №3:

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

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

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

Ответ №4:

Проблема в том, что вы не можете использовать текстовый узел в selenium для поиска элемента, например //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());
  

Обратитесь к этой ссылке для получения дополнительной информации

Ответ №5:

Недопустимый селектор: не удалось найти элемент с выражением XPath 6000039318 из-за следующей ошибки: Ошибка типа: не удалось выполнить ‘evaluate’ для ‘Document’: Результат не является набором узлов и, следовательно, не может быть преобразован в желаемый тип. Ответ: Я обнаружил эту ошибку, когда передал недопустимые данные элементу с помощью метода SendKey () в selenium. Например, я передаю XPath элемента вместо значения (int, String), используя метод SendKey. Эта путаница возникла из-за использования одного и того же имени свойства data и Xpath в файле свойств.