使用XPATHsearch包含 
我使用XPather Browser来检查我的XPATHexpression式在HTML页面上。
我的最终目标是在Selenium中使用这些expression式来testing我的用户界面。
我收到了一个类似于以下内容的HTML文件:
<TR> <TD> ABC </ TD> <TD>&NBSP; </ TD> </ TR>
我想select一个包含string“
”的文本的节点。
像“abc”这样的正常string没有问题。 我使用类似于//td[text()="abc"]
的XPATH。
当我尝试使用像//td[text()=" "]
的XPATH时,它不返回任何内容。 有关“ &
”的文字是否有特殊规定?
Selenium背后的OpenQA似乎已经解决了这个问题。 他们定义了一些variables来明确地匹配空格。 在我的情况下,我需要使用类似于//td[text()="${nbsp}"]
的XPATH。
我在这里转载了OpenQA关于这个问题的文本(在这里find):
HTML会自动标准化元素中的空白,忽略前导/尾随空格,并将多余的空格,制表符和换行符转换为单个空格。 当Selenium从页面中读取文本时,它会尝试复制此行为,因此您可以忽略HTML中的所有制表符和换行符,并根据文本在呈现时在浏览器中的显示方式进行断言。 我们通过用一个空格来replace所有不可见的空格(包括非空格“
”)。 所有可见的换行符(<br>
,<p>
和<pre>
格式化新行)都应该保留。我们在HTML Selenesetesting用例表的文本上使用相同的规范化逻辑。 这具有许多优点。 首先,你不需要查看页面的HTML源代码来找出你的断言应该是什么; “
”符号对最终用户是不可见的,因此在编写Selenesetesting时,您不必担心它们。 (您不需要在testing用例中放置“
”标记,以便在包含“
”的字段上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 world
”,你需要在你的Selenese中插入一个真正的“
”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转义序列…所以,不知何故,我做了正确的事情。
尝试使用十进制实体 
而不是命名的实体。 如果这不起作用,您应该能够简单地使用unicode字符来创build一个非破坏性的空间,而不是使用
实体。
(注意:我没有在XPather中尝试过,但是我在Oxygen中尝试过。)
我无法使用Xpather进行匹配,但下面的内容适用于Microsoft XML记事本中的纯XML和XSL文件:
<xsl:value-of select="count(//td[text()=' '])" />
返回的值是1,这是我testing用例中的正确值。
但是,我确实必须在我的XML和XSL中声明nbsp作为一个实体,使用以下命令:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
我不确定这是否对您有帮助,但是我能够使用XPathexpression式实际findnbsp 。
编辑:我的代码示例实际上包含字符'&nbsp;' 但JavaScript语法高亮将其转换为空格字符。 不要误导!
请记住,符合标准的XML处理器将用XPath时间内的目标编码中的相应字符replace除XML的五个标准( &
, >
, <
;,“expression式被评估。 鉴于这种行为,PhiLho和jsulak的build议是如果你想使用XML工具的路要走。 当你input 
在XPathexpression式中,应该在应用XPathexpression式之前将其转换为相应的字节序列。
search
或只有nbsp
– 你尝试过吗?