我用XPather 浏览器在 HTML 页面上检查我的 XPATH 表达式。
我的最终目标是在 Selenium 中使用这些表达式来测试我的用户界面。
我得到了一个 HTML 文件,其内容类似于:
美国广播公司
我想选择一个文本包含字符串“的节点””。
使用像“abc”这样的普通字符串没有问题。我使用类似于//td[text()="abc"]
.
当我尝试使用 XPATH 时//td[text()=" "]
它什么也不返回。是否有关于带有“&
“?
我发现当我通过在 Windows 上的两个引号之间键入 Alt+0160 输入硬编码的不间断空格 (U+00A0) 时,我可以进行匹配…
//table[@id='TableID']//td[text()=' ']
使用特殊字符为我工作。
据我了解,XPath 1.0 标准不处理转义 Unicode 字符。 XPath 2.0 中似乎有这样的功能,但看起来 Firefox 不支持它(或者我误解了一些东西)。所以你必须与本地代码页有关。丑陋,我知道。
实际上,看起来标准依赖于使用 XPath 的编程语言来提供正确的 Unicode 转义序列……所以,不知何故,我做对了。
在 Firefox 2 中使用 Xpather 1.4.1, //td[text()=’ ‘] 不会产生任何结果。
对不起。它对我不起作用。我的最终目标是在 Selenium 中使用它来测试我的 Web 界面。 Selenium 本身将测试表达式保存在 XML 结构中,Alt Windows 键入似乎在路上丢失了。此外,我以 XML 形式返回。
Zack,正如我所写的,您必须用 Alt+0160(在数字键盘上)产生的字符替换两个引号之间的空格。
也必须成功地使用 PHP:$col = $xpath->query("//p[text()=\"\xC2\xA0\"]");
@Bergory 这可以使用 Protractor 和 Selenium 驱动程序
尝试使用十进制实体
而不是命名实体。如果这不起作用,您应该能够简单地使用不间断空格的 unicode 字符而不是
实体。
(注意:我没有在 XPather 中尝试过,但我确实在 Oxygen 中尝试过。)
非常感谢,那个链接非常有用。你不知道我花了多少时间试图找出解决方案。在我的例子中,我不得不用“\u00A0”替换空格“”,因为这就是Java解释那个“”符号的方式。
根据您提供的 HTML:
<tr>
<td>abc</td>
<td> </td>
</tr>
用字符串定位节点
您可以使用以下任何一种路径基于解决方案:
- 使用
text()
:"//td[text()='\u00A0']"
- 使用
contains()
:"//td[contains(., '\u00A0')]"
但是,理想情况下,您可能希望避免无休息空间字符并使用以下任一定位器策略:
- 使用父级
<tr>
节点和following-sibling
:"//tr//following-sibling::td[2]"
- 使用
starts-with()
:"//tr//td[last()]"
- 使用前面的
<td>
节点和following
node and
以下兄弟姐妹:"//td[text()='abc']//following::td[1]"
Reference
您可以在以下位置找到相关的详细讨论:
请记住,符合标准的 XML 处理器将替换除 XML 的五个标准引用之外的任何实体引用(&
,>
,<
,'
,"
) 与目标编码中的相应字符在评估 XPath 表达式时。鉴于这种行为,如果您想使用 XML 工具,PhiLho 和 jsulak 的建议是您的最佳选择。当你进入
在 XPath 表达式中,应在应用 XPath 表达式之前将其转换为相应的字节序列。
如果您在 XPather (GUI) 或 JavaScript 中尝试/使用 XPath(没有自动替换实体,因为我们不在 XML 中),则不会。在其他 XML 环境(XSTL?)中的好建议。
我无法使用 Xpather 获得匹配,但以下内容适用于 Microsoft 的 XML 记事本中的纯 XML 和 XSL 文件:
<xsl:value-of select="count(//td[text()=' '])" />
返回的值为 1,这是我的测试用例中的正确值。
但是,我确实必须声明nbsp作为我的 XML 和 XSL 中的一个实体,使用以下内容:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
我不确定这是否对你有帮助,但我能够实际上寻找nbsp使用 XPath 表达式。
编辑:我的代码示例实际上包含字符”但是 JavaScript 语法高亮将其转换为空格字符。不要被误导!
您可以编辑您的代码示例,就像为我的问题中的示例所做的那样。将您的 nbsp 实体替换为 .
您的实际 XSL 转换是否没有返回任何内容?还是只有 Xpather?