Есть ли в Gebish способ выбора элементов между двумя элементами? - PullRequest
1 голос
/ 12 апреля 2019

Я пытаюсь написать модуль 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 способ собрать все $("div.v-gridlayout-slot"), которые находятся между headerOne и headerTwo, но не могут видеть ничего подходящего.

Решение от 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)
    }

1 Ответ

2 голосов
/ 12 апреля 2019

Если быть точным, в соответствии с HTML-структурой, которую вы разместили, вы не ищете $("div.v-gridlayout-slot"), которые находятся между headerOne и headerTwo, но находятся между частями 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, который является методом Groovy по умолчанию в Iterable с Navigatorбудучи Iterable<Navigator>, а не методом на Navigator), поэтому, если вам нужно превратить его в навигатор, вам придется вызвать на нем sum():

betweenHeaders.sum()

или распространить и передать егодо $():

$(*betweenHeaders)
...