有没有一种在两个元素之间选择元素的 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 结构,您不是在寻找 headerOneheaderTwo 之间的 $("div.v-gridlayout-slot"),而是在headerOneheaderTwo。我会这样写:

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 方法 NavigatorIterable<Navigator> 而不是 Navigator 上的方法)所以如果你需要把它变成一个导航器你必须调用 sum() 它:

betweenHeaders.sum()

或传播并传递给$():

$(*betweenHeaders)