Skip to content

Commit fcc549a

Browse files
authored
[java] Ensure event firing decorator can accept a target class
Related to #1694
1 parent 5050a6b commit fcc549a

File tree

4 files changed

+60
-11
lines changed

4 files changed

+60
-11
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ public EventFiringDecorator(WebDriverListener... listeners) {
165165
this.listeners = Arrays.asList(listeners);
166166
}
167167

168+
public EventFiringDecorator(Class<T> targetClass, WebDriverListener... listeners) {
169+
super(targetClass);
170+
this.listeners = Arrays.asList(listeners);
171+
}
172+
168173
@Override
169174
public void beforeCall(Decorated<?> target, Method method, Object[] args) {
170175
listeners.forEach(listener -> fireBeforeEvents(listener, target, method, args));

java/test/org/openqa/selenium/support/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ java_test_suite(
77
srcs = glob(["*Test.java"]),
88
deps = [
99
"//java/src/org/openqa/selenium:core",
10+
"//java/src/org/openqa/selenium/remote",
1011
"//java/src/org/openqa/selenium/support",
1112
"//java/test/org/openqa/selenium/support/ui:clock",
1213
"//java/test/org/openqa/selenium/testing:annotations",

java/test/org/openqa/selenium/support/events/BUILD.bazel

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ java_test_suite(
77
srcs = glob(["*.java"]),
88
deps = [
99
"//java/src/org/openqa/selenium:core",
10+
"//java/src/org/openqa/selenium/remote",
1011
"//java/src/org/openqa/selenium/support",
1112
"//java/test/org/openqa/selenium:helpers",
1213
"//java/test/org/openqa/selenium/testing:annotations",

java/test/org/openqa/selenium/support/events/EventFiringDecoratorTest.java

+53-11
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,13 @@
2929
import org.junit.jupiter.api.Tag;
3030
import org.openqa.selenium.Alert;
3131
import org.openqa.selenium.By;
32+
import org.openqa.selenium.Capabilities;
33+
import org.openqa.selenium.ImmutableCapabilities;
3234
import org.openqa.selenium.JavascriptExecutor;
3335
import org.openqa.selenium.WebDriver;
3436
import org.openqa.selenium.WebDriverException;
3537
import org.openqa.selenium.WebElement;
38+
import org.openqa.selenium.remote.RemoteWebDriver;
3639

3740
import java.lang.reflect.InvocationTargetException;
3841
import 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

Comments
 (0)