使用XPATH搜索包含& nbsp;的文本
题
我使用 XPather浏览器检查HTML页面上的XPATH表达式。
我的最终目标是在Selenium中使用这些表达式来测试我的用户界面。
我收到了一个HTML文件,内容与此类似:
<tr> <td>abc</td> <td> </td> </tr>
我想选择一个包含字符串“&amp; nbsp;
”的文字的节点。
使用像“abc”这样的普通字符串没有问题。我使用类似于 // td [text()=&quot; abc&quot;]
的XPATH。
当我尝试使用像 // td [text()=&quot;&amp; nbsp;&quot;]
这样的XPATH时,它什么都不返回。有关于“&amp;
”的文本是否有特殊规则? ?
解决方案
似乎 OpenQA ,Selenium背后的人,已经解决了这个问题。他们定义了一些变量来明确地匹配空格。就我而言,我需要使用类似于 // td [text()=&quot; $ {nbsp}&quot;]
的XPATH。
我在这里转载了OpenQA关于这个问题的文本(找到此处):
HTML自动规范化 元素中的空格,忽略 前导/尾随空格和转换 额外的空格,制表符和换行符 单一空间。当Selenium读取文本时 在页面之外,它试图 复制此行为,所以你可以 忽略所有选项卡和换行符 你的HTML和基于的断言 文本在浏览器中的显示方式 渲染。我们通过替换所有来做到这一点 不可见的空白(包括 带有a的不间断空格“
&amp; nbsp;
” 单一空间。所有可见的换行符 (&lt; br&gt;
,&lt; p&gt;
和&lt; pre&gt;
格式化 新线)应该保留。我们使用相同的规范化逻辑 HTML Selenese测试用例的文本 表。这有很多 好处。首先,你不需要 查看页面的HTML源代码 弄清楚你的断言应该是什么 是; &QUOT; <代码>&安培; NBSP; 代码>&QUOT;符号是看不见的 到最终用户,所以你不应该 写作时不得不担心他们 Selenese测试。 (你不需要放 &QUOT; <代码>&安培; NBSP; 代码>&QUOT;测试用例中的标记 在包含的字段上assertText &quot;
&amp; nbsp;
&quot ;.)您也可以额外付费 Selenese的换行符和空格&lt; td&gt;
标记;因为我们使用相同的 测试用例的规范化逻辑 正如我们对文本所做的那样,我们可以确保 断言和提取的文本 将完全匹配。这会产生一些问题 那些罕见的场合,你真的 想要/需要插入额外的空格 在你的测试用例中。例如,你 可能需要在字段中键入文本 这个:“
foo
”。但如果你只是 在你的网站上写下&lt; td&gt; foo&lt; / td&gt;
Selenese测试用例,我们将替换您的 只有一个空间的额外空间。此问题有一个简单的解决方法。 我们在Selenese中定义了一个变量,
$ {space}
,其值为单个 空间。您可以使用$ {space}
来 插入一个不会的空间 自动修剪,像这样: <代码>&LT; TD&GT; foo的$ {空间} $ {空间} $ {空间}&LT; / TD&GT; 代码>。 我们还包括一个变量$ {nbsp}
,您可以使用它来插入 一个不间断的空间。请注意,XPath 不规范化 我们的方式就是空白。如果你需要 写一个类似的XPath
// div [text()=&quot; hello world&quot;]
但是 链接的HTML确实是 “hello&amp; nbsp; world
”,你需要 插入真实的“&amp; nbsp;
”进入你的 Selenese测试案例让它匹配, 像这样: <代码> // DIV [文本()=&QUOT;你好$ {NBSP}世界&QUOT]。代码>
其他提示
我通过在两个引号之间在Windows上键入Alt + 0160来输入硬编码的非破坏空间(U + 00A0)时发现我可以进行匹配...
//table[@id='TableID']//td[text()=' ']
使用特殊字符为我工作。
据我所知,XPath 1.0标准不处理转义Unicode字符。在XPath 2.0中似乎有相应的功能,但看起来Firefox不支持它(或者我误解了一些东西)。所以你必须使用本地代码页。我知道,丑陋。
实际上,看起来标准依赖于编程语言使用XPath来提供正确的Unicode转义序列......所以,不知何故,我做了正确的事。
尝试使用十进制实体&amp;#160;
而不是命名实体。如果这不起作用,您应该能够简单地使用 unicode不间断空格的字符,而不是&amp; nbsp;
实体。
(注意:我没有在XPather中尝试这个,但我确实在Oxygen中尝试过。)
请记住,符合标准的XML处理器将替换除XML的五个标准引用之外的任何实体引用(&amp; amp;
,&amp; gt;
, &amp; lt;
,&amp;
,&amp; quot;
)在XPath表达式时,目标编码中的相应字符是评估。鉴于这种行为,如果您想使用XML工具,PhiLho和jsulak的建议就是您的选择。当您在XPath表达式中输入&amp;#160;
时,应该在应用XPath表达式之前将其转换为相应的字节序列。
我无法使用Xpather获得匹配,但以下内容适用于Microsoft XML记事本中的纯XML和XSL文件:
<xsl:value-of select="count(//td[text()=' '])" />
返回的值是1,这是我的测试用例中的正确值。
但是,我必须使用以下内容将 nbsp 声明为XML和XSL中的实体:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
我不确定这是否对您有所帮助,但我能够使用XPath表达式实际找到 nbsp 。
修改:我的代码示例实际上包含字符'&amp; nbsp;',但JavaScript语法高亮显示将其转换为空格字符。不要误导!
搜索&amp; nbsp;
或仅搜索 nbsp
- 你试过吗?