ChatGPT解决这个技术问题 Extra ChatGPT

使用 XPATH 搜索包含   的文本

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

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

我得到了一个 HTML 文件,其内容类似于:

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

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

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

当我尝试使用像 //td[text()="&nbsp;"] 这样的 XPATH 时,它什么也不返回。对于带有“&”的文本是否有特殊规则?

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

P
PhiLho

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"]。
                			                   			


OpenQA 链接不再成功加载
我只想指出 ${nbsp} 在 Selenium 或 Chrome 开发工具中不适合我,\u00a0 也不适合。对我有用的是在 mac Alt+Shift+Space 上键入一个不间断的空格。网络搜索在 Windows 上显示 Alt+0160
P
PhiLho

我发现当我通过在 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 中以 a 形式返回。
Zack,正如我所写的,您必须用 Alt+0160(在数字键盘上)产生的字符替换两个引号之间的空格。
也必须成功地使用 PHP:$col = $xpath->query("//p[text()=\"\xC2\xA0\"]");
@Bergory 这可以使用 Protractor 和 Selenium 驱动程序
J
Jeff Puckett

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

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


u
undetected Selenium

根据您提供的 HTML:

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

要使用字符串 &nbsp; 定位节点,您可以使用以下任一基于 的解决方案:

使用 text(): "//td[text()='\u00A0']"

使用 contains(): "//td[contains(., '\u00A0')]"

但是,理想情况下,您可能希望避免使用 NO-BREAK SPACE 字符并使用以下任一 Locator Strategies

使用父 节点和following-sibling:“//tr//following-sibling::td[2]”

使用starts-with(): "//tr//td[last()]"

使用前面的 节点和后面的节点和下面的兄弟`:“//td[text()='abc']//following::td[1]”

参考

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

如何找到包含   的元素使用硒

tl;博士

Unicode Character 'NO-BREAK SPACE' (U+00A0)


C
ChuckB

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


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

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

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

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

但是,我确实必须使用以下命令在我的 XML 和 XSL 中将 nbsp 声明为一个实体:

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

我不确定这是否对您有帮助,但我实际上能够使用 XPath 表达式找到 nbsp。

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


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

搜索 &nbsp; 或仅搜索 nbsp - 您尝试过吗?


我认识到这应该可行,但不确定我发现了什么。 XPATH 中必须有一种方法来编码某种方式以匹配我正在寻找的内容。
也许我应该看看正则表达式。