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 </p>
</li>
</ul>
<p>
<a href="https:/play.google.com/store/apps/details?id=com.vector.guru99&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 节点的所有后代的所有以下兄弟姐妹,这正是你得到的。
我遇到过一些人,他们习惯性地用“//”代替“/”,就像一种神奇的仙尘,却丝毫不知道这是什么意思。不要这样做:阅读规范。
我注意到使用 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 </p>
</li>
</ul>
<p>
<a href="https:/play.google.com/store/apps/details?id=com.vector.guru99&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 节点的所有后代的所有以下兄弟姐妹,这正是你得到的。
我遇到过一些人,他们习惯性地用“//”代替“/”,就像一种神奇的仙尘,却丝毫不知道这是什么意思。不要这样做:阅读规范。