为什么我的XPath不能使用混合内容?

时间:2017-12-19 20:58:18

标签: html xml selenium xpath

在下面的HTML中:

   <html>
        <div class="row content-box">
        <div class="col-xs-12 col-sm-6">
        <div class="gray-separator-3">
        <div class="row to-top">
          <h2 class="xs-mt-0">
            Who's covered? 
            <span class="ns-i-pencil_icon icon-flipped pensil-font"></span>
            <span>
              <a class="edit-font firefinder-match" href="#">Edit</a>
            </span>
        </h2>
        <p class="xs-mt-0 xs-mb-0">David</p>
        </div>
        </div>
        </div>
  </html>

“编辑”链接的 的XPath在写为:

时似乎有效

//div[.//h2[contains(.,'Who's covered?')]]//span/a[.='Edit']

但写作时似乎按预期工作:

//div[.//h2]//span/a[.='Edit']

<h2>

下没有子节点时,工作正常

就像下面的情况一样,当我写这样的XPath时:

//div[.//h2[contains(.,'What's covered?')]]//span/a[.='Edit']它标识了元素。

<html>
    <div class="row content-box">
    <div class="col-xs-12 col-sm-6">
    <div class="gray-separator-3">
    <div class="row to-top">
      <h2 class="xs-mt-0">
        What's covered?
      </h2>
      <span>
        <a class="edit-font firefinder-match" href="#">Edit</a>
      </span>
      <p class="xs-mt-0 xs-mb-0">David</p>
    </div>
    </div>
    </div>
</html>

是否有理由不读取其下有子节点的<h2>以及文本?

有人可以解释当一个节点同时具有文本和子树以及在编写XPath时只有文本但没有子树的节点时有什么区别吗?

1 个答案:

答案 0 :(得分:3)

这与混合内容和非混合内容无关。

您的第一个XPath格式不正确。从

改变它
//div[.//h2[contains(.,'Who's covered?')]]//span/a[.='Edit']

//div[.//h2[contains(.,"Who's covered?")]]//span/a[.='Edit']

它将按预期工作。

请注意,如果托管XPath的语言已经使用"来包围XPath本身,那么您应该能够逃避内部"(对于Java):

"//div[.//h2[contains(.,\"Who's covered?\")]]//span/a[.='Edit']"
  

下没有子节点时,工作正常

不,那个畸形的XPath在任何地方都不能正常工作。