使用XPATHsearch包含 

我使用XPather Browser来检查我的XPATHexpression式在HTML页面上。

我的最终目标是在Selenium中使用这些expression式来testing我的用户界面。

我收到了一个类似于以下内容的HTML文件:

 <TR>
   <TD> ABC </ TD>
   <TD>&NBSP; </ TD>
 </ TR>

我想select一个包含string“ &nbsp; ”的文本的节点。

像“abc”这样的正常string没有问题。 我使用类似于//td[text()="abc"]的XPATH。

当我尝试使用像//td[text()="&nbsp;"]的XPATH时,它不返回任何内容。 有关“ & ”的文字是否有特殊规定?

Selenium背后的OpenQA似乎已经解决了这个问题。 他们定义了一些variables来明确地匹配空格。 在我的情况下,我需要使用类似于//td[text()="${nbsp}"]的XPATH。

我在这里转载了OpenQA关于这个问题的文本(在这里find):

HTML会自动标准化元素中的空白,忽略前导/尾随空格,并将多余的空格,制表符和换行符转换为单个空格。 当Selenium从页面中读取文本时,它会尝试复制此行为,因此您可以忽略HTML中的所有制表符和换行符,并根据文本在呈现时在浏览器中的显示方式进行断言。 我们通过用一个空格来replace所有不可见的空格(包括非空格“ &nbsp; ”)。 所有可见的换行符( <br><p><pre>格式化新行)都应该保留。

我们在HTML Selenesetesting用例表的文本上使用相同的规范化逻辑。 这具有许多优点。 首先,你不需要查看页面的HTML源代码来找出你的断言应该是什么; “ &nbsp; ”符号对最终用户是不可见的,因此在编写Selenesetesting时,您不必担心它们。 (您不需要在testing用例中放置“ &nbsp; ”标记,以便在包含“ &nbsp; ”的字段上assertText)。您也可以在Selenese <td>标记中添加更多换行符和空格; 由于我们在testing用例上使用与文本相同的标准化逻辑,所以我们可以确保断言和提取的文本完全匹配。

当你真的想/需要在你的testing用例中插入额外的空白时,这在less数情况下会造成一些问题。 例如,您可能需要在如下字段中键入文本:“ foo ”。 但是,如果你只是在你的Selenesetesting用例中写了<td>foo </td> ,那么我们将只用一个空格来replace你的额外空间。

这个问题有一个简单的解决方法。 我们在Selenese中定义了一个variables${space} ,它的值是一个单独的空间。 您可以使用${space}插入一个不会自动修剪的空格,如下所示: <td>foo${space}${space}${space}</td> 。 我们还包含一个variables${nbsp} ,您可以使用它来插入一个不间断的空格。

请注意,XPath 不像我们所做的那样规范化空白。 如果你需要写一个类似于//div[text()="hello world"]的XPath,但是链接的HTML真的是“ hello&nbsp;world ”,你需要在你的Selenese中插入一个真正的“ &nbsp; ”testing用例,使其匹配,如下所示: //div[text()="hello${nbsp}world"]

我发现我可以通过在两个引号之间的Windows上inputAlt + 0160来input一个硬编码的非分离空间(U + 00A0)时匹配…

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

为我工作的特殊字符。

据我所知,XPath 1.0标准不处理转义的Unicode字符。 在XPath 2.0中似乎有这样的function,但它看起来像Firefox不支持它(或者我误解了一些东西)。 所以你必须做本地代码页。 丑,我知道。

实际上,它看起来像标准是依靠使用XPath编程语言来提供正确的Unicode转义序列…所以,不知何故,我做了正确的事情。

尝试使用十进制实体&#160; 而不是命名的实体。 如果这不起作用,您应该能够简单地使用unicode字符来创build一个非破坏性的空间,而不是使用&nbsp; 实体。

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

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

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

返回的值是1,这是我testing用例中的正确值。

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

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

我不确定这是否对您有帮助,但是我能够使用XPathexpression式实际findnbsp

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

请记住,符合标准的XML处理器将用XPath时间内的目标编码中的相应字符replace除XML的五个标准( &amp;&gt;&lt; ;,“expression式被评估。 鉴于这种行为,PhiLho和jsulak的build议是如果你想使用XML工具的路要走。 当你input&#160; 在XPathexpression式中,应该在应用XPathexpression式之前将其转换为相应的字节序列。

search&nbsp; 或只有nbsp – 你尝试过吗?