#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 в файле свойств.