From 7da58fe4bf18b8f5b07f328fd1d0c32186422350 Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Fri, 23 Jun 2023 13:44:32 +0200 Subject: [PATCH 1/6] Extract original driver from decorated driver --- java/src/org/openqa/selenium/remote/Augmenter.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/src/org/openqa/selenium/remote/Augmenter.java b/java/src/org/openqa/selenium/remote/Augmenter.java index ee5e82bc55322..88506aec30db0 100644 --- a/java/src/org/openqa/selenium/remote/Augmenter.java +++ b/java/src/org/openqa/selenium/remote/Augmenter.java @@ -50,6 +50,7 @@ import org.openqa.selenium.internal.Require; import org.openqa.selenium.logging.HasLogEvents; import org.openqa.selenium.remote.html5.AddWebStorage; +import org.openqa.selenium.support.decorators.Decorated; /** * Enhance the interfaces implemented by an instance of the {@link org.openqa.selenium.WebDriver} @@ -255,6 +256,10 @@ private RemoteWebDriver extractRemoteWebDriver(WebDriver driver) { return extractRemoteWebDriver(((WrapsDriver) driver).getWrappedDriver()); } + if (driver instanceof Decorated) { + return extractRemoteWebDriver((WebDriver) ((Decorated) driver).getOriginal()); + } + return null; } From 0c34ba97e1ace3fb658cfc082a8b746b6f395a01 Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Mon, 26 Jun 2023 11:06:54 +0200 Subject: [PATCH 2/6] Add test --- .../org/openqa/selenium/remote/Augmenter.java | 41 +++--- .../org/openqa/selenium/remote/BUILD.bazel | 1 + .../org/openqa/selenium/support/BUILD.bazel | 1 + .../selenium/support/decorators/BUILD.bazel | 1 + .../openqa/selenium/remote/AugmenterTest.java | 123 +++++++++++------- 5 files changed, 102 insertions(+), 65 deletions(-) diff --git a/java/src/org/openqa/selenium/remote/Augmenter.java b/java/src/org/openqa/selenium/remote/Augmenter.java index 88506aec30db0..428a7e3f85a19 100644 --- a/java/src/org/openqa/selenium/remote/Augmenter.java +++ b/java/src/org/openqa/selenium/remote/Augmenter.java @@ -17,22 +17,6 @@ package org.openqa.selenium.remote; -import static java.util.Collections.unmodifiableSet; -import static net.bytebuddy.matcher.ElementMatchers.anyOf; -import static net.bytebuddy.matcher.ElementMatchers.named; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.ServiceLoader; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.annotation.AnnotationDescription; import net.bytebuddy.dynamic.DynamicType; @@ -52,6 +36,23 @@ import org.openqa.selenium.remote.html5.AddWebStorage; import org.openqa.selenium.support.decorators.Decorated; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import static java.util.Collections.unmodifiableSet; +import static net.bytebuddy.matcher.ElementMatchers.anyOf; +import static net.bytebuddy.matcher.ElementMatchers.named; + /** * Enhance the interfaces implemented by an instance of the {@link org.openqa.selenium.WebDriver} * based on the returned {@link org.openqa.selenium.Capabilities} of the driver. Note: this class is @@ -252,14 +253,14 @@ private RemoteWebDriver extractRemoteWebDriver(WebDriver driver) { return (RemoteWebDriver) driver; } - if (driver instanceof WrapsDriver) { - return extractRemoteWebDriver(((WrapsDriver) driver).getWrappedDriver()); - } - if (driver instanceof Decorated) { return extractRemoteWebDriver((WebDriver) ((Decorated) driver).getOriginal()); } + if (driver instanceof WrapsDriver) { + return extractRemoteWebDriver(((WrapsDriver) driver).getWrappedDriver()); + } + return null; } diff --git a/java/src/org/openqa/selenium/remote/BUILD.bazel b/java/src/org/openqa/selenium/remote/BUILD.bazel index e93f0b4643667..c231530f0b839 100644 --- a/java/src/org/openqa/selenium/remote/BUILD.bazel +++ b/java/src/org/openqa/selenium/remote/BUILD.bazel @@ -60,6 +60,7 @@ java_library( "//java/src/org/openqa/selenium/remote/http/netty", "//java/src/org/openqa/selenium/remote/tracing", "//java/src/org/openqa/selenium/remote/tracing/opentelemetry", + "//java/src/org/openqa/selenium/support/decorators", artifact("com.google.guava:guava"), artifact("net.bytebuddy:byte-buddy"), ], diff --git a/java/src/org/openqa/selenium/support/BUILD.bazel b/java/src/org/openqa/selenium/support/BUILD.bazel index a0477e2a6abfc..c955559dca387 100644 --- a/java/src/org/openqa/selenium/support/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/BUILD.bazel @@ -18,6 +18,7 @@ java_export( ":page-factory", "//java/src/org/openqa/selenium/support/events", "//java/src/org/openqa/selenium/support/locators", + "//java/src/org/openqa/selenium/support/decorators", "//java/src/org/openqa/selenium/support/ui:clock", "//java/src/org/openqa/selenium/support/ui:components", "//java/src/org/openqa/selenium/support/ui:elements", diff --git a/java/src/org/openqa/selenium/support/decorators/BUILD.bazel b/java/src/org/openqa/selenium/support/decorators/BUILD.bazel index 1166e43b9c23f..2b70d12183b71 100644 --- a/java/src/org/openqa/selenium/support/decorators/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/decorators/BUILD.bazel @@ -7,6 +7,7 @@ java_library( visibility = [ "//java/src/org/openqa/selenium/support:__subpackages__", "//java/test/org/openqa/selenium/support/decorators:__pkg__", + "//java/src/org/openqa/selenium/remote:__subpackages__", ], deps = [ "//java/src/org/openqa/selenium:core", diff --git a/java/test/org/openqa/selenium/remote/AugmenterTest.java b/java/test/org/openqa/selenium/remote/AugmenterTest.java index 2928f547d4afc..fe0fdd5efaf6f 100644 --- a/java/test/org/openqa/selenium/remote/AugmenterTest.java +++ b/java/test/org/openqa/selenium/remote/AugmenterTest.java @@ -17,18 +17,7 @@ package org.openqa.selenium.remote; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.mockito.Mockito.mock; -import static org.openqa.selenium.remote.DriverCommand.FIND_ELEMENT; - import com.google.common.collect.ImmutableMap; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; @@ -44,50 +33,64 @@ import org.openqa.selenium.internal.Require; import org.openqa.selenium.support.decorators.Decorated; import org.openqa.selenium.support.decorators.WebDriverDecorator; +import org.openqa.selenium.support.events.EventFiringDecorator; +import org.openqa.selenium.support.events.WebDriverListener; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.mock; +import static org.openqa.selenium.remote.DriverCommand.FIND_ELEMENT; @Tag("UnitTests") class AugmenterTest { - private Augmenter getAugmenter() { - return new Augmenter(); + private org.openqa.selenium.remote.Augmenter getAugmenter() { + return new org.openqa.selenium.remote.Augmenter(); } @Test void shouldAddInterfaceFromCapabilityIfNecessary() { final Capabilities caps = new ImmutableCapabilities("magic.numbers", true); - WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned).isNotSameAs(driver); - assertThat(returned).isInstanceOf(HasMagicNumbers.class); + assertThat(returned).isInstanceOf(org.openqa.selenium.remote.HasMagicNumbers.class); } @Test void shouldNotAddInterfaceWhenBooleanValueForItIsFalse() { Capabilities caps = new ImmutableCapabilities("magic.numbers", false); - WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned).isSameAs(driver); - assertThat(returned).isNotInstanceOf(HasMagicNumbers.class); + assertThat(returned).isNotInstanceOf(org.openqa.selenium.remote.HasMagicNumbers.class); } @Test void shouldNotUseNonMatchingInterfaces() { Capabilities caps = new ImmutableCapabilities("magic.numbers", true); - WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned).isNotInstanceOf(WebStorage.class); } @@ -95,7 +98,7 @@ void shouldNotUseNonMatchingInterfaces() { @Test void shouldDelegateToHandlerIfAdded() { Capabilities caps = new ImmutableCapabilities("foo", true); - WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() @@ -110,12 +113,12 @@ void shouldDelegateToHandlerIfAdded() { void shouldDelegateUnmatchedMethodCallsToDriverImplementation() { Capabilities caps = new ImmutableCapabilities("magic.numbers", true); StubExecutor stubExecutor = new StubExecutor(caps); - stubExecutor.expect(DriverCommand.GET_TITLE, new HashMap<>(), "Title"); - WebDriver driver = new RemoteWebDriver(stubExecutor, caps); + stubExecutor.expect(org.openqa.selenium.remote.DriverCommand.GET_TITLE, new HashMap<>(), "Title"); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(stubExecutor, caps); WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned.getTitle()).isEqualTo("Title"); @@ -131,7 +134,7 @@ void proxyShouldNotAppearInStackTraces() { WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThatExceptionOfType(NoSuchElementException.class) @@ -141,7 +144,7 @@ void proxyShouldNotAppearInStackTraces() { @Test void shouldCopyFieldsFromTemplateInstanceIntoChildInstance() { ChildRemoteDriver driver = new ChildRemoteDriver(); - HasMagicNumbers holder = (HasMagicNumbers) getAugmenter().augment(driver); + org.openqa.selenium.remote.HasMagicNumbers holder = (org.openqa.selenium.remote.HasMagicNumbers) getAugmenter().augment(driver); assertThat(holder.getMagicNumber()).isEqualTo(3); } @@ -159,7 +162,7 @@ void shouldAllowReflexiveCalls() { final WebElement element = mock(WebElement.class); executor.expect(FIND_ELEMENT, ImmutableMap.of("using", "magic", "value", "cheese"), element); - WebDriver driver = new RemoteWebDriver(executor, caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(executor, caps); WebDriver returned = getAugmenter() .addDriverAugmentation( @@ -177,25 +180,25 @@ void shouldAugmentMultipleInterfaces() { new ImmutableCapabilities( "magic.numbers", true, "numbers", true); - WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .addDriverAugmentation( "numbers", HasNumbers.class, (c, exe) -> webDriver -> { Require.precondition( - webDriver instanceof HasMagicNumbers, + webDriver instanceof org.openqa.selenium.remote.HasMagicNumbers, "Driver must implement HasMagicNumbers"); - return ((HasMagicNumbers) webDriver).getMagicNumber(); + return ((org.openqa.selenium.remote.HasMagicNumbers) webDriver).getMagicNumber(); }) .augment(driver); assertThat(returned).isNotSameAs(driver); - assertThat(returned).isInstanceOf(HasMagicNumbers.class); + assertThat(returned).isInstanceOf(org.openqa.selenium.remote.HasMagicNumbers.class); assertThat(returned).isInstanceOf(HasNumbers.class); int number = ((HasNumbers) returned).getNumbers(returned); @@ -208,20 +211,20 @@ void shouldDecorateAugmentedWebDriver() { new ImmutableCapabilities( "magic.numbers", true, "numbers", true); - WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); WebDriver augmented = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) .addDriverAugmentation( "numbers", HasNumbers.class, (c, exe) -> webDriver -> { Require.precondition( - webDriver instanceof HasMagicNumbers, + webDriver instanceof org.openqa.selenium.remote.HasMagicNumbers, "Driver must implement HasMagicNumbers"); - return ((HasMagicNumbers) webDriver).getMagicNumber(); + return ((org.openqa.selenium.remote.HasMagicNumbers) webDriver).getMagicNumber(); }) .augment(driver); @@ -240,6 +243,36 @@ void shouldDecorateAugmentedWebDriver() { assertThat(number).isEqualTo(42); } + @Test + void shouldAugmentDecoratedWebDriver() { + final Capabilities caps = + new ImmutableCapabilities( + "magic.numbers", true, + "numbers", true); + WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver eventFiringDecorate = new EventFiringDecorator<>(new WebDriverListener() { + @Override + public void beforeAnyCall(Object target, Method method, Object[] args) { + System.out.println("Bazinga!"); + } + }).decorate(driver); + + WebDriver modifyTitleDecorate = new ModifyTitleWebDriverDecorator().decorate(eventFiringDecorate); + + WebDriver augmented = getAugmenter() + .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .augment(modifyTitleDecorate); + + assertThat(modifyTitleDecorate).isNotSameAs(driver); + + assertThat(((HasMagicNumbers) augmented).getMagicNumber()).isEqualTo(42); + assertThat(augmented.getTitle()).isEqualTo("title"); + + assertThat(augmented).isNotSameAs(modifyTitleDecorate); + assertThat(augmented).isInstanceOf(Decorated.class); + } + + private static class ByMagic extends By { private final String magicWord; @@ -259,7 +292,7 @@ public interface FindByMagic { WebElement findByMagic(String magicWord); } - protected static class StubExecutor implements CommandExecutor { + protected static class StubExecutor implements org.openqa.selenium.remote.CommandExecutor { private final Capabilities capabilities; private final List expected = new ArrayList<>(); @@ -269,9 +302,9 @@ protected StubExecutor(Capabilities capabilities) { } @Override - public Response execute(Command command) { - if (DriverCommand.NEW_SESSION.equals(command.getName())) { - Response response = new Response(new SessionId("foo")); + public org.openqa.selenium.remote.Response execute(Command command) { + if (org.openqa.selenium.remote.DriverCommand.NEW_SESSION.equals(command.getName())) { + org.openqa.selenium.remote.Response response = new org.openqa.selenium.remote.Response(new org.openqa.selenium.remote.SessionId("foo")); response.setValue(capabilities.asMap()); return response; } @@ -279,7 +312,7 @@ public Response execute(Command command) { for (Data possibleMatch : expected) { if (possibleMatch.commandName.equals(command.getName()) && possibleMatch.args.equals(command.getParameters())) { - Response response = new Response(new SessionId("foo")); + org.openqa.selenium.remote.Response response = new org.openqa.selenium.remote.Response(new org.openqa.selenium.remote.SessionId("foo")); response.setValue(possibleMatch.returnValue); return response; } @@ -311,7 +344,7 @@ public interface MyInterface { String getHelloWorld(); } - public static class DetonatingDriver extends RemoteWebDriver { + public static class DetonatingDriver extends org.openqa.selenium.remote.RemoteWebDriver { private Capabilities caps; @@ -340,7 +373,7 @@ public interface HasNumbers { int getNumbers(WebDriver driver); } - public static class ChildRemoteDriver extends RemoteWebDriver implements HasMagicNumbers { + public static class ChildRemoteDriver extends org.openqa.selenium.remote.RemoteWebDriver implements org.openqa.selenium.remote.HasMagicNumbers { private int magicNumber = 3; @@ -355,7 +388,7 @@ public int getMagicNumber() { } } - public static class WithFinals extends RemoteWebDriver { + public static class WithFinals extends org.openqa.selenium.remote.RemoteWebDriver { public final String finalField = "FINAL"; From 34952c5a3aceb40bf605b67028598bf43937fb5e Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Mon, 26 Jun 2023 11:07:46 +0200 Subject: [PATCH 3/6] Use import --- .../openqa/selenium/remote/AugmenterTest.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/java/test/org/openqa/selenium/remote/AugmenterTest.java b/java/test/org/openqa/selenium/remote/AugmenterTest.java index fe0fdd5efaf6f..15ef1897d1533 100644 --- a/java/test/org/openqa/selenium/remote/AugmenterTest.java +++ b/java/test/org/openqa/selenium/remote/AugmenterTest.java @@ -58,7 +58,7 @@ private org.openqa.selenium.remote.Augmenter getAugmenter() { @Test void shouldAddInterfaceFromCapabilityIfNecessary() { final Capabilities caps = new ImmutableCapabilities("magic.numbers", true); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() @@ -72,7 +72,7 @@ void shouldAddInterfaceFromCapabilityIfNecessary() { @Test void shouldNotAddInterfaceWhenBooleanValueForItIsFalse() { Capabilities caps = new ImmutableCapabilities("magic.numbers", false); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() @@ -86,7 +86,7 @@ void shouldNotAddInterfaceWhenBooleanValueForItIsFalse() { @Test void shouldNotUseNonMatchingInterfaces() { Capabilities caps = new ImmutableCapabilities("magic.numbers", true); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() @@ -98,7 +98,7 @@ void shouldNotUseNonMatchingInterfaces() { @Test void shouldDelegateToHandlerIfAdded() { Capabilities caps = new ImmutableCapabilities("foo", true); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() @@ -114,7 +114,7 @@ void shouldDelegateUnmatchedMethodCallsToDriverImplementation() { Capabilities caps = new ImmutableCapabilities("magic.numbers", true); StubExecutor stubExecutor = new StubExecutor(caps); stubExecutor.expect(org.openqa.selenium.remote.DriverCommand.GET_TITLE, new HashMap<>(), "Title"); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(stubExecutor, caps); + WebDriver driver = new RemoteWebDriver(stubExecutor, caps); WebDriver returned = getAugmenter() @@ -162,7 +162,7 @@ void shouldAllowReflexiveCalls() { final WebElement element = mock(WebElement.class); executor.expect(FIND_ELEMENT, ImmutableMap.of("using", "magic", "value", "cheese"), element); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(executor, caps); + WebDriver driver = new RemoteWebDriver(executor, caps); WebDriver returned = getAugmenter() .addDriverAugmentation( @@ -180,7 +180,7 @@ void shouldAugmentMultipleInterfaces() { new ImmutableCapabilities( "magic.numbers", true, "numbers", true); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver returned = getAugmenter() @@ -211,7 +211,7 @@ void shouldDecorateAugmentedWebDriver() { new ImmutableCapabilities( "magic.numbers", true, "numbers", true); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver augmented = getAugmenter() @@ -249,7 +249,7 @@ void shouldAugmentDecoratedWebDriver() { new ImmutableCapabilities( "magic.numbers", true, "numbers", true); - WebDriver driver = new org.openqa.selenium.remote.RemoteWebDriver(new StubExecutor(caps), caps); + WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); WebDriver eventFiringDecorate = new EventFiringDecorator<>(new WebDriverListener() { @Override public void beforeAnyCall(Object target, Method method, Object[] args) { @@ -344,7 +344,7 @@ public interface MyInterface { String getHelloWorld(); } - public static class DetonatingDriver extends org.openqa.selenium.remote.RemoteWebDriver { + public static class DetonatingDriver extends RemoteWebDriver { private Capabilities caps; @@ -373,7 +373,7 @@ public interface HasNumbers { int getNumbers(WebDriver driver); } - public static class ChildRemoteDriver extends org.openqa.selenium.remote.RemoteWebDriver implements org.openqa.selenium.remote.HasMagicNumbers { + public static class ChildRemoteDriver extends RemoteWebDriver implements org.openqa.selenium.remote.HasMagicNumbers { private int magicNumber = 3; @@ -388,7 +388,7 @@ public int getMagicNumber() { } } - public static class WithFinals extends org.openqa.selenium.remote.RemoteWebDriver { + public static class WithFinals extends RemoteWebDriver { public final String finalField = "FINAL"; From 47ab39fffd1d665cfe02269a0bd6182092614ac7 Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Mon, 26 Jun 2023 11:09:40 +0200 Subject: [PATCH 4/6] Unnecessary qualification removed --- .../openqa/selenium/remote/AugmenterTest.java | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/java/test/org/openqa/selenium/remote/AugmenterTest.java b/java/test/org/openqa/selenium/remote/AugmenterTest.java index 15ef1897d1533..84e938f95a3f9 100644 --- a/java/test/org/openqa/selenium/remote/AugmenterTest.java +++ b/java/test/org/openqa/selenium/remote/AugmenterTest.java @@ -51,8 +51,8 @@ @Tag("UnitTests") class AugmenterTest { - private org.openqa.selenium.remote.Augmenter getAugmenter() { - return new org.openqa.selenium.remote.Augmenter(); + private Augmenter getAugmenter() { + return new Augmenter(); } @Test @@ -62,11 +62,11 @@ void shouldAddInterfaceFromCapabilityIfNecessary() { WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned).isNotSameAs(driver); - assertThat(returned).isInstanceOf(org.openqa.selenium.remote.HasMagicNumbers.class); + assertThat(returned).isInstanceOf(HasMagicNumbers.class); } @Test @@ -76,11 +76,11 @@ void shouldNotAddInterfaceWhenBooleanValueForItIsFalse() { WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned).isSameAs(driver); - assertThat(returned).isNotInstanceOf(org.openqa.selenium.remote.HasMagicNumbers.class); + assertThat(returned).isNotInstanceOf(HasMagicNumbers.class); } @Test @@ -90,7 +90,7 @@ void shouldNotUseNonMatchingInterfaces() { WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned).isNotInstanceOf(WebStorage.class); } @@ -113,12 +113,12 @@ void shouldDelegateToHandlerIfAdded() { void shouldDelegateUnmatchedMethodCallsToDriverImplementation() { Capabilities caps = new ImmutableCapabilities("magic.numbers", true); StubExecutor stubExecutor = new StubExecutor(caps); - stubExecutor.expect(org.openqa.selenium.remote.DriverCommand.GET_TITLE, new HashMap<>(), "Title"); + stubExecutor.expect(DriverCommand.GET_TITLE, new HashMap<>(), "Title"); WebDriver driver = new RemoteWebDriver(stubExecutor, caps); WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThat(returned.getTitle()).isEqualTo("Title"); @@ -134,7 +134,7 @@ void proxyShouldNotAppearInStackTraces() { WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(driver); assertThatExceptionOfType(NoSuchElementException.class) @@ -144,7 +144,7 @@ void proxyShouldNotAppearInStackTraces() { @Test void shouldCopyFieldsFromTemplateInstanceIntoChildInstance() { ChildRemoteDriver driver = new ChildRemoteDriver(); - org.openqa.selenium.remote.HasMagicNumbers holder = (org.openqa.selenium.remote.HasMagicNumbers) getAugmenter().augment(driver); + HasMagicNumbers holder = (HasMagicNumbers) getAugmenter().augment(driver); assertThat(holder.getMagicNumber()).isEqualTo(3); } @@ -184,21 +184,21 @@ void shouldAugmentMultipleInterfaces() { WebDriver returned = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .addDriverAugmentation( "numbers", HasNumbers.class, (c, exe) -> webDriver -> { Require.precondition( - webDriver instanceof org.openqa.selenium.remote.HasMagicNumbers, + webDriver instanceof HasMagicNumbers, "Driver must implement HasMagicNumbers"); - return ((org.openqa.selenium.remote.HasMagicNumbers) webDriver).getMagicNumber(); + return ((HasMagicNumbers) webDriver).getMagicNumber(); }) .augment(driver); assertThat(returned).isNotSameAs(driver); - assertThat(returned).isInstanceOf(org.openqa.selenium.remote.HasMagicNumbers.class); + assertThat(returned).isInstanceOf(HasMagicNumbers.class); assertThat(returned).isInstanceOf(HasNumbers.class); int number = ((HasNumbers) returned).getNumbers(returned); @@ -215,16 +215,16 @@ void shouldDecorateAugmentedWebDriver() { WebDriver augmented = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .addDriverAugmentation( "numbers", HasNumbers.class, (c, exe) -> webDriver -> { Require.precondition( - webDriver instanceof org.openqa.selenium.remote.HasMagicNumbers, + webDriver instanceof HasMagicNumbers, "Driver must implement HasMagicNumbers"); - return ((org.openqa.selenium.remote.HasMagicNumbers) webDriver).getMagicNumber(); + return ((HasMagicNumbers) webDriver).getMagicNumber(); }) .augment(driver); @@ -260,7 +260,7 @@ public void beforeAnyCall(Object target, Method method, Object[] args) { WebDriver modifyTitleDecorate = new ModifyTitleWebDriverDecorator().decorate(eventFiringDecorate); WebDriver augmented = getAugmenter() - .addDriverAugmentation("magic.numbers", org.openqa.selenium.remote.HasMagicNumbers.class, (c, exe) -> () -> 42) + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) .augment(modifyTitleDecorate); assertThat(modifyTitleDecorate).isNotSameAs(driver); @@ -292,7 +292,7 @@ public interface FindByMagic { WebElement findByMagic(String magicWord); } - protected static class StubExecutor implements org.openqa.selenium.remote.CommandExecutor { + protected static class StubExecutor implements CommandExecutor { private final Capabilities capabilities; private final List expected = new ArrayList<>(); @@ -302,9 +302,9 @@ protected StubExecutor(Capabilities capabilities) { } @Override - public org.openqa.selenium.remote.Response execute(Command command) { - if (org.openqa.selenium.remote.DriverCommand.NEW_SESSION.equals(command.getName())) { - org.openqa.selenium.remote.Response response = new org.openqa.selenium.remote.Response(new org.openqa.selenium.remote.SessionId("foo")); + public Response execute(Command command) { + if (DriverCommand.NEW_SESSION.equals(command.getName())) { + Response response = new Response(new SessionId("foo")); response.setValue(capabilities.asMap()); return response; } @@ -312,7 +312,7 @@ public org.openqa.selenium.remote.Response execute(Command command) { for (Data possibleMatch : expected) { if (possibleMatch.commandName.equals(command.getName()) && possibleMatch.args.equals(command.getParameters())) { - org.openqa.selenium.remote.Response response = new org.openqa.selenium.remote.Response(new org.openqa.selenium.remote.SessionId("foo")); + Response response = new Response(new SessionId("foo")); response.setValue(possibleMatch.returnValue); return response; } @@ -373,7 +373,7 @@ public interface HasNumbers { int getNumbers(WebDriver driver); } - public static class ChildRemoteDriver extends RemoteWebDriver implements org.openqa.selenium.remote.HasMagicNumbers { + public static class ChildRemoteDriver extends RemoteWebDriver implements HasMagicNumbers { private int magicNumber = 3; From 84bb647012945288b0597384b144c686518a3f63 Mon Sep 17 00:00:00 2001 From: Bartek Florczak Date: Tue, 27 Jun 2023 22:13:11 +0200 Subject: [PATCH 5/6] Preserve order --- java/src/org/openqa/selenium/support/BUILD.bazel | 2 +- java/src/org/openqa/selenium/support/decorators/BUILD.bazel | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/org/openqa/selenium/support/BUILD.bazel b/java/src/org/openqa/selenium/support/BUILD.bazel index c955559dca387..cd480e5666e73 100644 --- a/java/src/org/openqa/selenium/support/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/BUILD.bazel @@ -17,8 +17,8 @@ java_export( exports = [ ":page-factory", "//java/src/org/openqa/selenium/support/events", - "//java/src/org/openqa/selenium/support/locators", "//java/src/org/openqa/selenium/support/decorators", + "//java/src/org/openqa/selenium/support/locators", "//java/src/org/openqa/selenium/support/ui:clock", "//java/src/org/openqa/selenium/support/ui:components", "//java/src/org/openqa/selenium/support/ui:elements", diff --git a/java/src/org/openqa/selenium/support/decorators/BUILD.bazel b/java/src/org/openqa/selenium/support/decorators/BUILD.bazel index 2b70d12183b71..5ad1eb0cd9fd5 100644 --- a/java/src/org/openqa/selenium/support/decorators/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/decorators/BUILD.bazel @@ -5,9 +5,9 @@ java_library( name = "decorators", srcs = glob(["*.java"]), visibility = [ + "//java/src/org/openqa/selenium/remote:__subpackages__", "//java/src/org/openqa/selenium/support:__subpackages__", "//java/test/org/openqa/selenium/support/decorators:__pkg__", - "//java/src/org/openqa/selenium/remote:__subpackages__", ], deps = [ "//java/src/org/openqa/selenium:core", From 0d916aa0c1b537926d3a7c3b8ad1518594ee5226 Mon Sep 17 00:00:00 2001 From: Diego Molina Date: Wed, 28 Jun 2023 11:57:50 +0000 Subject: [PATCH 6/6] Formatting files --- .../org/openqa/selenium/remote/Augmenter.java | 33 ++++++----- .../org/openqa/selenium/support/BUILD.bazel | 2 +- .../openqa/selenium/remote/AugmenterTest.java | 57 ++++++++++--------- 3 files changed, 47 insertions(+), 45 deletions(-) diff --git a/java/src/org/openqa/selenium/remote/Augmenter.java b/java/src/org/openqa/selenium/remote/Augmenter.java index c4385b1418869..d64f25a0ff055 100644 --- a/java/src/org/openqa/selenium/remote/Augmenter.java +++ b/java/src/org/openqa/selenium/remote/Augmenter.java @@ -17,6 +17,22 @@ package org.openqa.selenium.remote; +import static java.util.Collections.unmodifiableSet; +import static net.bytebuddy.matcher.ElementMatchers.anyOf; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; import net.bytebuddy.ByteBuddy; import net.bytebuddy.description.annotation.AnnotationDescription; import net.bytebuddy.dynamic.DynamicType; @@ -36,23 +52,6 @@ import org.openqa.selenium.remote.html5.AddWebStorage; import org.openqa.selenium.support.decorators.Decorated; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.ServiceLoader; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -import static java.util.Collections.unmodifiableSet; -import static net.bytebuddy.matcher.ElementMatchers.anyOf; -import static net.bytebuddy.matcher.ElementMatchers.named; - /** * Enhance the interfaces implemented by an instance of the {@link org.openqa.selenium.WebDriver} * based on the returned {@link org.openqa.selenium.Capabilities} of the driver. Note: this class is diff --git a/java/src/org/openqa/selenium/support/BUILD.bazel b/java/src/org/openqa/selenium/support/BUILD.bazel index cd480e5666e73..c378ca0b5c033 100644 --- a/java/src/org/openqa/selenium/support/BUILD.bazel +++ b/java/src/org/openqa/selenium/support/BUILD.bazel @@ -16,8 +16,8 @@ java_export( visibility = ["//visibility:public"], exports = [ ":page-factory", - "//java/src/org/openqa/selenium/support/events", "//java/src/org/openqa/selenium/support/decorators", + "//java/src/org/openqa/selenium/support/events", "//java/src/org/openqa/selenium/support/locators", "//java/src/org/openqa/selenium/support/ui:clock", "//java/src/org/openqa/selenium/support/ui:components", diff --git a/java/test/org/openqa/selenium/remote/AugmenterTest.java b/java/test/org/openqa/selenium/remote/AugmenterTest.java index 84e938f95a3f9..82a191705cd47 100644 --- a/java/test/org/openqa/selenium/remote/AugmenterTest.java +++ b/java/test/org/openqa/selenium/remote/AugmenterTest.java @@ -17,7 +17,18 @@ package org.openqa.selenium.remote; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.mockito.Mockito.mock; +import static org.openqa.selenium.remote.DriverCommand.FIND_ELEMENT; + import com.google.common.collect.ImmutableMap; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.openqa.selenium.By; @@ -36,18 +47,6 @@ import org.openqa.selenium.support.events.EventFiringDecorator; import org.openqa.selenium.support.events.WebDriverListener; -import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.mockito.Mockito.mock; -import static org.openqa.selenium.remote.DriverCommand.FIND_ELEMENT; - @Tag("UnitTests") class AugmenterTest { @@ -246,22 +245,27 @@ void shouldDecorateAugmentedWebDriver() { @Test void shouldAugmentDecoratedWebDriver() { final Capabilities caps = - new ImmutableCapabilities( - "magic.numbers", true, - "numbers", true); + new ImmutableCapabilities( + "magic.numbers", true, + "numbers", true); WebDriver driver = new RemoteWebDriver(new StubExecutor(caps), caps); - WebDriver eventFiringDecorate = new EventFiringDecorator<>(new WebDriverListener() { - @Override - public void beforeAnyCall(Object target, Method method, Object[] args) { - System.out.println("Bazinga!"); - } - }).decorate(driver); - - WebDriver modifyTitleDecorate = new ModifyTitleWebDriverDecorator().decorate(eventFiringDecorate); + WebDriver eventFiringDecorate = + new EventFiringDecorator<>( + new WebDriverListener() { + @Override + public void beforeAnyCall(Object target, Method method, Object[] args) { + System.out.println("Bazinga!"); + } + }) + .decorate(driver); + + WebDriver modifyTitleDecorate = + new ModifyTitleWebDriverDecorator().decorate(eventFiringDecorate); - WebDriver augmented = getAugmenter() - .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) - .augment(modifyTitleDecorate); + WebDriver augmented = + getAugmenter() + .addDriverAugmentation("magic.numbers", HasMagicNumbers.class, (c, exe) -> () -> 42) + .augment(modifyTitleDecorate); assertThat(modifyTitleDecorate).isNotSameAs(driver); @@ -272,7 +276,6 @@ public void beforeAnyCall(Object target, Method method, Object[] args) { assertThat(augmented).isInstanceOf(Decorated.class); } - private static class ByMagic extends By { private final String magicWord;