首页 文章

使用XPATH搜索包含 的文本

提问于
浏览
106

我使用XPather Browser检查HTML页面上的XPATH表达式 .

我的最终目标是在Selenium中使用这些表达式来测试我的用户界面 .

我有一个HTML文件,其内容与此类似:

<tr>
  <td>abc</td>
  <td>&nbsp;</td>
</tr>

我想选择一个包含字符串“ &nbsp; ”的文本的节点 .

使用像"abc"这样的普通字符串是没有问题的 . 我使用类似于 //td[text()="abc"] 的XPATH .

当我尝试使用类似 //td[text()="&nbsp;"] 的XPATH时,它什么都不返回 . 有关于“ & ”的文本是否有特殊规则?

6 回答

  • 84

    看来,Selenium背后的人已经解决了这个问题 . 他们定义了一些变量来明确地匹配空格 . 在我的情况下,我需要使用类似于 //td[text()="${nbsp}"] 的XPATH .

    我在这里转载了OpenQA关于这个问题的文本(找到here):

    HTML自动规范化元素中的空白,忽略前导/尾随空格并将额外的空格,制表符和换行符转换为单个空格 . 当Selenium从页面中读取文本时,它会尝试复制此行为,因此您可以忽略HTML中的所有选项卡和换行符,并根据文本在呈现时在浏览器中的显示方式进行断言 . 我们通过用一个空格替换所有不可见的空格(包括非破坏空格“&nbsp;”)来实现这一点 . 应保留所有可见的换行符(<br>,<p>和<pre>格式化的新行) . 我们在HTML Selenese测试用例表的文本中使用相同的规范化逻辑 . 这具有许多优点 . 首先,您不需要查看页面的HTML源代码来确定您的断言应该是什么; “&NBSP;”符号对最终用户是不可见的,因此在编写Selenese测试时您不必担心它们 . (您不需要在测试用例中将“&nbsp;”标记放在包含“&nbsp;”的字段上的assertText . )您还可以在Selenese <td>标记中添加额外的换行符和空格 . 因为我们在测试用例上使用与文本相同的规范化逻辑,所以我们可以确保断言和提取的文本完全匹配 . 当您真正想要/需要在测试用例中插入额外的空格时,这会在极少数情况下产生一些问题 . 例如,您可能需要在如下字段中键入文本:“foo” . 但是如果您只是在Selenese测试用例中编写<td> foo </ td>,我们将用一个空格替换您的额外空格 . 这个问题有一个简单的解决方法 . 我们在Selenese中定义了一个变量$ ,其值为单个空格 . 您可以使用$ 插入一个不会自动修剪的空格,如下所示:<td> foo $ $ $ </ td> . 我们还添加了一个变量$ ,您可以使用它来插入不间断的空格 . 请注意,XPath不像我们那样规范化空格 . 如果你需要写一个像// div [text()=“hello world”这样的XPath,但链接的HTML真的是“你好世界”,你需要插入一个真正的“&nbsp;”进入你的Selenese测试用例以使其匹配,如下所示:// div [text()=“hello $ world”] .

  • 20

    当我通过在两个引号之间在Windows上键入Alt 0160来输入硬编码的非破坏空间(U 00A0)时,我发现我可以进行匹配...

    //table[@id='TableID']//td[text()=' ']
    

    为我工作的特殊字符 .

    根据我的理解,XPath 1.0标准不处理转义Unicode字符 . 在XPath 2.0中似乎有相应的功能,但看起来Firefox不支持它(或者我误解了一些东西) . 所以你必须使用本地代码页 . 丑陋,我知道 .

    实际上,看起来标准依赖于编程语言使用XPath来提供正确的Unicode转义序列......所以,不知何故,我做了正确的事情 .

  • 1

    尝试使用十进制实体 &#160; 而不是命名实体 . 如果这不起作用,您应该能够简单地使用unicode character for a non-breaking space而不是 &nbsp; 实体 .

    (注意:我没有在XPather中尝试过这个,但我确实在Oxygen中尝试过 . )

  • 2

    请记住,在评估XPath表达式时,符合标准的XML处理器将替换除XML的五个标准引用( &amp;&gt;&lt;&apos;&quot; )之外的任何实体引用,以及目标编码中的相应字符 . 鉴于这种行为,如果您想使用XML工具,PhiLho _1494445的建议是可行的方法 . 在XPath表达式中输入 &#160; 时,应将其转换为应用XPath表达式之前的相应字节序列 .

  • 0

    我无法使用Xpather获得匹配,但以下工作对我使用Microsoft XML记事本中的纯XML和XSL文件:

    <xsl:value-of select="count(//td[text()='&nbsp;'])" />
    

    返回的值是1,这是我的测试用例中的正确值 .

    但是,我确实必须使用以下内容将 nbsp 声明为XML和XSL中的实体:

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

    我不确定这对你有帮助,但我能够使用XPath表达式找到 nbsp .

    编辑:我的代码示例实际上包含字符 ' ' 但JavaScript语法高亮显示将其转换为空格字符 . 不要误导!

  • 4

    搜索 &nbsp; 或仅 nbsp - 你试试这个吗?

相关问题