2929import org .junit .jupiter .api .Tag ;
3030import org .openqa .selenium .Alert ;
3131import org .openqa .selenium .By ;
32+ import org .openqa .selenium .Capabilities ;
33+ import org .openqa .selenium .ImmutableCapabilities ;
3234import org .openqa .selenium .JavascriptExecutor ;
3335import org .openqa .selenium .WebDriver ;
3436import org .openqa .selenium .WebDriverException ;
3537import org .openqa .selenium .WebElement ;
38+ import org .openqa .selenium .remote .RemoteWebDriver ;
3639
3740import java .lang .reflect .InvocationTargetException ;
3841import java .lang .reflect .Method ;
@@ -81,7 +84,7 @@ public void afterGet(WebDriver driver, String url) {
8184 acc .append ("afterGet\n " );
8285 }
8386 };
84- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
87+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
8588
8689 decorated .get ("http://example.com/" );
8790
@@ -134,7 +137,7 @@ public void afterClick(WebElement element) {
134137 }
135138 };
136139
137- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
140+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
138141
139142 decorated .findElement (By .id ("test" )).click ();
140143
@@ -183,7 +186,7 @@ public void afterBack(WebDriver.Navigation navigation) {
183186 }
184187 };
185188
186- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
189+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
187190
188191 decorated .navigate ().back ();
189192
@@ -231,7 +234,7 @@ public void afterDismiss(Alert alert) {
231234 }
232235 };
233236
234- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
237+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
235238
236239 decorated .switchTo ().alert ().dismiss ();
237240
@@ -273,7 +276,7 @@ public void afterExecuteScript(WebDriver driver, String script, Object[] args, O
273276 }
274277 };
275278
276- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
279+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
277280
278281 ((JavascriptExecutor ) decorated ).executeScript ("sum" , "2" , "2" );
279282
@@ -297,7 +300,7 @@ public void beforeAnyCall(Object target, Method method, Object[] args) {
297300 }
298301 };
299302
300- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
303+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
301304
302305 assertThatNoException ().isThrownBy (decorated ::getWindowHandle );
303306 }
@@ -327,7 +330,7 @@ public void beforeGetWindowHandle(WebDriver driver) {
327330 }
328331 };
329332
330- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
333+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
331334
332335 assertThatNoException ().isThrownBy (decorated ::getWindowHandle );
333336 }
@@ -342,7 +345,7 @@ public void afterAnyCall(Object target, Method method, Object[] args, Object res
342345 }
343346 };
344347
345- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
348+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
346349
347350 assertThatNoException ().isThrownBy (decorated ::getWindowHandle );
348351 }
@@ -358,7 +361,7 @@ public void afterAnyWebDriverCall(WebDriver driver, Method method, Object[] args
358361 }
359362 };
360363
361- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
364+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
362365
363366 assertThatNoException ().isThrownBy (decorated ::getWindowHandle );
364367 }
@@ -373,7 +376,7 @@ public void afterGetWindowHandle(WebDriver driver, String result) {
373376 }
374377 };
375378
376- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
379+ WebDriver decorated = new EventFiringDecorator <> (listener ).decorate (driver );
377380
378381 assertThatNoException ().isThrownBy (decorated ::getWindowHandle );
379382 }
@@ -389,7 +392,46 @@ public void onError(Object target, Method method, Object[] args, InvocationTarge
389392 }
390393 };
391394
392- WebDriver decorated = new EventFiringDecorator (listener ).decorate (driver );
395+ WebDriver decorated = new EventFiringDecorator <>(listener ).decorate (driver );
396+
397+ assertThatExceptionOfType (WebDriverException .class )
398+ .isThrownBy (decorated ::getWindowHandle );
399+ }
400+
401+ @ Test
402+ void shouldBeAbleToDecorateAChildClassOfWebDriver () {
403+ RemoteWebDriver driver = mock (RemoteWebDriver .class );
404+ when (driver .getCapabilities ()).thenReturn (new ImmutableCapabilities ("browserName" , "firefox" ));
405+
406+ WebDriverListener listener = new WebDriverListener () {
407+ @ Override
408+ public void onError (Object target , Method method , Object [] args , InvocationTargetException e ) {
409+ throw new RuntimeException ("listener" );
410+ }
411+ };
412+
413+ RemoteWebDriver decorated =
414+ new EventFiringDecorator <>(RemoteWebDriver .class , listener ).decorate (driver );
415+
416+ Capabilities caps = decorated .getCapabilities ();
417+
418+ assertThat (caps .getBrowserName ()).isEqualTo ("firefox" );
419+ }
420+
421+ @ Test
422+ void shouldBeAbleToCallDecoratedMethodForDecoratedChildClass () {
423+ RemoteWebDriver driver = mock (RemoteWebDriver .class );
424+ when (driver .getWindowHandle ()).thenThrow (new WebDriverException ());
425+
426+ WebDriverListener listener = new WebDriverListener () {
427+ @ Override
428+ public void onError (Object target , Method method , Object [] args , InvocationTargetException e ) {
429+ throw new RuntimeException ("listener" );
430+ }
431+ };
432+
433+ RemoteWebDriver decorated =
434+ new EventFiringDecorator <>(RemoteWebDriver .class , listener ).decorate (driver );
393435
394436 assertThatExceptionOfType (WebDriverException .class )
395437 .isThrownBy (decorated ::getWindowHandle );
0 commit comments