【问题标题】:How to handle very long XPATH? Is there any alternative for this?如何处理很长的 XPATH?有没有其他选择?
【发布时间】:2020-08-20 14:58:26
【问题描述】:

强调文字

//div[@class='preheader']//following-sibling::table/tbody/tr[7]/td/table[1]/tbody/tr/td/table/tbody/tr/td /table/tbody/tr/td/table/tbody/tr/td/table/tbody/tr[4]/td/table/tbody/tr/td[1]/table/tbody/tr/td/table/tbody /tr/td/table/tbody/tr/td

【问题讨论】:

  • 这个 XPath-1.0 表达式不是很长。它应该可以正常工作。只有已知 XML 才能实现优化。

标签: java xpath webdriver selenium-chromedriver service-locator


【解决方案1】:

没有更短的 XPath 表达式与这个表达式完全等价。

有一些较短的 XPath 可能会在某些文档上给出相同的结果,但没有 XPath 会在每个可能的文档上给出相同的结果。

如果您只特别关注一个文档,那么像(//*)[872] 这样的路径可能会为您提供正确的元素。但通常,使用 XPath 的全部意义在于找到一个在文档稍有不同时仍然有效的表达式。为此,有必要知道您要查询的文档类的结构;实际上,查询的意图

【讨论】:

    【解决方案2】:

    是的,如果目标元素的整个遗产不重要,则可以通过descendent-or-self 轴 (//) 或通过元素通配符 * 轻松省略;两者都可以与谓词结合,当然:

    这里有一些例子;您可以选择通过...

    • id 属性值://td[@id="wantedId"]
    • 字符串值://td[.="targeted text"]
    • 相邻文字://td[preceding-sibling::td[1]="targeted label"]
    • 部分遗产://div[@id="d1"]/table[@id='t1']//tr[2]/td[1]

    然而,正如您所见,具体如何缩短取决于目标节点的上下文以及该上下文在文档实例中的变化方式。

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 2011-10-27
      • 2014-11-13
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      相关资源
      最近更新 更多