如何匹配包含特定字符串的属性?

时间:2009-09-07 18:47:16

标签: xpath

当属性包含多个单词时,我在按属性选择节点时遇到问题。例如:

<div class="atag btag" />

这是我的xpath表达式:

//*[@class='atag']

表达式适用于

<div class="atag" />

但不是前一个例子。如何选择<div>

10 个答案:

答案 0 :(得分:457)

无论属性的位置如何,都会选择所有这些

//div[contains(@class, 'atag') and contains(@class ,'btag')]

答案 1 :(得分:293)

mjv的答案是一个好的开始,但如果atag不是列出的第一个类名,则会失败。

通常的方法是相当笨拙:

//*[contains(concat(' ', @class, ' '), ' atag ')]

只要类只用空格分隔,而不是其他形式的空格,这就可以工作。几乎总是如此。如果它可能不是,你必须让它变得更加笨拙:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

(通过类名称的空格分隔字符串进行选择是一种常见的情况,令人惊讶的是它没有特定的XPath函数,比如CSS3的'[class~ =“atag”]'。)

答案 2 :(得分:36)

编辑:请参阅bobince的解决方案,该解决方案使用包含而不是启动,以及确保比较在完整令牌的级别(以免'atag'模式被发现为另一个'标签'的一部分)。

“atag btag”是类属性的奇数值,但从不如此,请尝试:

//*[starts-with(@class,"atag")]

答案 3 :(得分:30)

试试这个://*[contains(@class, 'atag')]

答案 4 :(得分:28)

有效的2.0 XPath:

//*[tokenize(@class,'\s+')='atag']

或使用变量:

//*[tokenize(@class,'\s+')=$classname]

答案 5 :(得分:20)

请注意,如果您认为您感兴趣的类名不是另一个可能的类名的子字符串,那么bobince的答案可能会过于复杂。如果是这样,您可以通过contains函数简单地使用子字符串匹配。以下内容将匹配其类包含子字符串'atag'的任何元素:

//*[contains(@class,'atag')]

如果上述假设不成立,则子字符串匹配将匹配您不想要的元素。在这种情况下,您必须找到单词边界。通过使用空格分隔符来查找类名边界,bobince的第二个答案找到完全匹配:

//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]

这将匹配atag而不是matag

答案 6 :(得分:7)

添加到bobince的答案...... 如果您使用的任何工具/库使用Xpath 2.0,您也可以这样做:

//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
显然需要

count()因为index-of()返回它在字符串中匹配的每个索引的序列。

答案 7 :(得分:4)

您可以尝试以下

By.CssSelector("div.atag.btag")

答案 8 :(得分:0)

对于包含公共URL的链接,必须在变量中进行控制。然后按顺序尝试。

webelements allLinks=driver.findelements(By.xpath("//a[contains(@href,'http://122.11.38.214/dl/appdl/application/apk')]"));
int linkCount=allLinks.length();
for(int i=0; <linkCount;i++)
{
    driver.findelement(allLinks[i]).click();
}

答案 9 :(得分:0)

我来这里是为Ranorex Studio 9.0.1寻找解决方案。尚无contains()。相反,我们可以使用如下正则表达式:

div[@class~'atag']