当前位置: 首页 > 知识库问答 >
问题:

Selenium xpath找不到元素(其他xpath工具证明它存在)

夏华藏
2023-03-14

硒检测:

driver.FindElement(By.XPath($"//*[contains(text(), '{text}')]"));
no such element: Unable to locate element:
{
    "method":"xpath",
    "selector":"//*[contains(text(), '269424ae-4d74-4a68-91e0-1603f2d674a0')]"
}
(Session info: chrome=74.0.3729.169)
(Driver info: 
    chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),
    platform=Linux 4.18.0-20-generic x86_64)
    new HtmlParser()
        .ParseDocument(driver.PageSource)
        .SelectSingleNode($"//*[contains(text(), '{text}')]");

目标元素是包含GUID的div:

<div class="home-project-title-text"> 269424ae-4d74-4a68-91e0-1603f2d674a0 </div>

这是与

  • DotNet core 2.2
  • Chrome webdriver
  • 铬74
  • Ubuntu 18.04
selectSingle = xpath => document.evaluate(xpath, document).iterateNext()
> selectSingle("//*[contains(text(), '269424ae-4d74-4a68-91e0-1603f2d674a0')]")

> null

但它肯定存在,并且具有预期的文本,例如,我可以使用不同的xpath表达式手动定位和检查它的文本内容:

> selectSingle("//*[@id='app']/div/div[1]/div[3]/div/div[1]/div/div[1]/div")
    .textContent
    .trim() 
    == "269424ae-4d74-4a68-91e0-1603f2d674a0"

> true

原因是在react中创建了div,如下所示:

js prettyprint-override">React.createElement(
    "div", 
    {className = "home-project-title-text"}, 
    " ", 
    "269424ae-4d74-4a68-91e0-1603f2d674a0", 
    " ");

我认为这大致意味着div有三个textnodes作为子节点(这是有效的吗?)。结果看起来100%正常--它完美地呈现,并且使用devtools检查元素看起来就像是一个文本节点,.textContent返回连接的字符串。

共有1个答案

云何平
2023-03-14

现在,您提供了一些更多的信息(该元素是如何创建的):

是的,一个XML元素有可能有几个单独的文本节点作为它的子节点。但是,如果文本节点彼此相邻,而不是由子元素分隔,通常情况就不是这样了。

如果'269424AE-4D74-4A68-91E0-1603F2D674A0'确实是第二个文本节点,则

//*[contains(text(), '269424ae-4d74-4a68-91e0-1603f2d674a0')]

查找第一个文本节点包含“269424AE-4D74-4A68-91E0-1603F2D674A0”的任意名称的元素。

text()实际上会选择元素的所有文本节点,但contains()silenty等XPath函数只选择第一个。

您实际上想要选择的是

具有任意名称的元素,其中任何文本节点包含“269424AE-4D74-4A68-91E0-1603F2D674A0”

实现这一点的表达式是:

//*[text()[contains(.,'269424ae-4d74-4a68-91e0-1603f2d674a0')]]

您可以使用一个小的玩具文档来测试这些表达式,例如:

<div className="home-project-title-text">
   <other/>
   269424ae-4d74-4a68-91e0-1603f2d674a0
   <other/>
</div>

其中other元素强制div元素包含三个单独的文本节点,其中两个仅包含空格。

最后,如果您已经知道要查找的元素是div,那么您应该专门查找它:

//div[text()[contains(.,'269424ae-4d74-4a68-91e0-1603f2d674a0')]]
 类似资料:
  • 我是新来的。如果问题重复,很抱歉,但我没有找到解决方法。 我有一个问题--我无法使用Xpath定位元素,但我使用ID定位器定位它没有问题。见附件截图。这一问题不仅针对这一要素,而且也针对所有要素。看来Xpath根本不起作用。 我正在使用Appium 7.3.0(试用过不同版本),UIAutomator2,方法是在模拟器上设置,Android 8.1功能。 null 此外,我在需要的地方使用了和,因

  • 问题内容: 我正在使用Selenium将Web测试添加到我的项目中。我已经有很多使用以下方法检查特定元素的测试: 这很好。现在,我还有另一个要求。这是在我生成的页面中: 如何掌握错误消息?我想要一些允许我在dateElement之后请求带有“错误”类的span元素的东西。 (此错误消息是由Spring MVC合并的,因此直接更改它并不容易。我想可能是这样,但我不希望这样做)。 任何其他想法都欢迎。

  • 问题内容: 我正在尝试编写Selenium测试用例,并从Firefox中的Selenium IDE开始。那里的测试工作很好。现在,我想使用Selenium Webdriver自动化该测试,并导出相应的JAVA类。到目前为止,一切都已设置并且运行良好(Internet Explorer窗口正在打开,显示相应的页面)。 但是:Selenium Webdriver找不到元素。我想获得以下元素: 而且我有

  • Selenium.Common.Exceptions.NosuChelementException:消息:没有这样的元素:找不到元素:

  • 这是我用来使用铬Web驱动程序和python查找元素的代码行 这是每次尝试运行代码时抛出的错误 这些是标题栏上的按钮,我试图让我的代码单击html按钮 这是努力按钮的html代码,我试图使用selenium来定位它,以便它可以点击这里,但它总是说没有找到这样的元素 我甚至创建了一个单独的函数来一次又一次地找到元素并在每次成功尝试后Hibernate5秒,直到它点击了元素,但仍然没有运气它永远运行而

  • 我正在尝试使用python selenium脚本单击gmail主页右上角的“登录”标签。我使用firebug/firepath为这个类找到了正确的xpath,在使用浏览器工具时,它似乎工作得很好,但当脚本尝试使用xpath查找相同的元素时,它失败了。如果你能给我指出正确的方向,我将不胜感激。非常感谢。 Url:https://www.google.com/gmail/about/ 附言:我对硒比较