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

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

<div class="atag btag" /> 

这是我的xpath表达式:

//*[@class='atag']

表达式与

<div class="atag" />

但不是前面的例子。 我怎样才能选择<div>

无论属性的位置如何,这将全部选中

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

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

通常的做法是相当笨拙的:

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

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

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

(通过类名称空间分隔的字符串来选择是一个很常见的情况,没有一个特定的XPath函数,比如CSS3的'[class_ =“atag”]')。

编辑 :看看bobince的解决方案,它使用包含而不是开始 ,与一个窍门,以确保比较完成在一个完整的标记级别(以免“标签”模式被发现作为另一个'标记'的一部分)。

“atag btag”对于class属性来说是一个奇怪的值,但从来就不是这样,尝试:

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

一个2.0 XPath的工作原理:

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

或者用一个变量:

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

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

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

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

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

这将匹配atag而不是matag

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

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

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

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

你可以尝试以下

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

对于包含通用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(); }