无法根据后代文本节点的字符串值获取元素

Unable to fetch the element based on the string value of the descendant text nodes

我正在尝试根据其后代文本节点定位元素 div。

下面是HTML:

<html><head></head><body>

<div>
<div class="d x">Foo</div>
<span>Mumbai</span>
<h1>DEF</h1>
</div>

</body></html>

硒代码:

driver.findElement(By.xpath("//div[.='FooMumbaiDEF']"));

根据我的理解,在参考了 Whosebug 的帖子后, 元素节点的字符串值是按文档顺序排列的元素节点的所有文本节点后代的字符串值的串联。

但我得到 NoSuchElementException: Unable to locate element: //div[.='FooMumbaiDEF']

知道为什么找不到元素吗?

//div[.='FooMumbaiDEF'] 不是有效的 XPath 如果您想根据其文本处理 Web 元素,那么您可以在使用的 Xpath 表达式中使用 contains() 函数搜索包含特定文本的网络元素。

尝试使用以下 xpath 来处理您网页中的 Foo 文本:

driver.findElement(By.xpath("//div[contains(text(),'Foo')]"));

尝试下面的 xpath,因为您使用的不正确。

driver.findElement(By.xpath("//div[contains(text(),'FooMumbaiDEF')]"));

根据 HTML:

<html>
    <head>
    </head>
    <body>
        <div>
            <div class="d x">Foo</div>
            <span>Mumbai</span>
            <h1>DEF</h1>
        </div>
    </body>
</html>

没有这样的后代文本节点。但是有 <div><span><h1> 节点带有 text.


解决方案

要根据后代 <div><span><h1> 节点中的文本识别父 <div> 元素,您可以使用以下任一 based :

  • 使用后代<div>:

    driver.findElement(By.xpath("//div[./div[text()='Foo']]"));
    
  • 使用后代<div>:

    driver.findElement(By.xpath("//div[./span[text()='Mumbai']]"));
    
  • 使用后代<div>:

    driver.findElement(By.xpath("//div[./h1[text()='DEF']]"));
    

理想情况下,您需要为 visibilityOfElementLocated() 引入 并且您可以使用以下任一 定位器策略 :

  • 使用后代<div>:

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[./div[text()='Foo']]")))
    
  • 使用后代<div>:

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[./span[text()='Mumbai']]")))
    
  • 使用后代<div>:

    new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[./h1[text()='DEF']]")))
    

首先运行 $x("//div/descendant::text()")检查div元素的所有后代文本节点。它显示了七个后代文本节点。因此,它包含四个数据为 \n 的文本节点,即 new-line 字符以及上述 3 个文本节点,即 FooMumbaiDEF
因此,select 上面 div 节点的 Xpath 表达式应该是:

$x("//div[.='\nFoo\nMumbai\nDEF\n']")