xpath - 轴方法 return 错误的节点

xpath - axes methods return wrong nodes

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

url: "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”select 三个 img 元素。但是,当我使用“//td//following-sibling::img”时,它仍然可以 return 第二个和第三个 img 元素。据我所知,child 和 sibling 是两个不同的东西,为什么会这样?

url: 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'和(@class='rt-grid-12 rt-alpha rt-omega')]//following-sibling ::div",那些应该是 child 元素的 div 元素仍然被算作兄弟姐妹

使用“//div[@id='rt-feature'和(@class='rt-grid-12 rt-alpha rt-omega')]//parent::div", self 元素及其child div 元素都算作parent.

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

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

你会发现

//td//following-sibling::img

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

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

我遇到过一些人,他们习惯性地用“//”代替“/”,就像一种神奇的仙尘,却丝毫不知道这是什么意思。不要这样做:阅读规范。