有没有一种在两个元素之间选择元素的 Gebish 方法?
Is there a Gebish way of selecting elements between two elements?
我正在尝试编写一个 Geb 模块,它获取两个元素之间的所有 div 元素,但看不到这样做的好方法。
我可能会做一些 groovy 列表操作或迭代方法,但我想我会先检查一下我是否缺少 Gebish 方式。
html的大致结构是这样的
<div id="theParent">
<div class="v-gridlayout-slot">
<div id="sectionHeader">Header 1</div>
</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">
<div id="anotherSectionHeader">Header 2</div>
</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">
<div id="yetAnotherSectionHeader">Header 3</div>
</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">
<div id="actionButton"></div>
</div>
我的模块的内容部分看起来像
static content = {
headerOne { $("#sectionHeader")}
headerTwo { $("#anotherSectionHeader")}
headerThree { $("#yetAnotherSectionHeader")}
...
}
我希望有一种 Gebish 方式来收集 headerOne 和 headerTwo 之间的所有 $("div.v-gridlayout-slot")
但看不到任何合适的东西。
erdi的解决方案:
Navigator getElementsBetween(def fromElement, def toElement) {
String nextId = toElement.attr('id')
def betweenElements = fromElement.parent().nextAll("div.v-gridlayout-slot").takeWhile {
!it.has(id: nextId)
}
$(*betweenElements)
}
准确地说,根据您发布的 html 结构,您不是在寻找 headerOne
和 headerTwo
之间的 $("div.v-gridlayout-slot")
,而是在headerOne
和 headerTwo
。我会这样写:
def nextHeaderId = headerTwo.attr('id')
def betweenHeaders = headerOne.parent.nextAll("div.v-gridlayout-slot").takeWhile { it.hasNot(id: nextHeaderId) }
betweenHeaders
最终将成为 Collection<Navigator>
(因为使用了 until
,这是 Iterable
上的默认 Groovy 方法 Navigator
是 Iterable<Navigator>
而不是 Navigator
上的方法)所以如果你需要把它变成一个导航器你必须调用 sum()
它:
betweenHeaders.sum()
或传播并传递给$()
:
$(*betweenHeaders)
我正在尝试编写一个 Geb 模块,它获取两个元素之间的所有 div 元素,但看不到这样做的好方法。
我可能会做一些 groovy 列表操作或迭代方法,但我想我会先检查一下我是否缺少 Gebish 方式。
html的大致结构是这样的
<div id="theParent">
<div class="v-gridlayout-slot">
<div id="sectionHeader">Header 1</div>
</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">
<div id="anotherSectionHeader">Header 2</div>
</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">
<div id="yetAnotherSectionHeader">Header 3</div>
</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">...</div>
<div class="v-gridlayout-slot">
<div id="actionButton"></div>
</div>
我的模块的内容部分看起来像
static content = {
headerOne { $("#sectionHeader")}
headerTwo { $("#anotherSectionHeader")}
headerThree { $("#yetAnotherSectionHeader")}
...
}
我希望有一种 Gebish 方式来收集 headerOne 和 headerTwo 之间的所有 $("div.v-gridlayout-slot")
但看不到任何合适的东西。
erdi的解决方案:
Navigator getElementsBetween(def fromElement, def toElement) {
String nextId = toElement.attr('id')
def betweenElements = fromElement.parent().nextAll("div.v-gridlayout-slot").takeWhile {
!it.has(id: nextId)
}
$(*betweenElements)
}
准确地说,根据您发布的 html 结构,您不是在寻找 headerOne
和 headerTwo
之间的 $("div.v-gridlayout-slot")
,而是在headerOne
和 headerTwo
。我会这样写:
def nextHeaderId = headerTwo.attr('id')
def betweenHeaders = headerOne.parent.nextAll("div.v-gridlayout-slot").takeWhile { it.hasNot(id: nextHeaderId) }
betweenHeaders
最终将成为 Collection<Navigator>
(因为使用了 until
,这是 Iterable
上的默认 Groovy 方法 Navigator
是 Iterable<Navigator>
而不是 Navigator
上的方法)所以如果你需要把它变成一个导航器你必须调用 sum()
它:
betweenHeaders.sum()
或传播并传递给$()
:
$(*betweenHeaders)