观察通过Selenium驱动程序实例执行的所有操作

时间:2018-12-03 10:09:00

标签: java selenium selenium-webdriver

我想知道是否有一种方法可以观察通过Selenium驱动程序实例执行的所有操作,例如“真实”用户操作,例如单击。最初,我考虑过为WebDriver创建一个包装器,该包装器返回WebElement的包装器,在这里我可以观察到click()sendKeys(CharSequence...)之类的方法。像这样:

class WrappingDriver implements WebDriver {

    private final WebDriver wrapped;
    private final List<Consumer<Action>> consumers;

    public WrappingDriver( final WebDriver wrapped, final List<Consumer<Action>> consumers ) {
        this.wrapped = wrapped;
        this.consumers = consumers;
    }

    @Override
    public WebElement findElement( final By by ) {
        return new WrappingElement( wrapped.findElement( by ), consumers );
    }

    @Override
    public List<WebElement> findElements( final By by ) {
        return wrapped.findElements( by ).stream() //
                .map( element -> new WrappingElement( element, consumers ) ) //
                .collect( Collectors.toList() );
    }

    // ...

}

并且:

class WrappingElement implements WebElement {

    private final WebElement wrapped;
    private final List<Consumer<Action>> consumers;

    public WrappingElement( final WebElement wrapped, final List<Consumer<Action>> consumers ) {
        this.wrapped = wrapped;
        this.consumers = consumers;
    }

    @Override
    public void click() {
        consumers.forEach( consumer -> ... );
        wrapped.click();
    }

    @Override
    public void sendKeys( final CharSequence... keysToSend ) {
        consumers.forEach( consumer -> ... );
        wrapped.sendKeys( keysToSend );
    }

    // ...

}

但是,这不适用于新的交互API。有什么建议吗?

编辑EventFiringWebDriverWebDriverEventListener似乎是一个不错的选择。但是,如果我理解正确,目前没有办法观察submit()吗? (自2015年以来,至少this PR似乎已经开放。)我要求一种观察所有行为的方法,因此,我认为Java Wait for a HTML element and record the mouse click through WebDriverEventListener不能完全回答这个问题

2 个答案:

答案 0 :(得分:1)

EventFiringWebDriver是您所需要的。

有一个使用方法的示例:http://toolsqa.com/selenium-webdriver/event-listener/

这个想法是您创建EventFiringWebDriver并由驱动程序启动它。然后,您可以在各处而不是您的驱动程序使用EventFiringWebDriver的实例。对于EventFiringWebDriver,您创建的事件实际上可以为您做所有的事情。

更新

有可以使用的事件列表:https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/events/WebDriverEventListener.html

答案 1 :(得分:0)

正如 this comment on GitHub 中所指出的,现在有一个 EventFiringDecorator 允许观察所有 WebDriver 调用。 Javadoc:

<块引用>

此装饰器围绕任意 WebDriver 实例创建一个包装器,通知注册的侦听器有关此 WebDriver 和派生对象(例如 WebElementAlert)中发生的事件。

请注意,这尚未发布(最新版本:selenium-4.0.0-alpha-7)。