Есть ли простой способ выбора элементов между двумя элементами?

#geb

#geb

Вопрос:

Я пытаюсь написать модуль Geb, который получает все элементы div между двумя элементами, и не вижу хорошего способа сделать это.

Вероятно, я могу выполнить какую-то манипуляцию со списком groovy или итеративный метод, но подумал, что сначала проверю, не упускаю ли я простой способ.

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")}
    ...
}
  

Я надеялся, что есть простой способ собрать все $("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:

Если быть точным, в соответствии со структурой 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 в конечном итоге будет a Collection<Navigator> (из-за использования until которого по умолчанию используется метод Groovy Iterable с Navigator being Iterable<Navigator> , а не метод on Navigator ), поэтому, если вам нужно превратить его в навигатор, вам придется вызвать sum() его:

 betweenHeaders.sum()
  

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

 $(*betweenHeaders)
  

Комментарии:

1. Спасибо за этот erdi. Я не мог заставить его работать именно так. Кажется, нет метода until? Однако я заставил его работать, используя это. betweenHeaders = fromHeader.parent().nextAll(«div.v-gridlayout-слот»).takeWhile { !it.has(id: nextHeaderId)} Спасибо, что наставили меня на правильный путь.

2. Да, извините, я виноват. Вы правильно поняли, что я хотел использовать takeWhile() , а не until() то, что я, похоже, просто придумал… Я обновлю ответ.