Skip to content

Commit fb4df66

Browse files
valfirstpujaganidiemol
authored
[java] Add ability to decorate child classes of WebDriver (#10737)
Co-authored-by: Puja Jagani <puja.jagani93@gmail.com> Co-authored-by: Diego Molina <diemol@users.noreply.github.com>
1 parent 09e296c commit fb4df66

15 files changed

+45
-35
lines changed

java/src/org/openqa/selenium/support/decorators/DefaultDecorated.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
public class DefaultDecorated<T> implements Decorated<T> {
2424

2525
private final T original;
26-
private final WebDriverDecorator decorator;
26+
private final WebDriverDecorator<?> decorator;
2727

28-
public DefaultDecorated(final T original, final WebDriverDecorator decorator) {
28+
public DefaultDecorated(final T original, final WebDriverDecorator<?> decorator) {
2929
this.original = original;
3030
this.decorator = decorator;
3131
}
@@ -34,7 +34,7 @@ public final T getOriginal() {
3434
return original;
3535
}
3636

37-
public final WebDriverDecorator getDecorator() {
37+
public final WebDriverDecorator<?> getDecorator() {
3838
return decorator;
3939
}
4040

java/src/org/openqa/selenium/support/decorators/WebDriverDecorator.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -179,22 +179,33 @@
179179
* </code></pre>
180180
*/
181181
@Beta
182-
public class WebDriverDecorator {
182+
public class WebDriverDecorator<T extends WebDriver> {
183183

184-
private Decorated<WebDriver> decorated;
184+
private final Class<T> targetWebDriverClass;
185185

186-
public final WebDriver decorate(WebDriver original) {
186+
private Decorated<T> decorated;
187+
188+
@SuppressWarnings("unchecked")
189+
public WebDriverDecorator() {
190+
this((Class<T>) WebDriver.class);
191+
}
192+
193+
public WebDriverDecorator(Class<T> targetClass) {
194+
this.targetWebDriverClass = targetClass;
195+
}
196+
197+
public final T decorate(T original) {
187198
Require.nonNull("WebDriver", original);
188199

189200
decorated = createDecorated(original);
190-
return createProxy(decorated, WebDriver.class);
201+
return createProxy(decorated, targetWebDriverClass);
191202
}
192203

193-
public Decorated<WebDriver> getDecoratedDriver() {
204+
public Decorated<T> getDecoratedDriver() {
194205
return decorated;
195206
}
196207

197-
public Decorated<WebDriver> createDecorated(WebDriver driver) {
208+
public Decorated<T> createDecorated(T driver) {
198209
return new DefaultDecorated<>(driver, this);
199210
}
200211

@@ -248,7 +259,7 @@ public Object onError(
248259

249260
private Object decorateResult(Object toDecorate) {
250261
if (toDecorate instanceof WebDriver) {
251-
return createProxy(getDecoratedDriver(), WebDriver.class);
262+
return createProxy(getDecoratedDriver(), targetWebDriverClass);
252263
}
253264
if (toDecorate instanceof WebElement) {
254265
return createProxy(createDecorated((WebElement) toDecorate), WebElement.class);
@@ -316,7 +327,7 @@ protected final <Z> Z createProxy(final Decorated<Z> decorated, Class<Z> clazz)
316327
Class<?>[] allInterfacesArray = allInterfaces.toArray(new Class<?>[0]);
317328

318329
Class<? extends Z> proxy = new ByteBuddy()
319-
.subclass(Object.class)
330+
.subclass(clazz.isInterface() ? Object.class : clazz)
320331
.implement(allInterfacesArray)
321332
.method(ElementMatchers.any())
322333
.intercept(InvocationHandlerAdapter.of(handler))

java/src/org/openqa/selenium/support/events/EventFiringDecorator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@
155155
* extending {@link WebDriverDecorator}, not by creating sophisticated listeners.
156156
*/
157157
@Beta
158-
public class EventFiringDecorator extends WebDriverDecorator {
158+
public class EventFiringDecorator<T extends WebDriver> extends WebDriverDecorator<T> {
159159

160160
private static final Logger logger = Logger.getLogger(EventFiringDecorator.class.getName());
161161

java/test/org/openqa/selenium/remote/AugmenterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ public Capabilities getCapabilities() {
440440
}
441441
}
442442

443-
private static class ModifyTitleWebDriverDecorator extends WebDriverDecorator {
443+
private static class ModifyTitleWebDriverDecorator extends WebDriverDecorator<WebDriver> {
444444

445445
@Override
446446
public Object call(Decorated<?> target, Method method, Object[] args) throws Throwable {

java/test/org/openqa/selenium/support/decorators/DecoratedAlertTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public Fixture() {
4949
originalDriver = mock(WebDriver.class);
5050
when(originalSwitch.alert()).thenReturn(original);
5151
when(originalDriver.switchTo()).thenReturn(originalSwitch);
52-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
52+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
5353
decorated = decoratedDriver.switchTo().alert();
5454
}
5555
}

java/test/org/openqa/selenium/support/decorators/DecoratedNavigationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public Fixture() {
4545
original = mock(WebDriver.Navigation.class);
4646
originalDriver = mock(WebDriver.class);
4747
when(originalDriver.navigate()).thenReturn(original);
48-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
48+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
4949
decorated = decoratedDriver.navigate();
5050
}
5151
}

java/test/org/openqa/selenium/support/decorators/DecoratedOptionsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public Fixture() {
5050
original = mock(WebDriver.Options.class);
5151
originalDriver = mock(WebDriver.class);
5252
when(originalDriver.manage()).thenReturn(original);
53-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
53+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
5454
decorated = decoratedDriver.manage();
5555
}
5656
}

java/test/org/openqa/selenium/support/decorators/DecoratedRemoteWebDriverTest.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,19 @@ void shouldImplementWrapsDriverToProvideAccessToUnderlyingDriver() {
4848
RemoteWebDriver originalDriver = mock(RemoteWebDriver.class);
4949
when(originalDriver.getSessionId()).thenReturn(sessionId);
5050

51-
WebDriver decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
51+
RemoteWebDriver decoratedDriver = new WebDriverDecorator<>(RemoteWebDriver.class).decorate(originalDriver);
5252

53-
RemoteWebDriver
54-
underlying =
55-
(RemoteWebDriver) ((WrapsDriver) decoratedDriver).getWrappedDriver();
53+
assertThat(decoratedDriver.getSessionId()).isEqualTo(sessionId);
5654

55+
RemoteWebDriver underlying = (RemoteWebDriver) ((WrapsDriver) decoratedDriver).getWrappedDriver();
5756
assertThat(underlying.getSessionId()).isEqualTo(sessionId);
5857
}
5958

6059
@Test
6160
void cannotConvertDecoratedToRemoteWebDriver() {
6261
RemoteWebDriver originalDriver = mock(RemoteWebDriver.class);
6362

64-
WebDriver decorated = new WebDriverDecorator().decorate(originalDriver);
63+
WebDriver decorated = new WebDriverDecorator<>().decorate(originalDriver);
6564

6665
assertThat(decorated).isNotInstanceOf(RemoteWebDriver.class);
6766
}
@@ -70,7 +69,7 @@ void cannotConvertDecoratedToRemoteWebDriver() {
7069
void decoratedDriversShouldImplementWrapsDriver() {
7170
RemoteWebDriver originalDriver = mock(RemoteWebDriver.class);
7271

73-
WebDriver decorated = new WebDriverDecorator().decorate(originalDriver);
72+
WebDriver decorated = new WebDriverDecorator<>().decorate(originalDriver);
7473

7574
assertThat(decorated).isInstanceOf(WrapsDriver.class);
7675
}
@@ -85,7 +84,7 @@ void decoratedElementsShouldImplementWrapsElement() {
8584

8685
when(originalDriver.findElement(any())).thenReturn(originalElement);
8786

88-
WebDriver decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
87+
WebDriver decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
8988
WebElement element = decoratedDriver.findElement(By.id("test"));
9089

9190
assertThat(element).isInstanceOf(WrapsElement.class);
@@ -101,7 +100,7 @@ void canConvertDecoratedRemoteWebElementToJson() {
101100

102101
when(originalDriver.findElement(any())).thenReturn(originalElement);
103102

104-
WebDriver decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
103+
WebDriver decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
105104

106105
WebElement element = decoratedDriver.findElement(By.id("test"));
107106

java/test/org/openqa/selenium/support/decorators/DecoratedSwitchToTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Fixture() {
4848
original = mock(WebDriver.TargetLocator.class);
4949
originalDriver = mock(WebDriver.class);
5050
when(originalDriver.switchTo()).thenReturn(original);
51-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
51+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
5252
decorated = decoratedDriver.switchTo();
5353
}
5454
}

java/test/org/openqa/selenium/support/decorators/DecoratedTimeoutsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Fixture() {
4848
originalDriver = mock(WebDriver.class);
4949
when(originalOptions.timeouts()).thenReturn(original);
5050
when(originalDriver.manage()).thenReturn(originalOptions);
51-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
51+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
5252
decorated = decoratedDriver.manage().timeouts();
5353
}
5454
}

java/test/org/openqa/selenium/support/decorators/DecoratedWebDriverTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ void canCompareDecorated() {
8686
WebDriver original1 = mock(WebDriver.class);
8787
WebDriver original2 = mock(WebDriver.class);
8888

89-
WebDriver decorated1 = new WebDriverDecorator().decorate(original1);
90-
WebDriver decorated2 = new WebDriverDecorator().decorate(original1);
91-
WebDriver decorated3 = new WebDriverDecorator().decorate(original2);
89+
WebDriver decorated1 = new WebDriverDecorator<>().decorate(original1);
90+
WebDriver decorated2 = new WebDriverDecorator<>().decorate(original1);
91+
WebDriver decorated3 = new WebDriverDecorator<>().decorate(original2);
9292
assertThat(decorated1).isEqualTo(decorated2);
9393
assertThat(decorated1).isNotEqualTo(decorated3);
9494

@@ -101,7 +101,7 @@ void canCompareDecorated() {
101101
@Test
102102
void testHashCode() {
103103
WebDriver original = mock(WebDriver.class);
104-
WebDriver decorated = new WebDriverDecorator().decorate(original);
104+
WebDriver decorated = new WebDriverDecorator<>().decorate(original);
105105
assertThat(decorated.hashCode()).isEqualTo(original.hashCode());
106106
}
107107

java/test/org/openqa/selenium/support/decorators/DecoratedWebElementTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public Fixture() {
5656
original = mock(WebElement.class);
5757
originalDriver = mock(WebDriver.class);
5858
when(originalDriver.findElement(any())).thenReturn(original);
59-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
59+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
6060
decorated = decoratedDriver.findElement(By.id("test"));
6161
}
6262
}

java/test/org/openqa/selenium/support/decorators/DecoratedWindowTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public Fixture() {
5050
originalDriver = mock(WebDriver.class);
5151
when(originalOptions.window()).thenReturn(original);
5252
when(originalDriver.manage()).thenReturn(originalOptions);
53-
decoratedDriver = new WebDriverDecorator().decorate(originalDriver);
53+
decoratedDriver = new WebDriverDecorator<>().decorate(originalDriver);
5454
decorated = decoratedDriver.manage().window();
5555
}
5656
}

java/test/org/openqa/selenium/support/decorators/IntegrationTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
@Tag("UnitTests")
3535
class IntegrationTest {
3636

37-
static class CountCalls extends WebDriverDecorator {
37+
static class CountCalls extends WebDriverDecorator<WebDriver> {
3838

3939
int counterBefore = 0;
4040
int counterAfter = 0;

java/test/org/openqa/selenium/support/decorators/InterfacesTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ void shouldNotAddInterfacesNotAvailableInTheOriginalDriver() {
3636
WebDriver driver = mock(WebDriver.class);
3737
assertThat(driver).isNotInstanceOf(SomeOtherInterface.class);
3838

39-
WebDriver decorated = new WebDriverDecorator().decorate(driver);
39+
WebDriver decorated = new WebDriverDecorator<>().decorate(driver);
4040
assertThat(decorated).isNotInstanceOf(SomeOtherInterface.class);
4141
}
4242

@@ -45,7 +45,7 @@ void shouldRespectInterfacesAvailableInTheOriginalDriver() {
4545
WebDriver driver = mock(ExtendedDriver.class);
4646
assertThat(driver).isInstanceOf(SomeOtherInterface.class);
4747

48-
WebDriver decorated = new WebDriverDecorator().decorate(driver);
48+
WebDriver decorated = new WebDriverDecorator<>().decorate(driver);
4949
assertThat(decorated).isInstanceOf(SomeOtherInterface.class);
5050
}
5151
}

0 commit comments

Comments
 (0)