【问题标题】:Xpath doesn't detect text with nbspXpath 不使用 nbsp 检测文本
【发布时间】:2021-01-21 17:22:45
【问题描述】:
<tr>
 <td align="left" width="200">
  <p>Document Uploaded:&nbsp;Yes</p>
 </td>
</tr>

我无法在文本中找到带有&amp;nbsp; 的元素。下面的 XPath 表达式不起作用,我在网上尝试了很多其他建议,但还没有成功。仅供参考:我需要整个文本,而不仅仅是它的子字符串。

//p[contains(text(), 'Document Uploaded: Yes')]

【问题讨论】:

  • 这能回答你的问题吗? Using XPATH to search text containing &nbsp;
  • 我也试过了,但它不起作用@AlexRudenko
  • 试试 //*[translate(.,'\u00A0',' ')='文件上传:是']
  • 您提供的是完整的 XML 文档还是只是其中的一部分?请提供一份完整但长度最小的文档,该文档仍然显示报告的问题。我怀疑未能选择想要的元素可能是由于命名空间问题。
  • 你能解释一下你的意思是什么:“仅供参考:我需要整个文本,而不仅仅是它的sn-p。”?提供的 XPath 表达式选择一个(在您的情况下)或多个 &lt;p&gt; 元素,而不是文本节点。此外,如果您在谓词中指定字符串"'Document Uploaded: Yes'",那么您已经知道“整个文本”......那么您的实际意思是什么?很困惑!

标签: java selenium xpath


【解决方案1】:

使用

//p[. = 'Document Uploaded:&#xA0;Yes']

基于 XSLT 的验证

这个 XSLT 转换只是评估上面的 XPath 表达式并输出评估的结果:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:copy-of select=
    "//p[. = 'Document Uploaded:&#xA0;Yes']"/>
  </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

<!DOCTYPE stylesheet [
<!ENTITY nbsp  "&#160;" >
]>
<tr>
 <td align="left" width="200">
  <p>Document Uploaded:&nbsp;Yes</p>
 </td>
</tr>

产生想要的正确结果

<p>Document Uploaded: Yes</p>

【讨论】:

    【解决方案2】:

    奇怪的是这个!上面提到的其他答案应该是单词。

    另一种解决方案是绕过字符:

    //p[contains(text(), 'Document Uploaded:')][contains(text(), 'Yes')]
    

    使用 xpath 来查找包含您需要的两个字符串的元素。如果需要更硬一些,可以使用starts-withends-with

    另一种方法是不通过文本查找此项目,而是获取元素并在 Java 中对其进行处理。 我不能给出一个可行的例子,因为我需要查看更多的 html,但过程是:

    • 找到一个固定的锚点,例如您可以轻松识别 html 表格中的其他内容
    • 使用following-sibling::parent::following:: 从该锚点创建一个xpath(你明白了)- 随便找这个Document Uploaded: 元素
    • 使用findElement 将其设置为您在java 中的xpath。
    • 在java中:myElement.getText()

    我认为 Selenium 足够聪明,可以删除 nbsp 字符 - 但即使没有,您仍然会有一个文本字符串来确认您的文档上传状态。

    【讨论】:

      【解决方案3】:

      尝试使用

      //p[contains(text(), 'Document Uploaded:&#160;Yes')]
      

      &amp;#160;命名字符引用&amp;nbsp;数字字符引用(参见Wikipedia)。它也可以用在 XML/XSLT 文档开头的 DOCTYPE 声明中,使&amp;nbsp; 可用:

      <!DOCTYPE stylesheet [
      <!ENTITY nbsp  "&#160;" >
      ]>
      

      【讨论】:

      • 我猜这个处理依赖于 XPath-Parser。我用xsltprocSaxon9 对其进行了测试,它在那里工作。
      猜你喜欢
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多