问答中心分类: XML使用 XPATH 搜索包含的文本
0
匿名用户 提问 4分钟 前

我用XPather 浏览器在 HTML 页面上检查我的 XPATH 表达式。
我的最终目标是在 Selenium 中使用这些表达式来测试我的用户界面。
我得到了一个 HTML 文件,其内容类似于:


  美国广播公司
  

我想选择一个文本包含字符串“的节点””。
使用像“abc”这样的普通字符串没有问题。我使用类似于//td[text()="abc"].
当我尝试使用 XPATH 时//td[text()=" "]它什么也不返回。是否有关于带有“&“?

Zack The Human 回复 4分钟 前

您的实际 XSL 转换是否没有返回任何内容?还是只有 Xpather?

6 Answers
0
PhiLho 回答 4分钟 前

我发现当我通过在 Windows 上的两个引号之间键入 Alt+0160 输入硬编码的不间断空格 (U+00A0) 时,我可以进行匹配…

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

使用特殊字符为我工作。
据我了解,XPath 1.0 标准不处理转义 Unicode 字符。 XPath 2.0 中似乎有这样的功能,但看起来 Firefox 不支持它(或者我误解了一些东西)。所以你必须与本地代码页有关。丑陋,我知道。
实际上,看起来标准依赖于使用 XPath 的编程语言来提供正确的 Unicode 转义序列……所以,不知何故,我做对了。

Zack The Human 回复 4分钟 前

在 Firefox 2 中使用 Xpather 1.4.1, //td[text()=’ ‘] 不会产生任何结果。

Bergeroy 回复 4分钟 前

对不起。它对我不起作用。我的最终目标是在 Selenium 中使用它来测试我的 Web 界面。 Selenium 本身将测试表达式保存在 XML 结构中,Alt Windows 键入似乎在路上丢失了。此外,我以 XML 形式返回。

PhiLho 回复 4分钟 前

Zack,正如我所写的,您必须用 Alt+0160(在数字键盘上)产生的字符替换两个引号之间的空格。

hakre 回复 4分钟 前

也必须成功地使用 PHP:$col = $xpath->query("//p[text()=\"\xC2\xA0\"]");

Damian Green 回复 4分钟 前

@Bergory 这可以使用 Protractor 和 Selenium 驱动程序

0
James Sulak 回答 4分钟 前

尝试使用十进制实体 而不是命名实体。如果这不起作用,您应该能够简单地使用不间断空格的 unicode 字符而不是 实体。
(注意:我没有在 XPather 中尝试过,但我确实在 Oxygen 中尝试过。)

Guilherme Machado 回复 4分钟 前

非常感谢,那个链接非常有用。你不知道我花了多少时间试图找出解决方案。在我的例子中,我不得不用“\u00A0”替换空格“”,因为这就是Java解释那个“”符号的方式。

0
undetected Selenium 回答 4分钟 前

根据您提供的 HTML:

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

用字符串定位节点&nbsp;您可以使用以下任何一种路径基于解决方案:

  • 使用text()
    "//td[text()='\u00A0']"
  • 使用contains()
    "//td[contains(., '\u00A0')]"

但是,理想情况下,您可能希望避免无休息空间字符并使用以下任一定位器策略

  • 使用父级<tr>节点和following-sibling
    "//tr//following-sibling::td[2]"
  • 使用starts-with()
    "//tr//td[last()]"
  • 使用前面的<td>节点和followingnode and以下兄弟姐妹:
    "//td[text()='abc']//following::td[1]"

Reference
您可以在以下位置找到相关的详细讨论:

tl;博士
Unicode 字符 ‘NO-BREAK SPACE’ (U+00A0)

0
ChuckB 回答 4分钟 前

请记住,符合标准的 XML 处理器将替换除 XML 的五个标准引用之外的任何实体引用(&amp;,&gt;,&lt;,&apos;,&quot;) 与目标编码中的相应字符在评估 XPath 表达式时。鉴于这种行为,如果您想使用 XML 工具,PhiLho 和 jsulak 的建议是您的最佳选择。当你进入 在 XPath 表达式中,应在应用 XPath 表达式之前将其转换为相应的字节序列。

PhiLho 回复 4分钟 前

如果您在 XPather (GUI) 或 JavaScript 中尝试/使用 XPath(没有自动替换实体,因为我们不在 XML 中),则不会。在其他 XML 环境(XSTL?)中的好建议。

0
Zack The Human 回答 4分钟 前

我无法使用 Xpather 获得匹配,但以下内容适用于 Microsoft 的 XML 记事本中的纯 XML 和 XSL 文件:

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

返回的值为 1,这是我的测试用例中的正确值。
但是,我确实必须声明nbsp作为我的 XML 和 XSL 中的一个实体,使用以下内容:

<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>

我不确定这是否对你有帮助,但我能够实际上寻找nbsp使用 XPath 表达式。
编辑:我的代码示例实际上包含字符但是 JavaScript 语法高亮将其转换为空格字符。不要被误导!

Bergeroy 回复 4分钟 前

您可以编辑您的代码示例,就像为我的问题中的示例所做的那样。将您的 nbsp 实体替换为 .