xml - 使用 XPATH 搜索包含的文本

标签 xml search xpath selenium

我使用 XPather Browser在 HTML 页面上检查我的 XPATH 表达式。

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

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

<tr>
  <td>abc</td>
  <td>&nbsp;</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 "&nbsp;") 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; "&nbsp;" 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 "&nbsp;" markers in your test case to assertText on a field that contains "&nbsp;".) 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&nbsp;world", you'll need to insert a real "&nbsp;" 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/

相关文章:

xml - 将 Google Finance 投资组合拉入 R

xml - Web Service检索和解析XML文件-如何处理错误?

xml - 如何使用 Node 从 URL 解析 XML

mysql - 使用 2 个表中的数据对列进行全文搜索

javascript - AngularJS 输入更改重置

python - python lxml 中的 XQuery 绝对路径

xml - 在 Hudson GUI 中显示 Fitnesse XML 报告

search - 如何在solr中搜索负数?

C# XPath 帮助 - 表达式不工作

html - 将 rvest::html_nodes() 与来自 SelectorGadget 或 Chrome 开发者工具的 CSS 标签一起使用总是返回空列表