Ber*_*roy 114 xml search selenium xpath
我使用XPather Browser在HTML页面上检查我的XPATH表达式.
我的最终目标是在Selenium中使用这些表达式来测试我的用户界面.
我有一个HTML文件,其内容与此类似:
<tr> <td>abc</td> <td> </td> </tr>
我想选择一个包含字符串" " 的文本的节点.
使用像"abc"这样的普通字符串是没有问题的.我使用类似的XPATH //td[text()="abc"].
当我尝试使用XPATH时,//td[text()=" "]它什么都不返回.是否有关于" &"的文本的特殊规则?
Ber*_*roy 88
似乎OpenQA,Selenium背后的人,已经解决了这个问题.他们定义了一些变量来明确地匹配空格.在我的情况下,我需要使用类似的XPATH //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"].
Phi*_*Lho 24
当我通过在两个引号之间的Windows上键入Alt + 0160来输入硬编码的非破坏空间(U + 00A0)时,我发现我可以进行匹配...
//table[@id='TableID']//td[text()=' ']
Run Code Online (Sandbox Code Playgroud)
为我工作的特殊字符.
根据我的理解,XPath 1.0标准不处理转义Unicode字符.在XPath 2.0中似乎有相应的功能,但看起来Firefox不支持它(或者我误解了一些东西).所以你必须使用本地代码页.丑陋,我知道.
实际上,看起来标准依赖于编程语言使用XPath来提供正确的Unicode转义序列......所以,不知何故,我做了正确的事情.
根据您提供的 HTML:
<tr>
<td>abc</td>
<td> </td>
</tr>
Run Code Online (Sandbox Code Playgroud)
要使用字符串定位节点, 您可以使用以下任一基于xpath的解决方案:
使用text():
"//td[text()='\u00A0']"
Run Code Online (Sandbox Code Playgroud)使用contains():
"//td[contains(., '\u00A0')]"
Run Code Online (Sandbox Code Playgroud)但是,理想情况下,您可能希望避免使用NO-BREAK SPACE字符并使用以下任一定位器策略:
使用父<tr>节点 和following-sibling:
"//tr//following-sibling::td[2]"
Run Code Online (Sandbox Code Playgroud)使用starts-with():
"//tr//td[last()]"
Run Code Online (Sandbox Code Playgroud)使用前一个<td>节点和followingnode and后一个兄弟节点:
"//td[text()='abc']//following::td[1]"
Run Code Online (Sandbox Code Playgroud)您可以在以下位置找到相关的详细讨论:
Unicode 字符 'NO-BREAK SPACE' (U+00A0)
尝试使用十进制实体 而不是命名实体。如果这不起作用,您应该能够简单地使用unicode 字符作为不间断空格而不是 实体。
(注意:我没有在 XPather 中尝试过,但我在 Oxygen 中尝试过。)