EventsWebDriverListener.java

package io.github.giulong.spectrum.internals.web_driver_listeners;

import io.github.giulong.spectrum.enums.Frame;
import io.github.giulong.spectrum.utils.Configuration;
import io.github.giulong.spectrum.utils.Configuration.Drivers.Events;
import io.github.giulong.spectrum.utils.web_driver_events.WebDriverEvent;
import io.github.giulong.spectrum.utils.web_driver_events.WebDriverEventConsumer;
import lombok.Generated;
import lombok.SneakyThrows;
import lombok.experimental.SuperBuilder;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.*;
import org.openqa.selenium.interactions.Sequence;
import org.slf4j.event.Level;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.time.Duration;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static io.github.giulong.spectrum.enums.Frame.AUTO_AFTER;
import static io.github.giulong.spectrum.enums.Frame.AUTO_BEFORE;

@Slf4j
@SuperBuilder
public class EventsWebDriverListener extends SpectrumWebDriverListener {

    private static final Pattern SECURED_PATTERN = Pattern.compile("@Secured@(?<key>.*)@Secured@");

    private Events events;
    private List<WebDriverEventConsumer> consumers;

    List<String> parse(final Object[] args) {
        return Arrays
                .stream(args)
                .map(arg -> arg instanceof WebElement ? extractSelectorFrom((WebElement) arg) : String.valueOf(arg))
                .toList();
    }

    @SneakyThrows
    void listenTo(final Frame frame, final Configuration.Drivers.Event event, final Object... args) {
        final Level level = event.getLevel();

        if (level == null || !log.isEnabledForLevel(level)) {
            return;
        }

        final long wait = event.getWait();
        if (wait > 0) {
            log.debug("Waiting {} ms before event processing", wait);
            Thread.sleep(wait);
        }

        final WebDriverEvent webDriverEvent = WebDriverEvent
                .builder()
                .frame(frame)
                .level(level)
                .args(Arrays.asList(args))
                .message(String.format(event.getMessage(), parse(args).toArray()))
                .build();

        consumers
                .stream()
                .filter(WebDriverEventConsumer::isEnabled)
                .forEach(consumer -> consumer.accept(webDriverEvent));
    }

    @Override
    @Generated
    public void beforeAnyCall(final Object target, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyCall(), target, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyCall(final Object target, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyCall(), target, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void onError(final Object target, final Method method, final Object[] args, final InvocationTargetException e) {
        listenTo(AUTO_AFTER, events.getOnError(), target, method, Arrays.toString(args), e.getMessage());
    }

    @Override
    @Generated
    public void beforeAnyWebDriverCall(final WebDriver webDriver, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyWebDriverCall(), webDriver, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyWebDriverCall(final WebDriver webDriver, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyWebDriverCall(), webDriver, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeGet(final WebDriver webDriver, final String url) {
        listenTo(AUTO_BEFORE, events.getBeforeGet(), webDriver, url);
    }

    @Override
    @Generated
    public void afterGet(final WebDriver webDriver, final String url) {
        listenTo(AUTO_AFTER, events.getAfterGet(), webDriver, url);
    }

    @Override
    @Generated
    public void beforeGetCurrentUrl(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeGetCurrentUrl(), webDriver);
    }

    @Override
    @Generated
    public void afterGetCurrentUrl(final WebDriver webDriver, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetCurrentUrl(), result, webDriver);
    }

    @Override
    @Generated
    public void beforeGetTitle(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeGetTitle(), webDriver);
    }

    @Override
    @Generated
    public void afterGetTitle(final WebDriver webDriver, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetTitle(), webDriver, result);
    }

    @Override
    @Generated
    public void beforeFindElement(final WebDriver webDriver, final By locator) {
        listenTo(AUTO_BEFORE, events.getBeforeFindElement(), webDriver, locator);
    }

