当属性包含多个单词时,我有一个按属性选择节点的问题。例如:
<div class="atag btag" />
这是我的xpath表达式:
/ / * [@class =’atag’]
这个表达式适用于
<div class=“atag” />
但对于前面的例子不是这样。我如何选择<div>?
当属性包含多个单词时,我有一个按属性选择节点的问题。例如:
<div class="atag btag" />
这是我的xpath表达式:
/ / * [@class =’atag’]
这个表达式适用于
<div class=“atag” />
但对于前面的例子不是这样。我如何选择<div>?
当前回答
再加上bobince的回答…… 如果您使用的工具/库使用Xpath 2.0,也可以这样做:
//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
Count()显然是必需的,因为index-of()返回字符串中与之匹配的每个索引的序列。
其他回答
工作的2.0 XPath:
//*[tokenize(@class,'\s+')='atag']
或者用一个变量:
//*[tokenize(@class,'\s+')=$classname]
再加上bobince的回答…… 如果您使用的工具/库使用Xpath 2.0,也可以这样做:
//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
Count()显然是必需的,因为index-of()返回字符串中与之匹配的每个索引的序列。
你可以试试下面的方法
By.CssSelector(“div.atag.btag”)
下面是一个找到className包含atag的div元素的例子:
//div[contains(@class, 'atag')]
下面是一个找到className包含atag和btag的div元素的例子:
//div[contains(@class, 'atag') and contains(@class ,'btag')]
然而,它也会找到部分匹配,如class="catag bobtag"。
如果你不想要部分匹配,请看下面bobince的答案。
请注意,如果您可以假设您感兴趣的类名不是另一个可能的类名的子字符串,bobince的答案可能会过于复杂。如果这是真的,您可以通过contains函数简单地使用子字符串匹配。下面将匹配任何类包含子字符串'atag'的元素:
//*[contains(@class,'atag')]
如果上面的假设不成立,子字符串匹配将匹配您不打算匹配的元素。在这种情况下,你必须找到单词边界。通过使用空格分隔符找到类名边界,bobince的第二个答案找到了精确的匹配:
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
这将匹配atag而不是matag。