为什么XPath last()函数不能正常工作?

时间:2016-04-20 20:37:57

标签: java xml selenium xpath selenium-webdriver

我正在使用Java和Selenium编写测试。我需要将最后一个元素放在另一个元素中,所以我使用了last()函数,但问题是它在我申请时并不总是带给我最后一个:

//a//b[last()]

 <a> 
   <l>
     <b>asas</b> 
   </l>
   <b>as</b>
 </a> 

获取<b>as</b>,它带给我:

<b>asas</b>

<b>as</b>

但是当我将它应用于:

 <a>      
   <b>asas</b> 
   <b>as</b>
 </a>
它带给我的是:

<b>as</b>

2 个答案:

答案 0 :(得分:8)

这是XPath混淆的常见原因。首先是直截了当的部分:

  • //a选择文档中的所有a元素。
  • //a//b选择文档中的所有b元素 a元素的后代。

到目前为止正常的东西。 接下来是棘手的部分:

  1. 要选择 兄弟 中的最后b元素(a元素下方):

    //a//b[last()]
    

    此处,过滤是b选择标准的一部分,因为[]的优先级高于//

  2. 要选择文档中的最后一个b元素 a元素下方):

    (//a//b)[last()]
    

    此处,last()是所有选定b元素列表中的索引,因为()用于覆盖默认优先级。

答案 1 :(得分:2)

我认为,如果你记得这个行为,最容易理解这个行为&#34; //&#34;是&#34; / descendant-or-self :: node()/&#34;的缩写,并且步骤&#34; b&#34;是&#34; child :: b&#34;的缩写。所以

//b[last()]

的缩写
/descendant-or-self::node()/child::b[position()=last()]

这意味着&#34;选择文档中的每个节点(属性和名称空间除外)。对于每个节点,形成一个名为&#34; b&#34;的子元素列表,并选择此列表中的最后一个元素&#34;。

您要求提供信息来源。 @kjhughes建议阅读XPath 1.0推荐,事实上,它比许多规范更具可读性。但它有时可能有点简洁;它偶尔会像解决填字游戏一样。我的&#34; XSLT 2.0程序员参考&#34; (其中还包括许多关于XPath的材料)是为那些希望深入理解语言运作方式的人而编写的,但用简洁的英语解释。这个特定的主题在第627页,如果您想了解它是如何被覆盖的,那么在网上找到盗版的副本就很容易了。但我建议购买合法副本,因为滚动浏览1300页的扫描PDF并不是很有趣。