【问题标题】:Why is XPath last() function not working as I expect?为什么 XPath last() 函数没有像我预期的那样工作?
【发布时间】:2016-04-20 20:37:56
【问题描述】:

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

//a//b[last()]

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

得到&lt;b&gt;as&lt;/b&gt;,它带给我:

<b>asas</b>

<b>as</b>

但是当我将它应用到:

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

它带给我:

<b>as</b>

【问题讨论】:

    标签: java xml selenium xpath selenium-webdriver


    【解决方案1】:

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

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

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

    1. 要在 siblingsa 元素下方)中选择最后一个 b 元素:

      //a//b[last()]
      

      这里,过滤是b 选择条件的一部分,因为[] 的优先级高于//

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

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

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

    【讨论】:

    • 它起作用了,但你能解释一下吗,我很困惑:(
    • //a//b(//a//b)link 中检查时的结果相同
    • 是的,但//a//b[last()](//a//b)[last()] 不要选择相同的。答案已更新,并附有扩展说明。
    • 这就是为什么当我将//a//b[last()] 应用到&lt;a&gt;&lt;l&gt;&lt;b&gt;as&lt;/b&gt;&lt;b&gt;asasas&lt;/b&gt;&lt;/l&gt;&lt;b&gt;asas&lt;/b&gt;&lt;/a&gt; 我得到&lt;b&gt;asasas&lt;/b&gt; &lt;b&gt;asas&lt;/b&gt; 现在有意义了,谢谢
    • 再问一个问题,我应该去哪里了解这些函数的确切行为?你知道任何在线资源吗?
    【解决方案2】:

    如果您记住“//”是“/descendant-or-self::node()/”的缩写,并且步骤“b”是“孩子::b"。所以

    //b[last()]
    

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

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

    您要求提供信息来源。 @kjhughes 建议阅读 XPath 1.0 推荐,事实上,它比许多规范更具可读性。但有时它可能有点简洁。有时感觉就像解决填字游戏。我的“XSLT 2.0 Programmer's Reference”(其中还包括很多关于 XPath 的材料)是为希望深入了解该语言的工作原理的人编写的,但用更简单的英语进行了解释。这个特定主题在第 627 页,如果您想了解它是如何涵盖的,很容易在网络上找到盗版副本。但我建议购买正版,因为滚动浏览 1300 页扫描的 PDF 并不好玩。

    【讨论】:

    • XSLT 2.0 程序员参考可从publisher hereAmazon here 购买。作为开发人员,与为您节省的时间相比,成本微不足道。顺便说一句,迈克尔·凯在这里和网络上的时间都非常慷慨,因此您可以看到他在复杂主题上的写作水平;他的书更好。
    • 非常感谢您的时间和帮助:)
    猜你喜欢
    • 2021-09-07
    • 2023-04-10
    • 2016-12-03
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2013-04-11
    相关资源
    最近更新 更多