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 {

Reply via email to