Skip to content

Commit

Permalink
[java] Ensure event firing decorator can accept a target class
Browse files Browse the repository at this point in the history
Related to #1694
  • Loading branch information
pujagani committed Sep 5, 2022
1 parent 5050a6b commit fcc549a
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,11 @@ public EventFiringDecorator(WebDriverListener... listeners) {
this.listeners = Arrays.asList(listeners);
}

public EventFiringDecorator(Class<T> targetClass, WebDriverListener... listeners) {
super(targetClass);
this.listeners = Arrays.asList(listeners);
}

@Override
public void beforeCall(Decorated<?> target, Method method, Object[] args) {
listeners.forEach(listener -> fireBeforeEvents(listener, target, method, args));
Expand Down
1 change: 1 addition & 0 deletions java/test/org/openqa/selenium/support/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ java_test_suite(
srcs = glob(["*Test.java"]),
deps = [
"//java/src/org/openqa/selenium:core",
"//java/src/org/openqa/selenium/remote",
"//java/src/org/openqa/selenium/support",
"//java/test/org/openqa/selenium/support/ui:clock",
"//java/test/org/openqa/selenium/testing:annotations",
Expand Down
1 change: 1 addition & 0 deletions java/test/org/openqa/selenium/support/events/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ java_test_suite(
srcs = glob(["*.java"]),
deps = [
"//java/src/org/openqa/selenium:core",
"//java/src/org/openqa/selenium/remote",
"//java/src/org/openqa/selenium/support",
"//java/test/org/openqa/selenium:helpers",
"//java/test/org/openqa/selenium/testing:annotations",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,13 @@
import org.junit.jupiter.api.Tag;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Capabilities;
import org.openqa.selenium.ImmutableCapabilities;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebDriver;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
Expand Down Expand Up @@ -81,7 +84,7 @@ public void afterGet(WebDriver driver, String url) {
acc.append("afterGet\n");
}
};
WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

decorated.get("http://example.com/");

Expand Down Expand Up @@ -134,7 +137,7 @@ public void afterClick(WebElement element) {
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

decorated.findElement(By.id("test")).click();

Expand Down Expand Up @@ -183,7 +186,7 @@ public void afterBack(WebDriver.Navigation navigation) {
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

decorated.navigate().back();

Expand Down Expand Up @@ -231,7 +234,7 @@ public void afterDismiss(Alert alert) {
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

decorated.switchTo().alert().dismiss();

Expand Down Expand Up @@ -273,7 +276,7 @@ public void afterExecuteScript(WebDriver driver, String script, Object[] args, O
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

((JavascriptExecutor) decorated).executeScript("sum", "2", "2");

Expand All @@ -297,7 +300,7 @@ public void beforeAnyCall(Object target, Method method, Object[] args) {
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

assertThatNoException().isThrownBy(decorated::getWindowHandle);
}
Expand Down Expand Up @@ -327,7 +330,7 @@ public void beforeGetWindowHandle(WebDriver driver) {
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

assertThatNoException().isThrownBy(decorated::getWindowHandle);
}
Expand All @@ -342,7 +345,7 @@ public void afterAnyCall(Object target, Method method, Object[] args, Object res
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

assertThatNoException().isThrownBy(decorated::getWindowHandle);
}
Expand All @@ -358,7 +361,7 @@ public void afterAnyWebDriverCall(WebDriver driver, Method method, Object[] args
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

assertThatNoException().isThrownBy(decorated::getWindowHandle);
}
Expand All @@ -373,7 +376,7 @@ public void afterGetWindowHandle(WebDriver driver, String result) {
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

assertThatNoException().isThrownBy(decorated::getWindowHandle);
}
Expand All @@ -389,7 +392,46 @@ public void onError(Object target, Method method, Object[] args, InvocationTarge
}
};

WebDriver decorated = new EventFiringDecorator(listener).decorate(driver);
WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver);

assertThatExceptionOfType(WebDriverException.class)
.isThrownBy(decorated::getWindowHandle);
}

@Test
void shouldBeAbleToDecorateAChildClassOfWebDriver() {
RemoteWebDriver driver = mock(RemoteWebDriver.class);
when(driver.getCapabilities()).thenReturn(new ImmutableCapabilities("browserName", "firefox"));

WebDriverListener listener = new WebDriverListener() {
@Override
public void onError(Object target, Method method, Object[] args, InvocationTargetException e) {
throw new RuntimeException("listener");
}
};

RemoteWebDriver decorated =
new EventFiringDecorator<>(RemoteWebDriver.class, listener).decorate(driver);

Capabilities caps = decorated.getCapabilities();

assertThat(caps.getBrowserName()).isEqualTo("firefox");
}

@Test
void shouldBeAbleToCallDecoratedMethodForDecoratedChildClass() {
RemoteWebDriver driver = mock(RemoteWebDriver.class);
when(driver.getWindowHandle()).thenThrow(new WebDriverException());

WebDriverListener listener = new WebDriverListener() {
@Override
public void onError(Object target, Method method, Object[] args, InvocationTargetException e) {
throw new RuntimeException("listener");
}
};

RemoteWebDriver decorated =
new EventFiringDecorator<>(RemoteWebDriver.class, listener).decorate(driver);

assertThatExceptionOfType(WebDriverException.class)
.isThrownBy(decorated::getWindowHandle);
Expand Down

0 comments on commit fcc549a

Please sign in to comment.