我使用 XPather浏览器检查HTML页面上的XPATH表达式。

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

我收到了一个HTML文件,内容与此类似:

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

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

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

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

有帮助吗?

解决方案

似乎 OpenQA ,Selenium背后的人,已经解决了这个问题。他们定义了一些变量来明确地匹配空格。就我而言,我需要使用类似于 // td [text()=&quot; $ {nbsp}&quot;] 的XPATH。

我在这里转载了OpenQA关于这个问题的文本(找到此处):

  

HTML自动规范化   元素中的空格,忽略   前导/尾随空格和转换   额外的空格,制表符和换行符   单一空间。当Selenium读取文本时   在页面之外,它试图   复制此行为,所以你可以   忽略所有选项卡和换行符   你的HTML和基于的断言   文本在浏览器中的显示方式   渲染。我们通过替换所有来做到这一点   不可见的空白(包括   带有a的不间断空格“&amp; nbsp; ”   单一空间。所有可见的换行符   (&lt; br&gt; &lt; p&gt; &lt; pre&gt; 格式化   新线)应该保留。

     

我们使用相同的规范化逻辑   HTML Selenese测试用例的文本   表。这有很多   好处。首先,你不需要   查看页面的HTML源代码   弄清楚你的断言应该是什么   是; &QUOT; <代码>&安培; NBSP; &QUOT;符号是看不见的   到最终用户,所以你不应该   写作时不得不担心他们   Selenese测试。 (你不需要放   &QUOT; <代码>&安培; NBSP; &QUOT;测试用例中的标记   在包含的字段上assertText   &quot; &amp; nbsp; &quot ;.)您也可以额外付费   Selenese的换行符和空格   &lt; td&gt; 标记;因为我们使用相同的   测试用例的规范化逻辑   正如我们对文本所做的那样,我们可以确保   断言和提取的文本   将完全匹配。

     

这会产生一些问题   那些罕见的场合,你真的   想要/需要插入额外的空格   在你的测试用例中。例如,你   可能需要在字段中键入文本   这个:“ foo ”。但如果你只是   在你的网站上写下&lt; td&gt; foo&lt; / td&gt;   Selenese测试用例,我们将替换您的   只有一个空间的额外空间。

     

此问题有一个简单的解决方法。   我们在Selenese中定义了一个变量,    $ {space} ,其值为单个   空间。您可以使用 $ {space} 来   插入一个不会的空间   自动修剪,像这样:   <代码>&LT; TD&GT; foo的$ {空间} $ {空间} $ {空间}&LT; / TD&GT; 。   我们还包括一个变量    $ {nbsp} ,您可以使用它来插入   一个不间断的空间。

     

请注意,XPath 规范化   我们的方式就是空白。如果你需要   写一个类似的XPath    // div [text()=&quot; hello world&quot;] 但是   链接的HTML确实是   “ hello&amp; nbsp; world ”,你需要   插入真实的“&amp; nbsp; ”进入你的   Selenese测试案例让它匹配,   像这样:   <代码> // DIV [文本()=&QUOT;你好$ {NBSP}世界&QUOT]。

其他提示

我通过在两个引号之间在Windows上键入Alt + 0160来输入硬编码的非破坏空间(U + 00A0)时发现我可以进行匹配...

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

使用特殊字符为我工作。

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

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

尝试使用十进制实体&amp;#160; 而不是命名实体。如果这不起作用,您应该能够简单地使用 unicode不间断空格的字符,而不是&amp; nbsp; 实体。

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

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

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

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

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

但是,我必须使用以下内容将 nbsp 声明为XML和XSL中的实体:

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

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

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

搜索&amp; nbsp; 或仅搜索 nbsp - 你试过吗?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top