From 03595713a2ccde0512d509de6e3245d870badb58 Mon Sep 17 00:00:00 2001 From: Valery Yatsynovich Date: Fri, 24 Jun 2022 18:39:54 +0300 Subject: [PATCH] [java] Add ability to decorate child classes of `WebDriver` --- .../support/decorators/DefaultDecorated.java | 6 ++-- .../decorators/WebDriverDecorator.java | 29 ++++++++++++++----- .../support/events/EventFiringDecorator.java | 2 +- .../openqa/selenium/remote/AugmenterTest.java | 2 +- .../decorators/DecoratedAlertTest.java | 2 +- .../decorators/DecoratedNavigationTest.java | 2 +- .../decorators/DecoratedOptionsTest.java | 2 +- .../DecoratedRemoteWebDriverTest.java | 13 +++++---- .../decorators/DecoratedSwitchToTest.java | 2 +- .../decorators/DecoratedTimeoutsTest.java | 2 +- .../DecoratedVirtualAuthenticatorTest.java | 2 +- .../decorators/DecoratedWebDriverTest.java | 10 +++---- .../decorators/DecoratedWebElementTest.java | 2 +- .../decorators/DecoratedWindowTest.java | 2 +- .../support/decorators/IntegrationTest.java | 2 +- .../support/decorators/InterfacesTest.java | 4 +-- 16 files changed, 49 insertions(+), 35 deletions(-) diff --git a/java/src/org/openqa/selenium/support/decorators/DefaultDecorated.java b/java/src/org/openqa/selenium/support/decorators/DefaultDecorated.java index 0eace50a2e200..cc5735a776f1f 100644 --- a/java/src/org/openqa/selenium/support/decorators/DefaultDecorated.java +++ b/java/src/org/openqa/selenium/support/decorators/DefaultDecorated.java @@ -23,9 +23,9 @@ public class DefaultDecorated implements Decorated { private final T original; - private final WebDriverDecorator decorator; + private final WebDriverDecorator decorator; - public DefaultDecorated(final T original, final WebDriverDecorator decorator) { + public DefaultDecorated(final T original, final WebDriverDecorator decorator) { this.original = original; this.decorator = decorator; } @@ -34,7 +34,7 @@ public final T getOriginal() { return original; } - public final WebDriverDecorator getDecorator() { + public final WebDriverDecorator getDecorator() { return decorator; } diff --git a/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java b/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java index 1a832ce37300b..70f7f75ed9364 100644 --- a/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java +++ b/java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java @@ -179,22 +179,35 @@ * */ @Beta -public class WebDriverDecorator { +public class WebDriverDecorator { - private Decorated decorated; + private final Class targetWebDriverClass; - public final WebDriver decorate(WebDriver original) { + private Decorated decorated; + + @SuppressWarnings("unchecked") + public WebDriverDecorator() + { + this((Class) WebDriver.class); + } + + public WebDriverDecorator(Class targetClass) + { + this.targetWebDriverClass = targetClass; + } + + public final T decorate(T original) { Require.nonNull("WebDriver", original); decorated = createDecorated(original); - return createProxy(decorated, WebDriver.class); + return createProxy(decorated, targetWebDriverClass); } - public Decorated getDecoratedDriver() { + public Decorated getDecoratedDriver() { return decorated; } - public Decorated createDecorated(WebDriver driver) { + public Decorated createDecorated(T driver) { return new DefaultDecorated<>(driver, this); } @@ -248,7 +261,7 @@ public Object onError( private Object decorateResult(Object toDecorate) { if (toDecorate instanceof WebDriver) { - return createProxy(getDecoratedDriver(), WebDriver.class); + return createProxy(getDecoratedDriver(), targetWebDriverClass); } if (toDecorate instanceof WebElement) { return createProxy(createDecorated((WebElement) toDecorate), WebElement.class); @@ -316,7 +329,7 @@ protected final Z createProxy(final Decorated decorated, Class clazz) Class[] allInterfacesArray = allInterfaces.toArray(new Class[0]); Class proxy = new ByteBuddy() - .subclass(Object.class) + .subclass(clazz.isInterface() ? Object.class : clazz) .implement(allInterfacesArray) .method(ElementMatchers.any()) .intercept(InvocationHandlerAdapter.of(handler)) diff --git a/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java b/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java index f0f2cd63ecc62..df1f16348b90d 100644 --- a/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java +++ b/java/src/org/openqa/selenium/support/events/EventFiringDecorator.java @@ -155,7 +155,7 @@ * extending {@link WebDriverDecorator}, not by creating sophisticated listeners. */ @Beta -public class EventFiringDecorator extends WebDriverDecorator { +public class EventFiringDecorator extends WebDriverDecorator { private static final Logger logger = Logger.getLogger(EventFiringDecorator.class.getName()); diff --git a/java/test/org/openqa/selenium/remote/AugmenterTest.java b/java/test/org/openqa/selenium/remote/AugmenterTest.java index 46bbacb2f2d8c..d5d9fec074466 100644 --- a/java/test/org/openqa/selenium/remote/AugmenterTest.java +++ b/java/test/org/openqa/selenium/remote/AugmenterTest.java @@ -424,7 +424,7 @@ public Capabilities getCapabilities() { } } - private static class ModifyTitleWebDriverDecorator extends WebDriverDecorator { + private static class ModifyTitleWebDriverDecorator extends WebDriverDecorator { @Override public Object call(Decorated target, Method method, Object[] args) throws Throwable { diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedAlertTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedAlertTest.java index af835e7ef8dab..8c8eb96676b68 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedAlertTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedAlertTest.java @@ -48,7 +48,7 @@ public Fixture() { originalDriver = mock(WebDriver.class); when(originalSwitch.alert()).thenReturn(original); when(originalDriver.switchTo()).thenReturn(originalSwitch); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.switchTo().alert(); } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedNavigationTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedNavigationTest.java index 97ee2d69968e5..809411431bb2c 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedNavigationTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedNavigationTest.java @@ -44,7 +44,7 @@ public Fixture() { original = mock(WebDriver.Navigation.class); originalDriver = mock(WebDriver.class); when(originalDriver.navigate()).thenReturn(original); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.navigate(); } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedOptionsTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedOptionsTest.java index f0dbdc2e4d64f..c445266c55077 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedOptionsTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedOptionsTest.java @@ -49,7 +49,7 @@ public Fixture() { original = mock(WebDriver.Options.class); originalDriver = mock(WebDriver.class); when(originalDriver.manage()).thenReturn(original); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.manage(); } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedRemoteWebDriverTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedRemoteWebDriverTest.java index 1c2cf10824b6b..803331316873b 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedRemoteWebDriverTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedRemoteWebDriverTest.java @@ -48,10 +48,11 @@ public void shouldImplementWrapsDriverToProvideAccessToUnderlyingDriver() { RemoteWebDriver originalDriver = mock(RemoteWebDriver.class); when(originalDriver.getSessionId()).thenReturn(sessionId); - WebDriver decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + RemoteWebDriver decoratedDriver = new WebDriverDecorator<>(RemoteWebDriver.class).decorate(originalDriver); - RemoteWebDriver underlying = (RemoteWebDriver) ((WrapsDriver) decoratedDriver).getWrappedDriver(); + assertThat(decoratedDriver.getSessionId()).isEqualTo(sessionId); + RemoteWebDriver underlying = (RemoteWebDriver) ((WrapsDriver) decoratedDriver).getWrappedDriver(); assertThat(underlying.getSessionId()).isEqualTo(sessionId); } @@ -59,7 +60,7 @@ public void shouldImplementWrapsDriverToProvideAccessToUnderlyingDriver() { public void cannotConvertDecoratedToRemoteWebDriver() { RemoteWebDriver originalDriver = mock(RemoteWebDriver.class); - WebDriver decorated = new WebDriverDecorator().decorate(originalDriver); + WebDriver decorated = new WebDriverDecorator<>().decorate(originalDriver); assertThat(decorated).isNotInstanceOf(RemoteWebDriver.class); } @@ -68,7 +69,7 @@ public void cannotConvertDecoratedToRemoteWebDriver() { public void decoratedDriversShouldImplementWrapsDriver() { RemoteWebDriver originalDriver = mock(RemoteWebDriver.class); - WebDriver decorated = new WebDriverDecorator().decorate(originalDriver); + WebDriver decorated = new WebDriverDecorator<>().decorate(originalDriver); assertThat(decorated).isInstanceOf(WrapsDriver.class); } @@ -83,7 +84,7 @@ public void decoratedElementsShouldImplementWrapsElement() { when(originalDriver.findElement(any())).thenReturn(originalElement); - WebDriver decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + WebDriver decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); WebElement element = decoratedDriver.findElement(By.id("test")); assertThat(element).isInstanceOf(WrapsElement.class); @@ -99,7 +100,7 @@ public void canConvertDecoratedRemoteWebElementToJson() { when(originalDriver.findElement(any())).thenReturn(originalElement); - WebDriver decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + WebDriver decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); WebElement element = decoratedDriver.findElement(By.id("test")); diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedSwitchToTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedSwitchToTest.java index 19eb6d78cdc9f..27004ec8a5ae8 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedSwitchToTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedSwitchToTest.java @@ -47,7 +47,7 @@ public Fixture() { original = mock(WebDriver.TargetLocator.class); originalDriver = mock(WebDriver.class); when(originalDriver.switchTo()).thenReturn(original); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.switchTo(); } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedTimeoutsTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedTimeoutsTest.java index 7a5ea3df5671e..cc54c38e5bc96 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedTimeoutsTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedTimeoutsTest.java @@ -47,7 +47,7 @@ public Fixture() { originalDriver = mock(WebDriver.class); when(originalOptions.timeouts()).thenReturn(original); when(originalDriver.manage()).thenReturn(originalOptions); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.manage().timeouts(); } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedVirtualAuthenticatorTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedVirtualAuthenticatorTest.java index bb7dde319762f..824b49e793767 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedVirtualAuthenticatorTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedVirtualAuthenticatorTest.java @@ -52,7 +52,7 @@ public Fixture() { originalDriver = mock( WebDriver.class, withSettings().extraInterfaces(HasVirtualAuthenticator.class)); when(((HasVirtualAuthenticator) originalDriver).addVirtualAuthenticator(any())).thenReturn(original); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = ((HasVirtualAuthenticator) decoratedDriver) .addVirtualAuthenticator(new VirtualAuthenticatorOptions()); } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java index 05430bdf24f31..9f45cf7a29978 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java @@ -61,7 +61,7 @@ public Fixture() { .extraInterfaces(JavascriptExecutor.class, TakesScreenshot.class, Interactive.class, HasVirtualAuthenticator.class)); originalAuth = mock(VirtualAuthenticator.class); - decorated = new WebDriverDecorator().decorate(original); + decorated = new WebDriverDecorator<>().decorate(original); when(((HasVirtualAuthenticator) original).addVirtualAuthenticator(any())).thenReturn(originalAuth); } } @@ -84,9 +84,9 @@ public void canCompareDecorated() { WebDriver original1 = mock(WebDriver.class); WebDriver original2 = mock(WebDriver.class); - WebDriver decorated1 = new WebDriverDecorator().decorate(original1); - WebDriver decorated2 = new WebDriverDecorator().decorate(original1); - WebDriver decorated3 = new WebDriverDecorator().decorate(original2); + WebDriver decorated1 = new WebDriverDecorator<>().decorate(original1); + WebDriver decorated2 = new WebDriverDecorator<>().decorate(original1); + WebDriver decorated3 = new WebDriverDecorator<>().decorate(original2); assertThat(decorated1).isEqualTo(decorated2); assertThat(decorated1).isNotEqualTo(decorated3); @@ -99,7 +99,7 @@ public void canCompareDecorated() { @Test public void testHashCode() { WebDriver original = mock(WebDriver.class); - WebDriver decorated = new WebDriverDecorator().decorate(original); + WebDriver decorated = new WebDriverDecorator<>().decorate(original); assertThat(decorated.hashCode()).isEqualTo(original.hashCode()); } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedWebElementTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedWebElementTest.java index 1241612fcf2fd..295385192ea97 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedWebElementTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedWebElementTest.java @@ -55,7 +55,7 @@ public Fixture() { original = mock(WebElement.class); originalDriver = mock(WebDriver.class); when(originalDriver.findElement(any())).thenReturn(original); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.findElement(By.id("test")); } } diff --git a/java/test/org/openqa/selenium/support/decorators/DecoratedWindowTest.java b/java/test/org/openqa/selenium/support/decorators/DecoratedWindowTest.java index bbcd7c61bedec..f2de40ec4790c 100644 --- a/java/test/org/openqa/selenium/support/decorators/DecoratedWindowTest.java +++ b/java/test/org/openqa/selenium/support/decorators/DecoratedWindowTest.java @@ -49,7 +49,7 @@ public Fixture() { originalDriver = mock(WebDriver.class); when(originalOptions.window()).thenReturn(original); when(originalDriver.manage()).thenReturn(originalOptions); - decoratedDriver = new WebDriverDecorator().decorate(originalDriver); + decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver); decorated = decoratedDriver.manage().window(); } } diff --git a/java/test/org/openqa/selenium/support/decorators/IntegrationTest.java b/java/test/org/openqa/selenium/support/decorators/IntegrationTest.java index ae77385604290..f28549504aa7c 100644 --- a/java/test/org/openqa/selenium/support/decorators/IntegrationTest.java +++ b/java/test/org/openqa/selenium/support/decorators/IntegrationTest.java @@ -34,7 +34,7 @@ @Tag("UnitTests") public class IntegrationTest { - static class CountCalls extends WebDriverDecorator { + static class CountCalls extends WebDriverDecorator { int counterBefore = 0; int counterAfter = 0; diff --git a/java/test/org/openqa/selenium/support/decorators/InterfacesTest.java b/java/test/org/openqa/selenium/support/decorators/InterfacesTest.java index 45a39a5c0fb92..655aae2b63d94 100644 --- a/java/test/org/openqa/selenium/support/decorators/InterfacesTest.java +++ b/java/test/org/openqa/selenium/support/decorators/InterfacesTest.java @@ -36,7 +36,7 @@ public void shouldNotAddInterfacesNotAvailableInTheOriginalDriver() { WebDriver driver = mock(WebDriver.class); assertThat(driver).isNotInstanceOf(SomeOtherInterface.class); - WebDriver decorated = new WebDriverDecorator().decorate(driver); + WebDriver decorated = new WebDriverDecorator<>().decorate(driver); assertThat(decorated).isNotInstanceOf(SomeOtherInterface.class); } @@ -45,7 +45,7 @@ public void shouldRespectInterfacesAvailableInTheOriginalDriver() { WebDriver driver = mock(ExtendedDriver.class); assertThat(driver).isInstanceOf(SomeOtherInterface.class); - WebDriver decorated = new WebDriverDecorator().decorate(driver); + WebDriver decorated = new WebDriverDecorator<>().decorate(driver); assertThat(decorated).isInstanceOf(SomeOtherInterface.class); } }