【问题标题】:How to locate element with no tag name in Selenium Webdriver Java如何在 Selenium Webdriver Java 中找到没有标签名称的元素
【发布时间】:2021-12-12 00:48:54
【问题描述】:
<span id="UniversalRepositoryExplorer_treeNode7_name" style="white-space:nowrap;"> == $0
 <img id="UniversalRepositoryExplorer_treeNodeIcon_7" src="../../images/server_running.gif" 
 style="width:16px;height:16px;" alt   border="0"> == $0
 "&nbsp;Running&nbsp;" == $0

标签跨度有标签 img 和下面的文本 Running 没有任何标签名称

我尝试了以下无效的 x-path:

//img[@id='UniversalRepositoryExplorer_treeNodeIcon_7']

有人可以建议我如何通过 x-path 运行吗?

【问题讨论】:

  • 您要查找Running 文本节点吗?
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。
  • 除非您学习正确的术语,否则很难提出人们会理解的问题。您对 XML 数据模型感到困惑:元素节点、元素名称、文本节点等。您需要做一些阅读。
  • 您需要从页面发布实际的 HTML。现在您发布的 HTML 无效...您粘贴了几个不是 HTML 的“== $0”,并且您的标签未正确关闭。
  • 您需要为您正在使用的语言添加一个标签以及您当前的代码,当前代码不工作怎么办,任何错误消息等。

标签: java selenium-webdriver xpath


【解决方案1】:

基本上,您正在尝试获取文本节点。

xpath:'//span/text()[last()]'

例子:

document.evaluate("//span/text()[last()]", window.document, null, XPathResult.ANY_TYPE, null).iterateNext()
 
// output: " Running "

【讨论】:

  • text() 不适用于 Selenium。
  • 亲爱的,您可以在 selenium 中轻松执行脚本。使用:driver.execute_script("""document.evaluate("//span/text()[last()]", window.document, null, XPathResult.ANY_TYPE, null).iterateNext()""")
  • ...这将在包含文本的页面上返回 100 多个 SPAN 元素。这如何针对 OP 想要的元素?
  • 您只需要更新 XPath,我创建了一个示例 XPath。您可以在查看确切的目标 HTML(如 //span[@id='UniversalRepositoryExplorer_treeNode7_name']/text()[last()])后更新它直到 span 元素
  • 他的问题不是如何获取跨度,而是如何获取文本节点。所以我只讨论了那部分。
【解决方案2】:

看看你上面提到的元素,如果我试图评估黄瓜步骤,我会为 selenium-java 写这个:

@And("^I can view the \"([^\"]*)\" image$")
    public void iCanViewTheImage(String text) throws Throwable {
        String imgXpath = "//span[contains(text(),'" + text + "') and contains(@id, 'UniversalRepositoryExplorer_treeNode7_name')]//img[@id='UniversalRepositoryExplorer_treeNodeIcon_7']"
        driver.findElement(By.xpath(imgXpath));
        assertTrue(driver.findElement(By.xpath(imgXpath)).getText().contains(text));

}

在您的黄瓜步骤中,正则表达式“([^"]*)”将是“正在运行”: 我可以查看“Running”图片

基于上述文本的 xpath 将是:

//span[contains(text(),'Running') and contains(@id, 'UniversalRepositoryExplorer_treeNode7_name')]//img[@id='UniversalRepositoryExplorer_treeNodeIcon_7']

或者干脆

//span[contains(text(),'Running') and contains(@id, 'UniversalRepositoryExplorer_treeNode7_name')]

【讨论】:

    【解决方案3】:

    您的定位器的问题是 IMG 标记是自动关闭的(没有 &lt;/img&gt; 标记),因此它不能包含文本。父 SPAN 可能是包含“正在运行”文本的元素。

    您还没有为正在讨论的部分发布有效的 HTML,所以下面的 HTML 是我猜测的一般结构。

    <span id="UniversalRepositoryExplorer_treeNode7_name" style="white-space:nowrap;">
        <img id="UniversalRepositoryExplorer_treeNodeIcon_7" src="../../images/server_running.gif" style="width:16px;height:16px;" alt   border="0">
        "&nbsp;Running&nbsp;"
    </span>
    

    鉴于 HTML,代码看起来像

    driver.findElement(By.id("UniversalRepositoryExplorer_treeNode7_name")).getText();
    

    当您获取 SPAN 并使用 .getText() 时,它将获取该 SPAN 中包含的所有文本。这当然是一个猜测,因为您还没有发布该范围内的所有 HTML。这可能比您想要的更多,但这是我们对不完整问题所能做的最好的事情。如果您添加更多详细信息,我们可以调整我们的答案。

    【讨论】:

      【解决方案4】:

      文本 Running 位于 文本节点 内,它是其父标签 &lt;span&gt; 的第二个子节点。因此,要检索文本,您必须为visibilityOfElementLocated() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

      • cssSelector

        System.out.println(((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[2].textContent;", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span#UniversalRepositoryExplorer_treeNode7_name")))).toString());
        
      • xpath

        System.out.println(((JavascriptExecutor)driver).executeScript("return arguments[0].childNodes[2].textContent;", new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@id='UniversalRepositoryExplorer_treeNode7_name']")))).toString());
        

      参考文献

      您可以在以下位置找到一些相关的详细讨论:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        • 1970-01-01
        • 2015-11-10
        • 2016-04-17
        • 2018-02-21
        • 2021-04-28
        相关资源
        最近更新 更多