    @Override
    @Generated
    public void afterFindElement(final WebDriver webDriver, final By locator, final WebElement result) {
        listenTo(AUTO_AFTER, events.getAfterFindElement(), webDriver, locator, result);
    }

    @Override
    @Generated
    public void beforeFindElements(final WebDriver webDriver, final By locator) {
        listenTo(AUTO_BEFORE, events.getBeforeFindElements(), webDriver, locator);
    }

    @Override
    @Generated
    public void afterFindElements(final WebDriver webDriver, final By locator, final List<WebElement> result) {
        listenTo(AUTO_AFTER, events.getAfterFindElements(), webDriver, locator, result);
    }

    @Override
    @Generated
    public void beforeGetPageSource(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeGetPageSource(), webDriver);
    }

    @Override
    @Generated
    public void afterGetPageSource(final WebDriver webDriver, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetPageSource(), webDriver, result.replace("<", "&lt;").replace(">", "&gt;"));
    }

    @Override
    @Generated
    public void beforeClose(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeClose(), webDriver);
    }

    @Override
    @Generated
    public void afterClose(final WebDriver webDriver) {
        listenTo(AUTO_AFTER, events.getAfterClose(), webDriver);
    }

    @Override
    @Generated
    public void beforeQuit(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeQuit(), webDriver);
    }

    @Override
    @Generated
    public void afterQuit(final WebDriver webDriver) {
        listenTo(AUTO_AFTER, events.getAfterQuit(), webDriver);
    }

    @Override
    @Generated
    public void beforeGetWindowHandles(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeGetWindowHandles(), webDriver);
    }

    @Override
    @Generated
    public void afterGetWindowHandles(final WebDriver webDriver, final Set<String> result) {
        listenTo(AUTO_AFTER, events.getAfterGetWindowHandles(), webDriver, result);
    }

    @Override
    @Generated
    public void beforeGetWindowHandle(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeGetWindowHandle(), webDriver);
    }

    @Override
    @Generated
    public void afterGetWindowHandle(final WebDriver webDriver, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetWindowHandle(), webDriver, result);
    }

    @Override
    @Generated
    public void beforeExecuteScript(final WebDriver webDriver, final String script, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeExecuteScript(), webDriver, script, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterExecuteScript(final WebDriver webDriver, final String script, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterExecuteScript(), webDriver, script, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeExecuteAsyncScript(final WebDriver webDriver, final String script, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeExecuteAsyncScript(), webDriver, script, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterExecuteAsyncScript(final WebDriver webDriver, final String script, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterExecuteAsyncScript(), webDriver, script, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforePerform(final WebDriver webDriver, final Collection<Sequence> actions) {
        listenTo(AUTO_BEFORE, events.getBeforePerform(), webDriver, actions);
    }

    @Override
    @Generated
    public void afterPerform(final WebDriver webDriver, final Collection<Sequence> actions) {
        listenTo(AUTO_AFTER, events.getAfterPerform(), webDriver, actions);
    }

    @Override
    @Generated
    public void beforeResetInputState(final WebDriver webDriver) {
        listenTo(AUTO_BEFORE, events.getBeforeResetInputState(), webDriver);
    }

    @Override
    @Generated
    public void afterResetInputState(final WebDriver webDriver) {
        listenTo(AUTO_AFTER, events.getAfterResetInputState(), webDriver);
    }

    @Override
    @Generated
    public void beforeAnyWebElementCall(final WebElement element, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyWebElementCall(), element, method, element, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyWebElementCall(final WebElement element, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyWebElementCall(), element, method, element, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeClick(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeClick(), element);
    }

    @Override
    @Generated
    public void afterClick(final WebElement element) {
        listenTo(AUTO_AFTER, events.getAfterClick(), element);
    }

    @Override
    @Generated
    public void beforeSubmit(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeSubmit(), element);
    }

    @Override
    @Generated
    public void afterSubmit(final WebElement element) {
        listenTo(AUTO_AFTER, events.getAfterSubmit(), element);
    }

    @Override
    public void beforeSendKeys(final WebElement element, final CharSequence... keysToSend) {
        if (isSecured(keysToSend)) {
            log.debug("Masking keys to send to @Secured webElement");
            listenTo(AUTO_BEFORE, events.getBeforeSendKeys(), element, "[***]");

            return;
        }

        listenTo(AUTO_BEFORE, events.getBeforeSendKeys(), element, Arrays.toString(keysToSend));
    }

    @Override
    public void afterSendKeys(final WebElement element, final CharSequence... keysToSend) {
        if (isSecured(keysToSend)) {
            log.debug("Masking keys sent to @Secured webElement");
            listenTo(AUTO_AFTER, events.getAfterSendKeys(), element, "[***]");

            return;
        }

        listenTo(AUTO_AFTER, events.getAfterSendKeys(), element, Arrays.toString(keysToSend));
    }

    @Override
    @Generated
    public void beforeClear(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeClear(), element);
    }

    @Override
    @Generated
    public void afterClear(final WebElement element) {
        listenTo(AUTO_AFTER, events.getAfterClear(), element);
    }

    @Override
    @Generated
    public void beforeGetTagName(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeGetTagName(), element);
    }

    @Override
    @Generated
    public void afterGetTagName(final WebElement element, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetTagName(), element, result);
    }

    @Override
    @Generated
    public void beforeGetAttribute(final WebElement element, final String name) {
        listenTo(AUTO_BEFORE, events.getBeforeGetAttribute(), element, name);
    }

    @Override
    @Generated
    public void afterGetAttribute(final WebElement element, final String name, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetAttribute(), element, name, result);
    }

    @Override
    @Generated
    public void beforeIsSelected(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeIsSelected(), element);
    }

    @Override
    @Generated
    public void afterIsSelected(final WebElement element, final boolean result) {
        listenTo(AUTO_AFTER, events.getAfterIsSelected(), element, result);
    }

    @Override
    @Generated
    public void beforeIsEnabled(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeIsEnabled(), element);
    }

    @Override
    @Generated
    public void afterIsEnabled(final WebElement element, final boolean result) {
        listenTo(AUTO_AFTER, events.getAfterIsEnabled(), element, result);
    }

    @Override
    @Generated
    public void beforeGetText(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeGetText(), element);
    }

    @Override
    @Generated
    public void afterGetText(final WebElement element, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetText(), element, result);
    }

    @Override
    @Generated
    public void beforeFindElement(final WebElement element, final By locator) {
        listenTo(AUTO_BEFORE, events.getBeforeFindWebElement(), element, locator);
    }

    @Override
    @Generated
    public void afterFindElement(final WebElement element, final By locator, final WebElement result) {
        listenTo(AUTO_AFTER, events.getAfterFindWebElement(), element, locator, result);
    }

    @Override
    @Generated
    public void beforeFindElements(final WebElement element, final By locator) {
        listenTo(AUTO_BEFORE, events.getBeforeFindWebElements(), element, locator);
    }

    @Override
    @Generated
    public void afterFindElements(final WebElement element, final By locator, final List<WebElement> result) {
        listenTo(AUTO_AFTER, events.getAfterFindWebElements(), element, locator, result);
    }

    @Override
    @Generated
    public void beforeIsDisplayed(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeIsDisplayed(), element);
    }

    @Override
    @Generated
    public void afterIsDisplayed(final WebElement element, final boolean result) {
        listenTo(AUTO_AFTER, events.getAfterIsDisplayed(), element, result);
    }

    @Override
    @Generated
    public void beforeGetLocation(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeGetLocation(), element);
    }

    @Override
    @Generated
    public void afterGetLocation(final WebElement element, final Point result) {
        listenTo(AUTO_AFTER, events.getAfterGetLocation(), element, result);
    }

    @Override
    @Generated
    public void beforeGetSize(final WebElement element) {
        listenTo(AUTO_BEFORE, events.getBeforeGetSize(), element);
    }

    @Override
    @Generated
    public void afterGetSize(final WebElement element, final Dimension result) {
        listenTo(AUTO_AFTER, events.getAfterGetSize(), element, result);
    }

    @Override
    @Generated
    public void beforeGetCssValue(final WebElement element, final String propertyName) {
        listenTo(AUTO_BEFORE, events.getBeforeGetCssValue(), element, propertyName);
    }

    @Override
    @Generated
    public void afterGetCssValue(final WebElement element, final String propertyName, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetCssValue(), element, propertyName, result);
    }

    @Override
    @Generated
    public void beforeAnyNavigationCall(final WebDriver.Navigation navigation, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyNavigationCall(), navigation, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyNavigationCall(final WebDriver.Navigation navigation, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyNavigationCall(), navigation, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeTo(final WebDriver.Navigation navigation, final String url) {
        listenTo(AUTO_BEFORE, events.getBeforeTo(), navigation, url);
    }

    @Override
    @Generated
    public void afterTo(final WebDriver.Navigation navigation, final String url) {
        listenTo(AUTO_AFTER, events.getAfterTo(), navigation, url);
    }

    @Override
    @Generated
    public void beforeTo(final WebDriver.Navigation navigation, final URL url) {
        listenTo(AUTO_BEFORE, events.getBeforeTo(), navigation, url);
    }

    @Override
    @Generated
    public void afterTo(final WebDriver.Navigation navigation, final URL url) {
        listenTo(AUTO_AFTER, events.getAfterTo(), navigation, url);
    }

    @Override
    @Generated
    public void beforeBack(final WebDriver.Navigation navigation) {
        listenTo(AUTO_BEFORE, events.getBeforeBack(), navigation);
    }

    @Override
    @Generated
    public void afterBack(final WebDriver.Navigation navigation) {
        listenTo(AUTO_AFTER, events.getAfterBack(), navigation);
    }

    @Override
    @Generated
    public void beforeForward(final WebDriver.Navigation navigation) {
        listenTo(AUTO_BEFORE, events.getBeforeForward(), navigation);
    }

    @Override
    @Generated
    public void afterForward(final WebDriver.Navigation navigation) {
        listenTo(AUTO_AFTER, events.getAfterForward(), navigation);
    }

    @Override
    @Generated
    public void beforeRefresh(final WebDriver.Navigation navigation) {
        listenTo(AUTO_BEFORE, events.getBeforeRefresh(), navigation);
    }

    @Override
    @Generated
    public void afterRefresh(final WebDriver.Navigation navigation) {
        listenTo(AUTO_AFTER, events.getAfterRefresh(), navigation);
    }

    @Override
    @Generated
    public void beforeAnyAlertCall(final Alert alert, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyAlertCall(), alert, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyAlertCall(final Alert alert, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyAlertCall(), alert, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeAccept(final Alert alert) {
        listenTo(AUTO_BEFORE, events.getBeforeAccept(), alert);
    }

    @Override
    @Generated
    public void afterAccept(final Alert alert) {
        listenTo(AUTO_AFTER, events.getAfterAccept(), alert);
    }

    @Override
    @Generated
    public void beforeDismiss(final Alert alert) {
        listenTo(AUTO_BEFORE, events.getBeforeDismiss(), alert);
    }

    @Override
    @Generated
    public void afterDismiss(final Alert alert) {
        listenTo(AUTO_AFTER, events.getAfterDismiss(), alert);
    }

    @Override
    @Generated
    public void beforeGetText(final Alert alert) {
        listenTo(AUTO_BEFORE, events.getBeforeGetText(), alert);
    }

    @Override
    @Generated
    public void afterGetText(final Alert alert, final String result) {
        listenTo(AUTO_AFTER, events.getAfterGetText(), alert, result);
    }

    @Override
    @Generated
    public void beforeSendKeys(final Alert alert, final String text) {
        listenTo(AUTO_BEFORE, events.getBeforeSendKeys(), alert, text);
    }

    @Override
    @Generated
    public void afterSendKeys(final Alert alert, final String text) {
        listenTo(AUTO_AFTER, events.getAfterSendKeys(), alert, text);
    }

    @Override
    @Generated
    public void beforeAnyOptionsCall(final WebDriver.Options options, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyOptionsCall(), options, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyOptionsCall(final WebDriver.Options options, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyOptionsCall(), options, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeAddCookie(final WebDriver.Options options, final Cookie cookie) {
        listenTo(AUTO_BEFORE, events.getBeforeAddCookie(), options, cookie);
    }

    @Override
    @Generated
    public void afterAddCookie(final WebDriver.Options options, final Cookie cookie) {
        listenTo(AUTO_AFTER, events.getAfterAddCookie(), options, cookie);
    }

    @Override
    @Generated
    public void beforeDeleteCookieNamed(final WebDriver.Options options, final String name) {
        listenTo(AUTO_BEFORE, events.getBeforeDeleteCookieNamed(), options, name);
    }

    @Override
    @Generated
    public void afterDeleteCookieNamed(final WebDriver.Options options, final String name) {
        listenTo(AUTO_AFTER, events.getAfterDeleteCookieNamed(), options, name);
    }

    @Override
    @Generated
    public void beforeDeleteCookie(final WebDriver.Options options, final Cookie cookie) {
        listenTo(AUTO_BEFORE, events.getBeforeDeleteCookie(), options, cookie);
    }

    @Override
    @Generated
    public void afterDeleteCookie(final WebDriver.Options options, final Cookie cookie) {
        listenTo(AUTO_AFTER, events.getAfterDeleteCookie(), options, cookie);
    }

    @Override
    @Generated
    public void beforeDeleteAllCookies(final WebDriver.Options options) {
        listenTo(AUTO_BEFORE, events.getBeforeDeleteAllCookies(), options);
    }

    @Override
    @Generated
    public void afterDeleteAllCookies(final WebDriver.Options options) {
        listenTo(AUTO_AFTER, events.getAfterDeleteAllCookies(), options);
    }

    @Override
    @Generated
    public void beforeGetCookies(final WebDriver.Options options) {
        listenTo(AUTO_BEFORE, events.getBeforeGetCookies(), options);
    }

    @Override
    @Generated
    public void afterGetCookies(final WebDriver.Options options, final Set<Cookie> result) {
        listenTo(AUTO_AFTER, events.getAfterGetCookies(), options, result);
    }

    @Override
    @Generated
    public void beforeGetCookieNamed(final WebDriver.Options options, final String name) {
        listenTo(AUTO_BEFORE, events.getBeforeGetCookieNamed(), options, name);
    }

    @Override
    @Generated
    public void afterGetCookieNamed(final WebDriver.Options options, final String name, final Cookie result) {
        listenTo(AUTO_AFTER, events.getAfterGetCookieNamed(), options, name, result);
    }

    @Override
    @Generated
    public void beforeAnyTimeoutsCall(final WebDriver.Timeouts timeouts, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyTimeoutsCall(), timeouts, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyTimeoutsCall(final WebDriver.Timeouts timeouts, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyTimeoutsCall(), timeouts, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeImplicitlyWait(final WebDriver.Timeouts timeouts, final Duration duration) {
        listenTo(AUTO_BEFORE, events.getBeforeImplicitlyWait(), timeouts, duration);
    }

    @Override
    @Generated
    public void afterImplicitlyWait(final WebDriver.Timeouts timeouts, final Duration duration) {
        listenTo(AUTO_AFTER, events.getAfterImplicitlyWait(), timeouts, duration);
    }

    @Override
    @Generated
    public void beforeSetScriptTimeout(final WebDriver.Timeouts timeouts, final Duration duration) {
        listenTo(AUTO_BEFORE, events.getBeforeSetScriptTimeout(), timeouts, duration);
    }

    @Override
    @Generated
    public void afterSetScriptTimeout(final WebDriver.Timeouts timeouts, final Duration duration) {
        listenTo(AUTO_AFTER, events.getAfterSetScriptTimeout(), timeouts, duration);
    }

    @Override
    @Generated
    public void beforePageLoadTimeout(final WebDriver.Timeouts timeouts, final Duration duration) {
        listenTo(AUTO_BEFORE, events.getBeforePageLoadTimeout(), timeouts, duration);
    }

    @Override
    @Generated
    public void afterPageLoadTimeout(final WebDriver.Timeouts timeouts, final Duration duration) {
        listenTo(AUTO_AFTER, events.getAfterPageLoadTimeout(), timeouts, duration);
    }

    @Override
    @Generated
    public void beforeAnyWindowCall(final WebDriver.Window window, final Method method, final Object[] args) {
        listenTo(AUTO_BEFORE, events.getBeforeAnyWindowCall(), window, method, Arrays.toString(args));
    }

    @Override
    @Generated
    public void afterAnyWindowCall(final WebDriver.Window window, final Method method, final Object[] args, final Object result) {
        listenTo(AUTO_AFTER, events.getAfterAnyWindowCall(), window, method, Arrays.toString(args), result);
    }

    @Override
    @Generated
    public void beforeGetSize(final WebDriver.Window window) {
        listenTo(AUTO_BEFORE, events.getBeforeGetWindowSize(), window);
    }

    @Override
    @Generated
    public void afterGetSize(final WebDriver.Window window, final Dimension result) {
        listenTo(AUTO_AFTER, events.getAfterGetWindowSize(), window, result);
    }

    @Override
    @Generated
    public void beforeSetSize(final WebDriver.Window window, final Dimension size) {
        listenTo(AUTO_BEFORE, events.getBeforeSetSize(), window, size);
    }

    @Override
    @Generated
    public void afterSetSize(final WebDriver.Window window, final Dimension size) {
        listenTo(AUTO_AFTER, events.getAfterSetSize(), window, size);
    }

    @Override
    @Generated
    public void beforeGetPosition(final WebDriver.Window window) {
        listenTo(AUTO_BEFORE, events.getBeforeGetPosition(), window);
    }

    @Override
    @Generated
    public void afterGetPosition(final WebDriver.Window window, final Point result) {
        listenTo(AUTO_AFTER, events.getAfterGetPosition(), window, result);
    }

    @Override
    @Generated
    public void beforeSetPosition(final WebDriver.Window window, final Point position) {
        listenTo(AUTO_BEFORE, events.getBeforeSetPosition(), window, position);
    }

    @Override
    @Generated
    public void afterSetPosition(final WebDriver.Window window, final Point position) {
        listenTo(AUTO_AFTER, events.getAfterSetPosition(), window, position);
    }

    @Override
    @Generated
    public void beforeMaximize(final WebDriver.Window window) {
        listenTo(AUTO_BEFORE, events.getBeforeMaximize(), window);
    }

    @Override
    @Generated
    public void afterMaximize(final WebDriver.Window window) {
        listenTo(AUTO_AFTER, events.getAfterMaximize(), window);
    }

    @Override
    @Generated
    public void beforeFullscreen(final WebDriver.Window window) {
        listenTo(AUTO_BEFORE, events.getBeforeFullscreen(), window);
    }

    @Override
    @Generated
    public void afterFullscreen(final WebDriver.Window window) {
        listenTo(AUTO_AFTER, events.getAfterFullscreen(), window);
    }

    boolean isSecured(final CharSequence... keysToSend) {
        final Matcher matcher = SECURED_PATTERN.matcher(keysToSend[0]);

        if (matcher.find()) {
            keysToSend[0] = matcher.group("key");
            return true;
        }

        return false;
    }
}