diff --git a/module/geb-core/src/main/groovy/geb/navigator/DefaultNavigator.groovy b/module/geb-core/src/main/groovy/geb/navigator/DefaultNavigator.groovy index 3862542d0..0461a5f23 100644 --- a/module/geb-core/src/main/groovy/geb/navigator/DefaultNavigator.groovy +++ b/module/geb-core/src/main/groovy/geb/navigator/DefaultNavigator.groovy @@ -715,12 +715,20 @@ class DefaultNavigator implements Navigator { @Override Navigator siblings(Map attributes) { - siblings().filter(attributes) + navigatorFor(dynamic(attributes)) { + collectSiblings { + it.findAll { matches(it, attributes) } + } + } } @Override Navigator siblings(Map attributes = [:], String selector) { - siblings().filter(attributes, selector) + navigatorFor(dynamic(attributes)) { + collectSiblings { + it.findAll { CssSelector.matches(it, selector) && matches(it, attributes) } + } + } } @Override @@ -1228,7 +1236,7 @@ class DefaultNavigator implements Navigator { collectRelativeElements("child::*", filter) } - protected Collection collectSiblings(Closure filter) { + protected Collection collectSiblings(@ClosureParams(value = FromString, options = "java.util.List") Closure filter) { collectElements { def elements = it.findElements(By.xpath("preceding-sibling::*")) + it.findElements(By.xpath("following-sibling::*")) filter ? filter(elements) : elements diff --git a/module/geb-core/src/test/groovy/geb/navigator/DynamicNavigatorSpec.groovy b/module/geb-core/src/test/groovy/geb/navigator/DynamicNavigatorSpec.groovy index 12cef5f0b..943803ad3 100644 --- a/module/geb-core/src/test/groovy/geb/navigator/DynamicNavigatorSpec.groovy +++ b/module/geb-core/src/test/groovy/geb/navigator/DynamicNavigatorSpec.groovy @@ -958,4 +958,46 @@ class DynamicNavigatorSpec extends GebSpecWithCallbackServer { dynamic.size() == 1 } + def "siblings attribute based dynamic navigator"() { + given: + bodyWithJquery { + div("div") + div("div") + div(class: "match", "div") + } + + and: + def secondDiv = $("div::nth-of-type(2)") + def nonDynamic = secondDiv.siblings(class: "match") + def dynamic = secondDiv.siblings(class: "match", dynamic: true) + + when: + secondDiv.jquery.before('
div
') + + then: + nonDynamic.size() == 1 + dynamic.size() == 2 + } + + def "siblings selector based dynamic navigator"() { + given: + bodyWithJquery { + div("div") + div("div") + div(class: "match", "div") + } + + and: + def secondDiv = $("div::nth-of-type(2)") + def nonDynamic = secondDiv.siblings(".match") + def dynamic = secondDiv.siblings(".match", dynamic: true) + + when: + secondDiv.jquery.before('
div
') + + then: + nonDynamic.size() == 1 + dynamic.size() == 2 + } + }