diff --git a/java/src/org/openqa/selenium/support/events/WebDriverListener.java b/java/src/org/openqa/selenium/support/events/WebDriverListener.java index ea54f18a39d7b..3179b2a876b19 100644 --- a/java/src/org/openqa/selenium/support/events/WebDriverListener.java +++ b/java/src/org/openqa/selenium/support/events/WebDriverListener.java @@ -30,8 +30,10 @@ import org.openqa.selenium.Cookie; import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.OutputType; import org.openqa.selenium.Point; import org.openqa.selenium.ScriptKey; +import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.WindowType; @@ -330,6 +332,26 @@ default void beforeResetInputState(WebDriver driver) {} */ default void afterResetInputState(WebDriver driver) {} + /** + * This method will be called before {@link TakesScreenshot#getScreenshotAs(OutputType)} is + * called. + * + * @param driver decorated WebDriver instance + * @param target target type, see {@link OutputType} + * @param return type for getScreenshotAs + */ + default void beforeGetScreenshotAs(WebDriver driver, OutputType target) {} + + /** + * This method will be called after {@link TakesScreenshot#getScreenshotAs(OutputType)} is called. + * + * @param driver decorated WebDriver instance + * @param target target type, see {@link OutputType} + * @param result object that stores the screenshot information + * @param return type for getScreenshotAs + */ + default void afterGetScreenshotAs(WebDriver driver, OutputType target, X result) {} + // WebElement /** @@ -581,6 +603,26 @@ default void beforeGetCssValue(WebElement element, String propertyName) {} */ default void afterGetCssValue(WebElement element, String propertyName, String result) {} + /** + * This method will be called before {@link TakesScreenshot#getScreenshotAs(OutputType)} is + * called. + * + * @param element decorated WebElement instance + * @param target target type, see {@link OutputType} + * @param return type for getScreenshotAs + */ + default void beforeGetScreenshotAs(WebElement element, OutputType target) {} + + /** + * This method will be called after {@link TakesScreenshot#getScreenshotAs(OutputType)} is called. + * + * @param element decorated WebElement instance + * @param target target type, see {@link OutputType} + * @param result result object that stores the screenshot information + * @param return type for getScreenshotAs + */ + default void afterGetScreenshotAs(WebElement element, OutputType target, X result) {} + // Navigation (WebDriver.Navigation) /** diff --git a/java/test/org/openqa/selenium/support/events/EventFiringDecoratorTest.java b/java/test/org/openqa/selenium/support/events/EventFiringDecoratorTest.java index a3651247d6c27..86c9e05b34662 100644 --- a/java/test/org/openqa/selenium/support/events/EventFiringDecoratorTest.java +++ b/java/test/org/openqa/selenium/support/events/EventFiringDecoratorTest.java @@ -44,7 +44,9 @@ import org.openqa.selenium.Dimension; import org.openqa.selenium.ImmutableCapabilities; import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.OutputType; import org.openqa.selenium.Point; +import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; @@ -285,9 +287,11 @@ public void afterPerform(WebDriver driver, Collection actions) { @Test void shouldFireWebElementEvents() { + String result = "result"; WebDriver driver = mock(WebDriver.class); WebElement element = mock(WebElement.class); when(driver.findElement(any())).thenReturn(element); + when(element.getScreenshotAs(OutputType.BASE64)).thenReturn(result); CollectorListener listener = new CollectorListener() { @@ -467,6 +471,20 @@ public void beforeGetCssValue(WebElement element, String propertyName) { public void afterGetCssValue(WebElement element, String propertyName, String result) { acc.append("afterGetCssValue").append("\n"); } + + @Override + public void beforeGetScreenshotAs(WebElement element, OutputType target) { + acc.append("beforeGetScreenshotAs ").append(target).append("\n"); + } + + @Override + public void afterGetScreenshotAs(WebElement element, OutputType target, X result) { + acc.append("afterGetScreenshotAs ") + .append(target) + .append(" ") + .append(result) + .append("\n"); + } }; WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver); @@ -485,6 +503,7 @@ public void afterGetCssValue(WebElement element, String propertyName, String res element1.getSize(); element1.getCssValue("test"); element1.clear(); + element1.getScreenshotAs(OutputType.BASE64); assertThat(listener.acc.toString().trim()) .isEqualTo( @@ -545,7 +564,11 @@ public void afterGetCssValue(WebElement element, String propertyName, String res "beforeAnyWebElementCall clear", "beforeClear", "afterClear", - "afterAnyWebElementCall clear")); + "afterAnyWebElementCall clear", + "beforeAnyWebElementCall getScreenshotAs", + "beforeGetScreenshotAs OutputType.BASE64", + "afterGetScreenshotAs OutputType.BASE64 " + result, + "afterAnyWebElementCall getScreenshotAs")); } @Test @@ -973,6 +996,44 @@ public void afterAlert(WebDriver.TargetLocator targetLocator, Alert alert) { "afterAnyCall alert")); } + @Test + void shouldFireWebDriverTakesScreenshotEvents() { + String result = "result"; + WebDriver driver = mock(WebDriver.class, withSettings().extraInterfaces(TakesScreenshot.class)); + when(((TakesScreenshot) driver).getScreenshotAs(OutputType.BASE64)).thenReturn(result); + + CollectorListener listener = + new CollectorListener() { + @Override + public void beforeGetScreenshotAs(WebDriver driver, OutputType target) { + acc.append("beforeGetScreenshotAs ").append(target).append("\n"); + } + + @Override + public void afterGetScreenshotAs(WebDriver driver, OutputType target, X result) { + acc.append("afterGetScreenshotAs ") + .append(target) + .append(" ") + .append(result) + .append("\n"); + } + }; + WebDriver decorated = new EventFiringDecorator<>(listener).decorate(driver); + + ((TakesScreenshot) decorated).getScreenshotAs(OutputType.BASE64); + + assertThat(listener.acc.toString().trim()) + .isEqualTo( + String.join( + "\n", + "beforeAnyCall getScreenshotAs", + "beforeAnyWebDriverCall getScreenshotAs", + "beforeGetScreenshotAs OutputType.BASE64", + "afterGetScreenshotAs OutputType.BASE64 " + result, + "afterAnyWebDriverCall getScreenshotAs", + "afterAnyCall getScreenshotAs")); + } + @Test void shouldSuppressExceptionInBeforeAnyCall() { WebDriver driver = mock(WebDriver.class);