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

时间:2018-08-20 15:43:45

标签: selenium xpath

我最近遇到了一个问题。

我需要在页面上找到一个包含特定文本的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 个答案:

答案 0 :(得分:2)

尝试在XPath下面使用两个文本节点来匹配所需的div

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

答案 1 :(得分:1)

您快到了。您只需要用 . 替换//div[contains(., 'start of div text') and contains(., 'end of div text')] ,如下所示:

{{1}}

这是验证的快照:

xpath_tester

答案 2 :(得分:0)

这应该有效:

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

答案 3 :(得分: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  

P.S:基于文本编写xpath以查找相同的确切文本不是编写Xpath的好方法。

答案 4 :(得分:0)

如果您只需要这些子文本元素的div元素,则可以从“第1部分”中分离出一段独特的内容,然后尝试以下操作:

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

这样,您无需考虑div的属性。

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

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