我使用 XPather Browser 在 HTML 页面上检查我的 XPATH 表达式。
我的最终目标是在 Selenium 中使用这些表达式来测试我的用户界面。
我得到了一个 HTML 文件,其内容类似于:
<tr> <td>abc</td> <td> </td> </tr>
我想选择一个文本包含字符串“
”的节点。
使用像“abc”这样的普通字符串没有问题。我使用类似于 //td[text()="abc"]
的 XPATH。
当我尝试使用像 //td[text()=" "]
这样的 XPATH 时,它什么也不返回。对于带有“&
”的文本是否有特殊规则?
Selenium 背后的人 OpenQA 似乎已经解决了这个问题。他们定义了一些变量来明确匹配空格。就我而言,我需要使用类似于 //td[text()="${nbsp}"]
的 XPATH。
我在这里转载了 OpenQA 关于这个问题的文本(找到 here):
HTML 自动规范化元素中的空格,忽略前导/尾随空格并将额外的空格、制表符和换行符转换为单个空格。当 Selenium 从页面中读取文本时,它会尝试复制此行为,因此您可以忽略 HTML 中的所有制表符和换行符,并根据呈现时文本在浏览器中的外观进行断言。我们通过用一个空格替换所有不可见的空格(包括不间断空格“ ”)来做到这一点。应保留所有可见的换行符(
、
和
格式化的换行符)。我们对 HTML Selenese 测试用例表的文本使用相同的规范化逻辑。这有许多优点。首先,您不需要查看页面的 HTML 源代码来确定您的断言应该是什么; “ ”符号对最终用户是不可见的,因此在编写 Selenese 测试时不必担心它们。 (您不需要在测试用例中放置“ ”标记来在包含“ ”的字段上声明文本。)您还可以在 Selenese标记中放置额外的换行符和空格;由于我们在测试用例上使用与文本相同的规范化逻辑,因此我们可以确保断言和提取的文本完全匹配。当您真的想要/需要在测试用例中插入额外的空格时,这会在极少数情况下产生一些问题。例如,您可能需要在如下字段中键入文本:“foo”。但是,如果您只是在 Selenese 测试用例中编写 foo ,我们将用一个空格替换您的多余空格。这个问题有一个简单的解决方法。我们在 Selenese 中定义了一个变量 ${space},它的值是一个空格。您可以使用 ${space} 插入不会自动修剪的空格,如下所示:foo${space}${space}${space} 。我们还包含了一个变量 ${nbsp},您可以使用它来插入一个不间断的空格。请注意,XPath 不会像我们那样规范化空白。如果您需要编写像 //div[text()="hello world"] 这样的 XPath,但链接的 HTML 确实是“hello world”,则需要插入一个真正的“ ”进入您的 Selenese 测试用例以使其匹配,如下所示: //div[text()="hello${nbsp}world"]。
我发现当我通过在 Windows 上的两个引号之间键入 Alt+0160 输入硬编码的不间断空格 (U+00A0) 时,我可以进行匹配...
//table[@id='TableID']//td[text()=' ']
使用特殊字符为我工作。
据我了解,XPath 1.0 标准不处理转义 Unicode 字符。 XPath 2.0 中似乎有这样的功能,但看起来 Firefox 不支持它(或者我误解了一些东西)。所以你必须与本地代码页有关。丑陋,我知道。
实际上,看起来标准依赖于使用 XPath 的编程语言来提供正确的 Unicode 转义序列......所以,不知何故,我做对了。
$col = $xpath->query("//p[text()=\"\xC2\xA0\"]");
尝试使用小数实体  
而不是命名实体。如果这不起作用,您应该能够简单地使用 unicode character for a non-breaking space 而不是
实体。
(注意:我没有在 XPather 中尝试过,但我确实在 Oxygen 中尝试过。)
根据您提供的 HTML:
<tr>
<td>abc</td>
<td> </td>
</tr>
要使用字符串
定位节点,您可以使用以下任一基于 xpath 的解决方案:
使用 text(): "//td[text()='\u00A0']"
使用 contains(): "//td[contains(., '\u00A0')]"
但是,理想情况下,您可能希望避免使用 NO-BREAK SPACE 字符并使用以下任一 Locator Strategies:
使用父
使用starts-with(): "//tr//td[last()]"
使用前面的
参考
您可以在以下位置找到相关的详细讨论:
如何找到包含 的元素使用硒
tl;博士
Unicode Character 'NO-BREAK SPACE' (U+00A0)
请记住,符合标准的 XML 处理器将用目标中的相应字符替换除 XML 的五个标准引用(&
、>
、<
、'
、"
)之外的任何实体引用在评估 XPath 表达式时进行编码。鉴于这种行为,如果您想使用 XML 工具,PhiLho 和 jsulak 的建议是您的最佳选择。在 XPath 表达式中输入  
时,应在应用 XPath 表达式之前将其转换为相应的字节序列。
我无法使用 Xpather 获得匹配,但以下内容适用于 Microsoft 的 XML 记事本中的纯 XML 和 XSL 文件:
<xsl:value-of select="count(//td[text()=' '])" />
返回的值为 1,这是我的测试用例中的正确值。
但是,我确实必须使用以下命令在我的 XML 和 XSL 中将 nbsp 声明为一个实体:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
我不确定这是否对您有帮助,但我实际上能够使用 XPath 表达式找到 nbsp。
编辑:我的代码示例实际上包含字符 ' '但是 JavaScript 语法高亮将其转换为空格字符。不要被误导!
搜索
或仅搜索 nbsp
- 您尝试过吗?
不定期副业成功案例分享
\u00a0
也不适合。对我有用的是在 macAlt+Shift+Space
上键入一个不间断的空格。网络搜索在 Windows 上显示Alt+0160
。