我在选取具有多个单词属性的节点时遇到了问题。例如:
<div class="atag btag" />
这是我的xpath表达式:
//*[@class='atag']
这个表达式可以匹配
<div class="atag" />
但无法匹配前面的例子。我该如何选择 <div>
元素?
我在选取具有多个单词属性的节点时遇到了问题。例如:
<div class="atag btag" />
这是我的xpath表达式:
//*[@class='atag']
这个表达式可以匹配
<div class="atag" />
但无法匹配前面的例子。我该如何选择 <div>
元素?
这里有一个示例,查找类名包含 atag
的 div 元素:
//div[contains(@class, 'atag')]
以下是一个示例,它查找类名包含 atag
和 btag
的 div 元素:
//div[contains(@class, 'atag') and contains(@class ,'btag')]
然而,它也会找到类似 class="catag bobtag"
的部分匹配。
如果您不想要部分匹配,请参见下面bobince的答案。
<div class="Patagonia Halbtagsarbeit">
,虽然包含目标字符串,但并不是具有给定类名的div元素。 - bobincemjv的回答是一个不错的开始,但如果atag不是第一个列出的类名,则会失败。
通常的做法是相当笨重的:
//*[contains(concat(' ', @class, ' '), ' atag ')]
只要类名之间仅由空格分隔,而不是其他形式的空白字符,这段代码就能正常工作。这几乎总是成立的。如果有可能不成立,你就需要让它变得更加复杂:
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
按类名类似于空格分隔的字符串进行选择是一个非常普遍的情况,令人惊讶的是XPath没有像CSS3的“[class〜=“atag”]”那样的特定函数。
//*[contains(@class, 'atag')]
grabatagonabag
会怎样?(提示:它仍然匹配。) - Wayne编辑: 查看bobince的解决方案,该方案使用contains而不是start-with,并使用一个技巧来确保比较在完整标记的级别上进行(以免“atag”模式被视为另一个“tag”的一部分)。
虽然 "atag btag" 对于类属性来说是奇怪的值,但仍然尝试:
//*[starts-with(@class,"atag")]
一个有效的 2.0 XPath:
//*[tokenize(@class,'\s+')='atag']
或者使用一个变量:
//*[tokenize(@class,'\s+')=$classname]
@class
有多个元素,这怎么能起作用呢?因为它将返回一个单词列表,将其与字符串进行比较会导致 错误的基数。 - Alexis Wilke//*[tokenize(@class)=$classname]
。 - Michael Kay//*[@class=$classname]
。 - Michael Kay请注意,如果你可以假定你感兴趣的类名不是另一个可能的类名的子字符串,那么bobince的答案可能过于复杂。 如果这是真的,你可以简单地使用包含函数进行子字符串匹配。 以下代码将匹配其类包含子字符串“atag”的任何元素:
//*[contains(@class,'atag')]
如果上面的假设不成立,子字符串匹配将会匹配到你不想要的元素。在这种情况下,你必须找到单词边界。通过使用空格分隔符来找到类名边界,bobince的第二个答案找到了精确的匹配:
//*[contains(concat(' ', normalize-space(@class), ' '), ' atag ')]
这将匹配atag
而不是matag
。
//*[count(index-of(tokenize(@class, '\s+' ), $classname)) = 1]
显然需要使用count()函数,因为index-of()函数返回字符串中匹配的每个索引的一个序列。
$classname
变量,因为它现在是一个字符串。 - Alexis Wilke'$classname'
之外,终于有一个正确的(兼容JavaScript)getElementsByClassName实现了。 - Joel MellonBy.CssSelector("div.atag.btag")
我来这里寻找 Ranorex Studio 9.0.1 的解决方案。目前还没有 contains() 方法,但我们可以使用正则表达式,例如:
div[@class~'atag']
对于包含常见 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();
}
div.atag
或div.btag
。非常简单,不需要字符串匹配,速度更快(并且在浏览器中得到更好的支持)。XPath(针对HTML)应该被归类为有用的内容... 通过包含的文本查找元素和进行DOM导航。 - JeffC