【问题标题】:TypeError: Failed to execute 'evaluate' on 'Document': The result is not a node set, and therefore cannot be converted using Xpath through SeleniumTypeError:无法在“文档”上执行“评估”:结果不是节点集,因此无法通过 Selenium 使用 Xpath 进行转换
【发布时间】:2024-04-24 16:55:02
【问题描述】:

部分页面来源:

<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),platform=Windows NT 6.1.7601 SP1 x86_64)

【问题讨论】:

  • 花几分钟时间来正确格式化您的问题,以便将 HTML 和代码格式化为代码,并将错误格式化为引号。它使问题更容易阅读。

标签: python selenium selenium-webdriver xpath xpath-1.0


【解决方案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 表达式是 legit xpath 表达式,它使用 text() 节点,如 @ 987654325@ 关注xpath v3.0

    不幸的是,Selenium 实现了不支持 text() 节点的 xpath v1.0

    另外,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"]
      

      它将寻找与@styletext() 值匹配的span 元素。

      【讨论】:

        【解决方案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());
        

        更多信息请参考this链接

        【讨论】:

          【解决方案5】:

          无效的选择器:由于以下错误,无法找到具有 XPath 表达式 6000039318 的元素: TypeError:无法在“文档”上执行“评估”:结果不是节点集,因此无法转换为所需的类型。 回答: 当我使用 selenium 中的 sendKey() 方法将无效数据传递给元素时,我发现了这个错误。就像我使用 sendKey 方法传递一个元素的 XPath 代替 value(int, String) 一样。这种混淆是由于在属性文件中使用数据和 Xpath 的相同属性名称造成的。

          【讨论】:

            最近更新 更多