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



xpath实例 (6)

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

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

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

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

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

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

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

<div class="atag btag" />

这是我的xpath表达式:

//*[@class='atag']

表达式适用于

<div class="atag" />

但不适用于前面的示例。 我如何选择<div>


Answer #1

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

“atag btag”对于class属性来说是一个奇数值,但从来就不是那么少,试试:

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

Answer #2

对于包含通用网址的链接,必须在变量中进行控制。 然后依次尝试。

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();
}

Answer #3

工作的2.0 XPath:

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

或与一个变量:

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

Answer #4

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

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

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


Answer #5

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