Skip to content

Commit b932200

Browse files
committed
Wrapping result of executeScript in EventFiringWebDriver. Fixes #3380
1 parent fcd010d commit b932200

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

java/client/src/org/openqa/selenium/support/events/EventFiringWebDriver.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import java.util.Map;
5959
import java.util.Set;
6060
import java.util.concurrent.TimeUnit;
61+
import java.util.stream.Collectors;
6162

6263
/**
6364
* A wrapper around an arbitrary {@link WebDriver} instance which supports registering of a
@@ -216,7 +217,7 @@ public Object executeScript(String script, Object... args) {
216217
Object[] usedArgs = unpackWrappedArgs(args);
217218
Object result = ((JavascriptExecutor) driver).executeScript(script, usedArgs);
218219
dispatcher.afterScript(script, driver);
219-
return result;
220+
return wrapResult(result);
220221
}
221222
throw new UnsupportedOperationException(
222223
"Underlying driver instance does not support executing javascript");
@@ -265,6 +266,22 @@ private Object unpackWrappedElement(Object arg) {
265266
}
266267
}
267268

269+
private Object wrapResult(Object result) {
270+
if (result instanceof WebElement) {
271+
return new EventFiringWebElement((WebElement) result);
272+
}
273+
if (result instanceof List) {
274+
return ((List) result).stream().map(this::wrapResult).collect(Collectors.toList());
275+
}
276+
if (result instanceof Map) {
277+
return ((Map<String, Object>) result).entrySet().stream().collect(Collectors.toMap(
278+
e -> e.getKey(), e -> wrapResult(e.getValue())
279+
));
280+
}
281+
282+
return result;
283+
}
284+
268285
public <X> X getScreenshotAs(OutputType<X> target) throws WebDriverException {
269286
if (driver instanceof TakesScreenshot) {
270287
return ((TakesScreenshot) driver).getScreenshotAs(target);

java/client/test/org/openqa/selenium/support/events/EventFiringWebDriverTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717

1818
package org.openqa.selenium.support.events;
1919

20+
import static org.hamcrest.CoreMatchers.*;
2021
import static org.junit.Assert.assertEquals;
2122
import static org.junit.Assert.assertSame;
23+
import static org.junit.Assert.assertThat;
2224
import static org.junit.Assert.assertTrue;
2325
import static org.junit.Assert.fail;
2426
import static org.mockito.Matchers.any;
@@ -32,6 +34,7 @@
3234

3335
import com.google.common.collect.ImmutableMap;
3436

37+
import org.hamcrest.CoreMatchers;
3538
import org.junit.Test;
3639
import org.junit.runner.RunWith;
3740
import org.junit.runners.JUnit4;
@@ -254,6 +257,24 @@ public void shouldUnpackElementArgsWhenCallingScripts() {
254257
verify((JavascriptExecutor) mockedDriver).executeScript("foo", element);
255258
}
256259

260+
@Test
261+
public void shouldWrapElementFoundWhenCallingScripts() {
262+
final WebDriver mockedDriver = mock(WebDriver.class,
263+
withSettings().extraInterfaces(JavascriptExecutor.class));
264+
final WebElement stubbedElement = mock(WebElement.class);
265+
266+
when(((JavascriptExecutor) mockedDriver).executeScript("foo"))
267+
.thenReturn(stubbedElement);
268+
269+
EventFiringWebDriver testedDriver = new EventFiringWebDriver(mockedDriver);
270+
271+
Object res = testedDriver.executeScript("foo");
272+
verify((JavascriptExecutor) mockedDriver).executeScript("foo");
273+
assertThat(res, instanceOf(WebElement.class));
274+
assertThat(res, instanceOf(WrapsElement.class));
275+
assertSame(stubbedElement, ((WrapsElement) res).getWrappedElement());
276+
}
277+
257278
@Test
258279
public void testShouldUnpackListOfElementArgsWhenCallingScripts() {
259280
final WebDriver mockedDriver = mock(WebDriver.class,
@@ -276,6 +297,27 @@ public void testShouldUnpackListOfElementArgsWhenCallingScripts() {
276297
verify((JavascriptExecutor) mockedDriver).executeScript("foo", args);
277298
}
278299

300+
@Test
301+
public void shouldWrapMultipleElementsFoundWhenCallingScripts() {
302+
final WebDriver mockedDriver = mock(WebDriver.class,
303+
withSettings().extraInterfaces(JavascriptExecutor.class));
304+
final WebElement stubbedElement1 = mock(WebElement.class);
305+
final WebElement stubbedElement2 = mock(WebElement.class);
306+
307+
when(((JavascriptExecutor) mockedDriver).executeScript("foo"))
308+
.thenReturn(Arrays.asList(stubbedElement1, stubbedElement2));
309+
310+
EventFiringWebDriver testedDriver = new EventFiringWebDriver(mockedDriver);
311+
312+
Object res = testedDriver.executeScript("foo");
313+
verify((JavascriptExecutor) mockedDriver).executeScript("foo");
314+
assertThat(res, instanceOf(List.class));
315+
List<Object> resList = (List<Object>) res;
316+
resList.stream().forEach(el -> assertTrue(el instanceof WrapsElement));
317+
assertSame(stubbedElement1, ((WrapsElement) resList.get(0)).getWrappedElement());
318+
assertSame(stubbedElement2, ((WrapsElement) resList.get(1)).getWrappedElement());
319+
}
320+
279321
@Test
280322
public void testShouldUnpackMapOfElementArgsWhenCallingScripts() {
281323
final WebDriver mockedDriver = mock(WebDriver.class,

0 commit comments

Comments
 (0)