我使用XPather浏览器检查HTML页面上的XPATH表达式。
我的最终目标是在Selenium中使用这些表达式来测试用户界面。
我得到了一个HTML文件,其内容类似于以下内容:
<tr> <td> abc </ td> <td>&nbsp; </ td> </ tr>
我想选择一个包含字符串“ ” 的文本的节点。
使用“ abc”这样的普通字符串不会有问题。我使用类似于的XPATH //td[text()="abc"]。
//td[text()="abc"]
当我尝试使用类似的XPATH时,//td[text()=" "]不会返回任何内容。关于带有“ &”的文本是否有特殊规定?
//td[text()=" "]
&
似乎Selenium背后的家伙OpenQA已经解决了这个问题。他们定义了一些变量以明确匹配空白。就我而言,我需要使用类似于的XPATH //td[text()="${nbsp}"]。
//td[text()="${nbsp}"]
我在这里转载了来自OpenQA的有关此问题的文本(在此处找到):
HTML会自动规范元素内的空格,而忽略前导/尾随空格,并将多余的空格,制表符和换行符转换为单个空格。当Selenium从页面中读取文本时,它将尝试重复此行为,因此您可以忽略HTML中的所有选项卡和换行符,并根据呈现时文本在浏览器中的外观进行断言。为此,我们将所有不可见的空格(包括不间断空格“ ”)替换为一个空格。所有可见的换行符(<br>,<p>和<pre>格式化的新行)都应保留。 我们对HTML Selenese测试用例表的文本使用相同的规范化逻辑。这具有许多优点。首先,您无需查看页面的HTML源代码即可确定您的断言应该是什么;“ ”符号对于最终用户是不可见的,因此您在编写Selenese测试时不必担心它们。(您不需要 在测试用例中放置标记,以将assertText包含在包含“ ” 的字段上。)您还可以在Selenese <td>标记中添加额外的换行符和空格 ;因为我们在测试用例上使用与在文本上相同的规范化逻辑,所以我们可以确保断言和提取的文本将完全匹配。 在极少数情况下,当您确实希望/需要在测试用例中插入额外的空格时,这会带来一些问题。例如,您可能需要在如下字段中输入文本:“ foo ”。但是,如果您只是<td>foo </td>在Selenese测试用例中编写代码,我们将仅用一个空格替换您的多余空格。 此问题有一个简单的解决方法。我们用Selenese定义了一个变量 ${space},其值是一个空格。您可以使用${space}插入不会自动修剪的空间,如下所示: <td>foo${space}${space}${space}</td>。我们还包含了一个变量${nbsp},您可以使用该变量 插入一个不间断的空格。 请注意,XPath 不会 像我们那样规范空格。如果您需要编写类似XPath的代码, //div[text()="hello world"]但链接的HTML确实是“ hello world”,则需要 在Selenese测试用例中插入一个真实的“ ”以使其匹配,例如: //div[text()="hello${nbsp}world"]。
HTML会自动规范元素内的空格,而忽略前导/尾随空格,并将多余的空格,制表符和换行符转换为单个空格。当Selenium从页面中读取文本时,它将尝试重复此行为,因此您可以忽略HTML中的所有选项卡和换行符,并根据呈现时文本在浏览器中的外观进行断言。为此,我们将所有不可见的空格(包括不间断空格“ ”)替换为一个空格。所有可见的换行符(<br>,<p>和<pre>格式化的新行)都应保留。
<br>
<p>
<pre>
我们对HTML Selenese测试用例表的文本使用相同的规范化逻辑。这具有许多优点。首先,您无需查看页面的HTML源代码即可确定您的断言应该是什么;“ ”符号对于最终用户是不可见的,因此您在编写Selenese测试时不必担心它们。(您不需要 在测试用例中放置标记,以将assertText包含在包含“ ” 的字段上。)您还可以在Selenese <td>标记中添加额外的换行符和空格 ;因为我们在测试用例上使用与在文本上相同的规范化逻辑,所以我们可以确保断言和提取的文本将完全匹配。
<td>
在极少数情况下,当您确实希望/需要在测试用例中插入额外的空格时,这会带来一些问题。例如,您可能需要在如下字段中输入文本:“ foo ”。但是,如果您只是<td>foo </td>在Selenese测试用例中编写代码,我们将仅用一个空格替换您的多余空格。
foo
<td>foo </td>
此问题有一个简单的解决方法。我们用Selenese定义了一个变量 ${space},其值是一个空格。您可以使用${space}插入不会自动修剪的空间,如下所示: <td>foo${space}${space}${space}</td>。我们还包含了一个变量${nbsp},您可以使用该变量 插入一个不间断的空格。
${space}
<td>foo${space}${space}${space}</td>
${nbsp}
请注意,XPath 不会 像我们那样规范空格。如果您需要编写类似XPath的代码, //div[text()="hello world"]但链接的HTML确实是“ hello world”,则需要 在Selenese测试用例中插入一个真实的“ ”以使其匹配,例如: //div[text()="hello${nbsp}world"]。
//div[text()="hello world"]
hello world
//div[text()="hello${nbsp}world"]