我使用 XPather Browser在 HTML 页面上检查我的 XPATH 表达式。
我的最终目标是在 Selenium 中使用这些表达式来测试我的用户界面。
我得到了一个 HTML 文件,其内容与此类似:
<tr> <td>abc</td> <td> </td> </tr>
我想选择一个节点,其文本包含字符串“
”。
使用像“abc”这样的普通字符串是没有问题的。我使用类似于 //td[text()="abc"]
的 XPATH。
当我尝试使用像 //td[text()=" "]
这样的 XPATH 时,它什么都不返回。是否有关于带有“&
”的文本的特殊规则?
最佳答案
似乎OpenQA ,Selenium 背后的人,已经解决了这个问题。他们定义了一些变量来明确匹配空格。就我而言,我需要使用类似于 //td[text()="${nbsp}"]
的 XPATH .
我在这里转载了 OpenQA 关于这个问题的文本(找到 here ):
HTML automatically normalizes whitespace within elements, ignoring leading/trailing spaces and converting extra spaces, tabs and newlines into a single space. When Selenium reads text out of the page, it attempts to duplicate this behavior, so you can ignore all the tabs and newlines in your HTML and do assertions based on how the text looks in the browser when rendered. We do this by replacing all non-visible whitespace (including the non-breaking space "
") with a single space. All visible newlines (<br>
,<p>
, and<pre>
formatted new lines) should be preserved.We use the same normalization logic on the text of HTML Selenese test case tables. This has a number of advantages. First, you don't need to look at the HTML source of the page to figure out what your assertions should be; "
" symbols are invisible to the end user, and so you shouldn't have to worry about them when writing Selenese tests. (You don't need to put "
" markers in your test case to assertText on a field that contains "
".) You may also put extra newlines and spaces in your Selenese<td>
tags; since we use the same normalization logic on the test case as we do on the text, we can ensure that assertions and the extracted text will match exactly.This creates a bit of a problem on those rare occasions when you really want/need to insert extra whitespace in your test case. For example, you may need to type text in a field like this: "
foo
". But if you simply write<td>foo </td>
in your Selenese test case, we'll replace your extra spaces with just one space.This problem has a simple workaround. We've defined a variable in Selenese,
${space}
, whose value is a single space. You can use${space}
to insert a space that won't be automatically trimmed, like this:<td>foo${space}${space}${space}</td>
. We've also included a variable${nbsp}
, that you can use to insert a non-breaking space.Note that XPaths do not normalize whitespace the way we do. If you need to write an XPath like
//div[text()="hello world"]
but the HTML of the link is really "hello world
", you'll need to insert a real "
" into your Selenese test case to get it to match, like this://div[text()="hello${nbsp}world"]
.
关于xml - 使用 XPATH 搜索包含的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/247135/