#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()
то, что я, похоже, просто придумал… Я обновлю ответ.