如何使用XPath通过CSS类查找元素?


296

在我的网页中,有div一个class名为的Test

我如何找到它XPath



可以在文档XPath,CSS,DOM和Selenium:The Rosetta Stone中找到与XPath,CSS,DOM和Selenium解决方案相关的更一般的信息。具体来说,您的答案可以在ID和名称项中找到。
Terence Xie

Answers:


472

该选择器应该可以工作,但是如果您用合适的标记替换它,效率会更高:

//*[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 ')]

请注意,在所有这些版本中,*最好用您实际上希望匹配的任何元素名称代替,除非您希望在文档中搜索给定条件的每个元素。


37
@meder:更像//div[contains(concat(' ', @class, ' '), ' Test ')]-您的也会出现部分比赛。
Tomalak

5
您为什么不做// div [@ class ='Test']
杰西卡(Jessica),

11
因为类可以包含多个值
所以请关注omuraliev

8
令我惊讶的是,xpath没有快捷方式/更有效的方法来在以空格分隔的令牌列表中定位令牌。xpath更高版本中的任何内容?
thomasrutter

1
@thomasrutter为什么会感到惊讶-这只是XML的一种语言,而不是更具体的HTML,并且谁说使用空格分隔的列表作为XML中的任何节点值都是偶然的。Tomalak的解决方案是一种非常可行的解决方案。
bitoolean

152

最简单的方法

//div[@class="Test"]

假设您要<div class="Test">按照描述查找。


3
上面的语法更易于使用,并且不易出错。请记住,您需要在课程周围有双引号进行搜索。我建议使用上面列出的。// div [@ class =“ Test”]
FlyingV

这对于div [class ='Test']位于更深层次的情况有用吗?
Jake0x32 '16

1
@ Jake0x32,这是因为它使用了//不只是/
所罗门·乌科2016年

7
它也匹配<div class =“ Test some-other-class”>吗?
Jugal Thakkar,2016年

11
@JugalThakkar不,不是。它需要完全匹配才能起作用,但是您可以尝试// div [contains(@class,“ Test”)]]。
Olli Puljula '16

29

使用XPath 的唯一正确方法是:

//div[contains(concat(" ", normalize-space(@class), " "), " Test ")]

该函数将normalize-space去除前导和尾随空格,并且还将空格字符序列替换为一个空格。


注意

如果不需要许多这些Xpath查询,则可能需要使用一个将CSS选择器转换为XPath的库,因为CSS选择器通常比XPath查询更容易读写。例如,在这种情况下,您可以同时使用div[class~="Test"]div.Test获得相同的结果。

我已经找到了一些库:


24

我只是提供此为答案,因为Tomalak很久以前就作为对meder答案的评论

//div[contains(concat(' ', @class, ' '), ' Test ')]

3
抱歉,很早以前就提出了,但是concat(' ', normalize-space(@class), ' ')还要考虑各种空白字符吗?
特里(Terry)

出于好奇-为什么//div[contains(concat(' ', @class, ' '), ' Test ')]/chid不选择孩子?
Fusion

@Fusion如果将其发布为问题,则可能会得到答案。
bitoolean

@bitoolean成为船长Cbvious的日子很难过
Fusion

@融合我只是想帮助。XPath不是支持HTML的语言。它更通用,仅XML。我没有任何经验,但是我认为您假设您可以只输入id而不是标签。您需要选择“ id”属性的值。因此,您需要将HTML文档视为XML。但是,场外讨论并不能帮助人们找到解决方案。
bitoolean

1

可以从以前的答案中得出有用的功能:

function matchClass($className) {
    return "[contains(concat(' ', normalize-space(@class), ' '), ' $className ')]";
}

然后只需将函数调用连接到查询中即可。


该代码仅适用于PHP。您可能已经提到过。
bitoolean

0

匹配具有空格的类。

<div class="hello "></div>
//div[normalize-space(@class)="hello"]

-6

您可以找到类似此示例的元素(所有CSS元素)

private By 
allElementsCss = By.xpath(".//div[@class]");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.