在包含内部标签的文本中通过xpath查找标签

4

我最近遇到了一个问题。

我需要在页面上找到一个包含特定文本的div标签。问题是,这个文本被内部链接标签分成两部分,因此HTML树看起来像:

**<html>
    <...>
    <div>
        start of div text - part 1
        <a/>
        end of div text - part 2
    </div>
    <...>
</html>**

为了唯一地标识那个div标签,我需要div文本的两个部分。自然而然,我会想出这样的XPath:

.//div[contains(text(), 'start of div text') and contains(text(), 'end of div text')]

然而,它并不起作用,第二部分找不到。

如何最好地描述这种标签的唯一性?

5个回答

3

尝试使用以下XPath通过两个文本节点匹配所需的div

//div[normalize-space(text())="start of div text - part 1" and normalize-space(text()[2])="end of div text - part 2"]

太棒了! - Rajagopalan
2
@Andersson:在我看来,这不是一个高效的解决方案。如果我的文本分为3或4个部分,会发生什么?我们不得不编写text()[2],text()[3],text()[4]等等... - cruisepandey
@cruisepandey,我们可以想象出最不可思议的情况......但是OP说:“...文本分为两部分”,并且共享的HTML代码示例也反映了这一点。 - Andersson

1
你已经接近成功了。你只需要将text()替换为.,如下所示:
//div[contains(., 'start of div text') and contains(., 'end of div text')]

这是验证的快照:

xpath_tester


我喜欢你的解决方案,结果XPath看起来简洁而简单。然而,如果我们在目标标签周围有另一个包含<div>标签,则该XPath将找到封闭的标签而不是我们正在寻找的嵌套标签。 - Alex.K
1
@Alex.K 如果你有另一个<div>,那么_xpath_当然会改变。在我的答案中,我总是试图保留OP的创新。选择最有帮助的答案是你的决定 :) 一切顺利!!! - undetected Selenium

0

这应该可以工作:

//div[contains(text(), 'start of div text') and contains(./a/text(), 'end of div text')]

0

如果你有像这样的HTML DOM树:

<div id="container" class="someclass">
    <div>
        start of div text - part 1
        <a/>
        end of div text - part 2
    </div>
 </div>  

如果要提取div文本,可以编写如下的xpath:

//div[@id='container']/child::div  

附言:基于文本编写XPath以查找完全相同的文本并不是编写XPath的好方法。


很不幸,目标页面上有很多具有相同id和属性的div,因此在我的情况下使用@id不是一个选项。 - Alex.K
你应该知道如何区分多个div。目前你从andersson那里得到的解决方案只适用于两个文本div。正如我之前所说,你的xpath不应包含UI中存在的确切文本。如果UI中的文本发生变化,则必须更改xpath,这是不必要的。 - cruisepandey

0

如果你只想要这些子文本元素的 div 元素,那么你可以从 "part 1" 中隔离出一段独特的内容并尝试以下操作:

//*[contains(., 'part 1')]/parent::div

这样你就不必考虑 div 的属性了。

然而,这通常不是最佳实践。在大多数情况下,理想情况下应该使用以下 Xpath:

//div[@id,('some id') and contains(., 'part 1')]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接