首页 文章

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

提问于
浏览
388

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

<div class="atag btag" />

这是我的xpath表达式:

//*[@class='atag']

表达式适用于

<div class="atag" />

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

9 回答

  • 284

    您可以尝试以下方法

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

  • 34

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

  • 25

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

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

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

  • 6

    一个有效的2.0 XPath:

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

    或者使用变量:

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

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

    通常的方法是相当笨拙:

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

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

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

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

  • 4

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

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

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

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

    这将匹配 atag 而不是 matag .

  • 20

    对于包含公共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();
    }
    
  • 0

    无论属性的位置如何,都将选择它们

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

    EDIT :请参阅bobince的解决方案,该解决方案使用包含而不是启动,以及确保在完整令牌级别完成比较的技巧(以避免将'atag'模式作为另一个'tag'的一部分找到) .

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

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

相关问题