【问题标题】:Finding tag by xpath by a text that has an inner tag inside通过 xpath 通过内部具有内部标签的文本查找标签
【发布时间】:2018-08-20 15:43:45
【问题描述】:

我最近遇到了一个问题。

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

但是不行,第二部分找不到了。

唯一描述这种标签的最佳方法是什么?

【问题讨论】:

    标签: selenium xpath


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!
    • @Andersson :IMO 不是一个有效的解决方案,如果我将文本拆分为 3 或 4 部分会发生什么。难道我们不用写 text()[2] , text()[3] , text()[4] 等等..
    • @cruisepandey ,我们可以想象最不可思议的情况...但是 OP 说 “...文本分为两部分” 并且共享的 HTML 代码示例反映了相同的情况
    【解决方案2】:

    你快到了。您只需将 text() 替换为 .,如下所示:

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

    这是验证的快照:

    【讨论】:

    • 我喜欢您的解决方案,结果 XPath 看起来干净而简单。但是,如果我们在目标标记周围有另一个封闭
      标记,则此 XPath 将找到封闭标记,而不是封闭标记,即我们正在寻找的那个。
    • @Alex.K 如果你有另一个 &lt;div&gt; of-coarse,xpath 会改变。在我的回答中,我总是试图保留 OP 的创新。选择最有帮助的答案是您的决定:) 一切顺利!!!
    【解决方案3】:

    这应该可行:

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

    【讨论】:

      【解决方案4】:

      如果你有这样的 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 的好方法。

      【讨论】:

      • 不幸的是,目标页面上有很多具有相同 id 和属性的 div,因此在我的情况下使用 @id 不是一个选项。
      • 嗯,你应该知道如何区分多个div。您从 andersson 获得的当前解决方案仅适用于 2 个文本分区。正如我之前所说,您的 xpath 不应包含 UI 中存在的确切文本。如果 UI 中的文本发生变化,那么您将不得不更改不必要的 xpath。
      【解决方案5】:

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

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

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

      但是,这通常不是最佳做法。理想情况下,您应该在大多数情况下使用以下 Xpath:

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

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签