【问题标题】:XPath: multiple predicates vs logical And operatorXPath:多个谓词与逻辑 And 运算符
【发布时间】:2022-11-30 02:10:13
【问题描述】:

当我们有多个术语来定位一个元素时,我们可以使用具有逻辑的单个谓词在其中使用运算符或在每个谓词中使用多个谓词和单个术语。
例如,在 this page 上,我们可以找到指向包含 selenium 的问题的链接,其中包含此 XPath:

"//a[@class='s-link'][contains(@href,'selenium')]"

有了这个

"//a[@class='s-link' and contains(@href,'selenium')]"

我想知道这两种方法之间是否有任何区别?

【问题讨论】:

  • 那没有。我更喜欢使用第一个,因为它对我来说更短更清晰。但这当然是个人喜好
  • 谢谢@SiebeJongebloed。你能评论一下下面Heiko给出的答案吗?好像有区别。

标签: selenium xpath xpath-1.0


【解决方案1】:

计算这些表达式的算法可能有所不同,但结果是相同的。如果第二个条件包含position()last(),情况就会有所不同:

  • //a[@class='s-link'][position() > 1] 给出除第一个之外的所有s-link 锚点(因为position() 是节点集//a[@class='s-link'] 中的位置)而
  • //a[@class='s-link' and position() > 1] 给出第一个锚点之后的所有 s-link 锚点(因为 position() 是节点集 //a 中的位置)。

此外,您可以使用 //a[@class='s-link'][1] 选择第一个 s-link 锚点,而不是 //a[@class='s-link' and 1]

【讨论】:

  • 您能否澄清一下,该元素的位置如何可能为 1,但总体上不是第一个a?或者你的意思是,如果页面上有更多 a 元素,而页面上的第一个 a 没有 class='s-link',则第二个表达式将不起作用?
  • 我已经编辑了我的答案以使其更清楚。
【解决方案2】:

如果两个谓词都不是位置的,则这些表达式是等价的。如果 (a) 其值为数字,或 (b) 其值取决于动态上下文中的当前位置(出于实际目的,这意味着如果它是调用 position() 函数的表达式),则谓词是位置的。

假设满足此条件,则没有充分的理由偏爱一种表达方式而不是另一种表达方式。当然,某些 XPath 处理器可能比另一个更快地评估其中一个,但这不太可能是显着差异,并且它同样有利于两者中的任何一个。

在以影响错误处理的方式优化结构方面,处理器提供的自由度存在细微差别,这些规则在 XPath 版本之间略有不同,但这在实践中也不太可能很重要。

等价不适用于位置谓词,因为 (a) 当您编写 A[X][Y] 时,position()Y 中的值不同于它在 X 中的值,并且 (b) 如果 X 或 @ 987654327@ 是数字然后它被解释为position()=X(或position()=Y),这不适用于and 的操作数:您不能将A[@code][1] 重写为A[@code and 1]

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多