【发布时间】:2010-12-08 22:26:50
【问题描述】:
在我的网页中,有一个div 和一个名为class 的Test。
如何使用XPath 找到它?
【问题讨论】:
-
更通用的 XPath、CSS、DOM 和 Selenium 解决方案可以在文档XPath, CSS, DOM and Selenium: The Rosetta Stone 中找到。具体来说,您的答案可以在 Id & Name 项中找到。
在我的网页中,有一个div 和一个名为class 的Test。
如何使用XPath 找到它?
【问题讨论】:
这个选择器应该可以工作,但如果你用适合的标记替换它会更有效:
//*[contains(@class, 'Test')]
或者,因为我们知道寻找的元素是div:
//div[contains(@class, 'Test')]
但由于这也将匹配class="Testvalue" 或class="newTest" 之类的情况,因此 cmets 中提供的@Tomalak 版本更好:
//div[contains(concat(' ', @class, ' '), ' Test ')]
如果你真的想确定它会正确匹配,你还可以使用 normalize-space 函数来清除类名周围的杂散空白字符(如@Terry 所述):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
请注意,在所有这些版本中,最好将 * 替换为您实际希望匹配的任何元素名称,除非您希望在文档中搜索给定条件的每个元素。
【讨论】:
//div[contains(concat(' ', @class, ' '), ' Test ')] - 你的也会出现部分匹配。
最简单的方法..
//div[@class="Test"]
假设您想按照描述找到<div class="Test">。
【讨论】:
// 而不仅仅是/。
唯一使用 XPath 的正确方法:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
函数normalize-space 去除前导和尾随空格,并将空白字符序列替换为单个空格。
如果不需要很多这样的 Xpath 查询,您可能希望使用将 CSS 选择器转换为 XPath 的库,因为 CSS 选择器通常比 XPath 查询更容易读写。例如,在这种情况下,您可以使用选择器 div.Test 来获得完全相同的结果。
我已经找到了一些库:
【讨论】:
//div[@class[contains(.,'Test')]] 怎么样?
我只是提供这个作为答案,就像 Tomalak 很久以前作为对 meder 答案的评论提供的那样
//div[contains(concat(' ', @class, ' '), ' Test ')]
【讨论】:
concat(' ', normalize-space(@class), ' ') 也考虑到各种空白字符呢?
//div[contains(concat(' ', @class, ' '), ' Test ')]/chid 不选择儿童?
XPath 有一个 contains-token 函数,specifically designed 用于这种情况:
//div[contains-token(@class, 'Test')]
它仅在最新版本的 XPath (3.1) 中受支持,因此您需要最新的实现。
【讨论】:
匹配一个有空格的类。
<div class="hello "></div>
//div[normalize-space(@class)="hello"]
【讨论】:
从 XPath 2.0 开始,您可以使用一个标记化功能:
//div[tokenize(@class,'\s+')='Test']
这里它将对空白进行标记,然后将生成的字符串与“测试”进行比较。
它是 XPath 3.1 函数 contains-token() 的替代方案
但是目前(2021-04-30)没有浏览器支持 XPath 2.0 或更高版本。
【讨论】:
//div[@class[contains(.,'Test')]]
这是我在当前项目中使用的,它运行流畅。
表达式中的点. 表示任何div 元素的class 属性的值。所以你不需要使用normalize-space 和concat。请注意,这也可能会选择类名为 XXXTestXXX 的 div。我碰巧有我的可搜索类为infobox-header,而该页面没有像XXinfobox-headerXXXX 这样的东西。
【讨论】: