This is an automated email from the ASF dual-hosted git repository.
jonnybot pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy-geb.git
The following commit(s) were added to refs/heads/master by this push:
new 3d8f217d Support Navigator as JS execution argument
3d8f217d is described below
commit 3d8f217d0158aae715bdf8ff9dc5839ab5e8c0fa
Author: Björn Kautler <[email protected]>
AuthorDate: Mon May 26 02:15:58 2025 +0200
Support Navigator as JS execution argument
---
doc/manual/src/docs/asciidoc/080-javascript.adoc | 3 +-
.../main/groovy/geb/js/JavascriptInterface.groovy | 23 +++++++++++--
.../test/groovy/geb/JavascriptInterfaceSpec.groovy | 38 ++++++++++++++++++++++
3 files changed, 61 insertions(+), 3 deletions(-)
diff --git a/doc/manual/src/docs/asciidoc/080-javascript.adoc
b/doc/manual/src/docs/asciidoc/080-javascript.adoc
index dc32a0f5..d8c850dd 100644
--- a/doc/manual/src/docs/asciidoc/080-javascript.adoc
+++ b/doc/manual/src/docs/asciidoc/080-javascript.adoc
@@ -106,7 +106,8 @@
include::{snippets-dir}/javascript/CallingMethodsSpec.groovy[tag=nested_methods,
=== Executing arbitrary code
The `js` object also has an `exec()` method that can be used to run snippets
of JavaScript.
-It is identical to the `{javascript-executor-execute-script-api}` method,
except that it expects the code as last argument...
+It is identical to the `{javascript-executor-execute-script-api}` method,
except that it expects the code as last argument,
+and accepts `Navigator` instances in addition to `WebElement`s...
[source,groovy]
----
diff --git a/module/geb-core/src/main/groovy/geb/js/JavascriptInterface.groovy
b/module/geb-core/src/main/groovy/geb/js/JavascriptInterface.groovy
index afcee048..66636d0b 100644
--- a/module/geb-core/src/main/groovy/geb/js/JavascriptInterface.groovy
+++ b/module/geb-core/src/main/groovy/geb/js/JavascriptInterface.groovy
@@ -20,6 +20,7 @@ package geb.js
import geb.Browser
import geb.error.GebException
+import geb.navigator.Navigator
import org.openqa.selenium.JavascriptExecutor
class JavascriptInterface {
@@ -67,7 +68,25 @@ class JavascriptInterface {
throw new GebException("driver '$driver' can not execute
javascript")
}
- driver.executeScript(script, *args.collect { (it instanceof GString) ?
it as String : it })
+ driver.executeScript(script, *args.collect {
+ switch (it) {
+ case GString:
+ it as String
+ break
+
+ case { (it instanceof Navigator) && it.size() == 1 }:
+ it.singleElement()
+ break
+
+ case Navigator:
+ it.allElements()
+ break
+
+ default:
+ it
+ break
+ }
+ })
}
-}
+}
\ No newline at end of file
diff --git a/module/geb-core/src/test/groovy/geb/JavascriptInterfaceSpec.groovy
b/module/geb-core/src/test/groovy/geb/JavascriptInterfaceSpec.groovy
index fdc76b86..a26438b1 100644
--- a/module/geb-core/src/test/groovy/geb/JavascriptInterfaceSpec.groovy
+++ b/module/geb-core/src/test/groovy/geb/JavascriptInterfaceSpec.groovy
@@ -38,6 +38,8 @@ class JavascriptInterfaceSpec extends
GebSpecWithCallbackServer {
}
</script>
<body>
+ <div id="a"></div>
+ <div id="b"></div>
</body>
</html>"""
}
@@ -138,6 +140,42 @@ class JavascriptInterfaceSpec extends
GebSpecWithCallbackServer {
expect:
js."document.title" == "geb"
}
+
+ def "web element argument"() {
+ given:
+ def divA = $('div#a')
+
+ when:
+ js.exec(divA.singleElement(), 'arguments[0].innerText = "foo"')
+
+ then:
+ divA.text() == 'foo'
+ }
+
+ def "single element navigator argument"() {
+ given:
+ def divA = $('div#a')
+
+ when:
+ js.exec(divA, 'arguments[0].innerText = "foo"')
+
+ then:
+ divA.text() == 'foo'
+ }
+
+ def "multi element navigator argument"() {
+ given:
+ def divA = $('div#a')
+ def divB = $('div#b')
+ def div = $('div')
+
+ when:
+ js.exec(div, 'arguments[0].forEach(it => it.innerText = "foo")')
+
+ then:
+ divA.text() == 'foo'
+ divB.text() == 'foo'
+ }
}
class JavascriptInterfaceSpecPage extends Page {