【问题标题】:XPath matching issue when text contains   instead of regular space文本包含   而不是常规空格时的 XPath 匹配问题
【发布时间】:2020-02-26 11:54:30
【问题描述】:

对于普通的 HTML

<b>WordA WordB WordC</b>

我会使用这个 XPath 来检索这个元素。

//b[text()='WordA WordB WordC']

但我有以下 HTML

<b>WordA&nbsp;WordB&nbsp;WordC</b>

当我试图检索此实例中的元素时,第一个 XPath 什么也不返回。

//b[text()='WordA\u00a0WordB\u00a0WordC']

以上一项有效。

但不是使用 '\u00a0' 部分,有没有更好的方法来处理这种情况。 一些定义的函数来规范化空间。

等:

//b[someFunction()='WordA WordB WordC']

【问题讨论】:

    标签: selenium xpath


    【解决方案1】:

    请注意,\u00a0 之所以有效,是因为您的 XPath 表达式嵌入在某些可识别转义序列 uNNNN 的宿主语言(例如 Java 或 Javascript)中 - 这是由包含的宿主语言转换为 NBSP 字符,而不是通过 XPath 本身。如果 XPath 嵌入在 XML 中(例如,在 XSLT 或 XSD 中),您将使用 &amp;#xa0; 而不是 \u00a0

    在 XPath 中没有处理 NBSP 的特殊方法,但您可以使用 translate() 将这些字符转换为常规空格:

    //b[translate(text(), '\u00a0', ' ') = 'WordA WordB WordC']
    

    还请注意,在此类表达式中,使用. 而不是text() 来访问元素的字符串值通常更好。这对可能出现的变化更具弹性,例如单词之一是斜体,或者单词被 cmets 分隔。

    【讨论】:

      【解决方案2】:

      我会避免使用&amp;nbsp; 字符,这样会更容易,如下所示:

      //b[contains(., 'WordA') and contains(., 'WordB') and contains(., 'WordC')]
      

      准确地说:

      //b[starts-with(., 'WordA') and contains(., 'WordB') and contains(., 'WordC')]
      

      【讨论】:

      • 尽管这是一个可行的解决方案,但我想说这实际上不是一个可维护的解决方案。如果文本有 10 个单词,我将不得不使用 9 个“包含”表达式。
      猜你喜欢
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2014-10-08
      • 2011-03-02
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多