【问题标题】:xpath - axes methods return wrong nodesxpath - 轴方法返回错误的节点
【发布时间】:2017-11-02 09:03:21
【问题描述】:

我注意到使用 xpath 轴方法有时会返回错误的节点。我有两个例子:

网址:“http://demo.guru99.com/v1/

<tr>
   <td align="center">
      <img src="../images/1.gif">
      <img src="../images/3.gif">
      <img src="../images/2.gif">
   </td>
</tr>

我可以通过轴方法“//td//child::img”选择三个img元素。但是,当我使用“//td//following-sibling::img”时,它仍然可以返回第二个和第三个img 元素。据我所知,孩子和兄弟姐妹是两个不同的东西,为什么会这样呢?

网址:http://demo.guru99.com/selenium/guru99home/

<div class="rt-grid-12 rt-alpha rt-omega" id="rt-feature">
  <div class="rt-grid-6 ">
    <div class="rt-block">
        <h3>
            Desktop, mobile, and tablet access</h3>
        <ul>
            <li>
                <p>
                    Free android App</p>
            </li>
            <li>
                <p>
                    Download any tutorial for free</p>
            </li>
            <li>
                <p>
                    Watch video tutorials from anywhere&nbsp;</p>
            </li>
        </ul>
        <p>
            <a href="https:/play.google.com/store/apps/details?id=com.vector.guru99&amp;hl=en"><img alt="" src="images/app_google_play(1).png"></a></p>
    </div>
  </div>
  <div class="rt-grid-5 ">
    <div class="rt-block">
        <img src="images/logo_respnsivsite.png"><br>
    </div>      
  </div>    
</div>

在这里,如果我使用“//div[@id='rt-feature' and (@class='rt-grid-12 rt-alpha rt-omega')]//following-sibling::div” , 那些应该是子元素的 div 元素仍然算作兄弟元素

使用“//div[@id='rt-feature' and (@class='rt-grid-12 rt-alpha rt-omega')]//parent::div”,self 元素及其子 div 元素都算作父元素。

这让我很困惑,请帮助我。

【问题讨论】:

  • 第一种情况下正确的 xpath 在 td 之后应该只有一个斜杠 - //td/following-sibling::img。它不会返回任何东西。我希望大师能用两个斜线解释这种行为

标签: xpath axes


【解决方案1】:

建议 XPath 解析器返回错误的节点,而不是您不明白它为什么返回它所做的事情,这是从错误的心态开始的。除非您知道 XPath 解析器不可靠,否则请先假设它是正确的,而您的期望是错误的。然后转到规范并研究您编写的表达式的语义。

你会发现

//td//following-sibling::img

的缩写
/descendant-or-self::node()/td/descendant-or-self::node()/following-sibling::img

所以你已经要求所有 td 节点的所有后代的所有以下兄弟姐妹,这正是你得到的。

我遇到过一些人习惯性地将“/”代替“/”作为一种神奇的仙尘,但根本不知道它的含义。不要这样做:阅读规范。

【讨论】:

  • 但是第一个 是哪个兄弟姐妹?据我所知,它没有前兄弟?我哪里错了?
  • 您告诉我们只返回了第二张和第三张图片,而不是第一张。但是,如果您没有从源文档中去除空白文本节点,那么第一个图像之前的空白也是一个节点,而第一个图像是它的下一个兄弟。
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多