From bdc7fc4c5d691080eb555c40d94071d9ee7b8856 Mon Sep 17 00:00:00 2001 From: Mohamed Mostafa Date: Wed, 12 Aug 2026 15:28:11 +0300 Subject: [PATCH] [java] Check the resolved driver for JS support in By.getJavascriptExecutor() --- java/src/org/openqa/selenium/By.java | 2 +- java/test/org/openqa/selenium/BUILD.bazel | 1 + java/test/org/openqa/selenium/ByTest.java | 36 +++++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/java/src/org/openqa/selenium/By.java b/java/src/org/openqa/selenium/By.java index f4768bc60e7de..5c39533449a73 100644 --- a/java/src/org/openqa/selenium/By.java +++ b/java/src/org/openqa/selenium/By.java @@ -150,7 +150,7 @@ protected WebDriver getWebDriver(SearchContext context) { protected JavascriptExecutor getJavascriptExecutor(SearchContext context) { WebDriver driver = getWebDriver(context); - if (!(context instanceof JavascriptExecutor)) { + if (!(driver instanceof JavascriptExecutor)) { throw new IllegalArgumentException( "Context does not provide a mechanism to execute JS: " + context); } diff --git a/java/test/org/openqa/selenium/BUILD.bazel b/java/test/org/openqa/selenium/BUILD.bazel index 7e057437b5f09..d670fe5b85635 100644 --- a/java/test/org/openqa/selenium/BUILD.bazel +++ b/java/test/org/openqa/selenium/BUILD.bazel @@ -27,6 +27,7 @@ java_test_suite( size = "small", srcs = SMALL_TESTS, deps = [ + ":helpers", "//java/src/org/openqa/selenium/json", "//java/src/org/openqa/selenium/remote", "//java/test/org/openqa/selenium/netty/server:test-server", diff --git a/java/test/org/openqa/selenium/ByTest.java b/java/test/org/openqa/selenium/ByTest.java index 6eab809921686..1236f066d51f0 100644 --- a/java/test/org/openqa/selenium/ByTest.java +++ b/java/test/org/openqa/selenium/ByTest.java @@ -184,4 +184,40 @@ void ensureNameContainingBackslashIsEscapedAsLiteral() { .containsEntry("using", "css selector") .containsEntry("value", "*[name='a\\\\b']"); } + + @Test + void getJavascriptExecutorAcceptsAContextWrappingAJavascriptCapableDriver() { + WebDriver driver = new StubDriver(); + + assertThat(By.cssSelector("cheese").getJavascriptExecutor(new DriverWrappingContext(driver))) + .isSameAs(driver); + } + + /** + * Mirrors a context such as {@code RemoteWebElement}, which is not a {@link JavascriptExecutor} + * itself but wraps a driver that may be one. + */ + private static class DriverWrappingContext implements SearchContext, WrapsDriver { + + private final WebDriver driver; + + DriverWrappingContext(WebDriver driver) { + this.driver = driver; + } + + @Override + public WebDriver getWrappedDriver() { + return driver; + } + + @Override + public List findElements(By by) { + throw new UnsupportedOperationException("findElements"); + } + + @Override + public WebElement findElement(By by) { + throw new UnsupportedOperationException("findElement"); + } + } }