嗨,我是Groovy的新手。
我想深入研究DOM结构并检索一组元素,并检查这些元素是否具有特定的属性。
下面是我用来检查属性的语句-
assert $("#myID > div > div > div > p > a > span").attr("class").contains("my-class")
$("#myID > div > div > div > p > a > span")
返回3个span元素,因此以上语句失败并引发错误-
geb.error.SingleElementNavigatorOnlyMethodException: Method getAttribute(java.lang.String) can only be called on single element navigators but it was called on a navigator with size 3. Please use the spread operator to call this method on all elements of this navigator or change the selector used to create this navigator to only match a single element.
如何遍历所有返回的跨度并检查它们是否都具有my-class
属性?
谢谢!
答案 0 :(得分:2)
因此,由于使用了Groovy,因此可以使用例如foreach来遍历元素:
def containsAttr = true
$("#myID > div > div > div > p > a > span").each { element ->
if (! element.attr("class").contains("my-class")) {
containsAttr = false
}
}
assert containsAttr == true
重要的是,您将$()-选择元素识别为一个集合。当您掌握常规知识时,您会发现甚至更常规的方法来遍历整个集合,但是我认为,each
循环现在最好地展示了它是如何完成的。
有关集合的更多详细信息,请参见http://docs.groovy-lang.org/next/html/documentation/working-with-collections.html。
PS:我提供的代码的一个缺点是,断言失败时,断言不会显示太多的行情信息。
答案 1 :(得分:1)
在jQuery中,要遍历元素集合,.each()
很有用。会是:
$("#myID > div > div > div > p > a > span").each(function(){
if($(this).hasClass("my-class")){
console.log("Found one!");
}
});
但是,我想您需要在Groovy中使用一根衬纸...所以,请尝试以下操作:
$("#myID").find(".my-class")
这将针对您要查找的元素。
请注意,.contains()
不能在class属性中查找类。因此,您可能会因为滥用而抛出错误。
免责声明:我对Groovy一无所知,所以我不确定您需要什么。
答案 2 :(得分:0)
您也可以进行检查,
assert $("#myID > div > div > div > p > a > span").length === $("#myID > div > div > div > p > a > span.my-class").length
类似地,如果属性选择器并非始终是类,则可以使用它。