在我的网页中,有一个名为div
的{{1}} class
。
如何使用Test
找到它?
答案 0 :(得分:386)
此选择器应该可以工作,但如果用适当的标记替换它会更有效:
//*[contains(@class, 'Test')]
或者,因为我们知道所搜索的元素是div
:
//div[contains(@class, 'Test')]
但由于这也会匹配class="Testvalue"
或class="newTest"
等案例,因此评论中提供的@ Tomalak版本更好:
//div[contains(concat(' ', @class, ' '), ' Test ')]
如果您希望确定它能正确匹配,您还可以使用normalize-space函数清除类名周围的杂散空白字符(如@Terry所述):
//div[contains(concat(' ', normalize-space(@class), ' '), ' Test ')]
请注意,在所有这些版本中,*最好用您实际希望匹配的任何元素名称替换,除非您希望在给定条件的文档中搜索每个元素。
答案 1 :(得分:124)
最简单的方式..
//div[@class="Test"]
假设您想要按照描述找到<div class="Test">
。
答案 2 :(得分:23)
我只是提供这个作为答案,正如Tomalak在很久以前作为对meder的答案的评论而提供的
//div[contains(concat(' ', @class, ' '), ' Test ')]
答案 3 :(得分:17)
使用XPath执行此操作的 ONLY 正确方法:
//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]
函数normalize-space
剥离前导和尾随空格,并用单个空格替换空白字符序列。
如果不需要许多这些Xpath查询,您可能希望使用将CSS选择器转换为XPath的库,因为CSS选择器通常比XPath查询更容易读写。例如,在这种情况下,您可以使用div[class~="foo"]
和div.foo
来获得相同的结果。
我能找到的一些图书馆:
答案 4 :(得分:1)
以前的答案可以提供有用的功能:
function matchClass($className) {
return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}
然后将函数调用连接到查询中。
答案 5 :(得分:1)
XPath具有容器令牌功能,specifically designed用于这种情况:
//div[contains-token(@class, 'Test')]
只有最新版本的XPath(3.1)支持它,因此您需要最新的实现。
答案 6 :(得分:0)
与具有空格的一个类匹配。
<div class="hello "></div>
//div[normalize-space(@class)="hello"]
答案 7 :(得分:0)
从 XPath 2.0 开始,您可以使用标记化函数:
//div[tokenize(@class,'\s+')='Test']
在这里,它将对空白进行标记,然后将结果字符串与 'Test' 进行比较。
它是 XPath 3.1 函数 contains-token() 的替代方案
但目前 (2021-04-30) 没有浏览器支持 XPath 2.0 或更高版本。
答案 8 :(得分:-6)
你可以找到像这个例子的元素(所有的css元素)
private By
allElementsCss = By.xpath(".//div[@class]");