我想知道是否有一种方法可以观察通过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。有什么建议吗?
编辑:EventFiringWebDriver
,WebDriverEventListener
似乎是一个不错的选择。但是,如果我理解正确,目前没有办法观察submit()
吗? (自2015年以来,至少this PR似乎已经开放。)我要求一种观察所有行为的方法,因此,我认为Java Wait for a HTML element and record the mouse click through WebDriverEventListener不能完全回答这个问题
答案 0 :(得分:1)
EventFiringWebDriver是您所需要的。
有一个使用方法的示例:http://toolsqa.com/selenium-webdriver/event-listener/
这个想法是您创建EventFiringWebDriver并由驱动程序启动它。然后,您可以在各处而不是您的驱动程序使用EventFiringWebDriver的实例。对于EventFiringWebDriver,您创建的事件实际上可以为您做所有的事情。
更新:
答案 1 :(得分:0)
正如 this comment on GitHub 中所指出的,现在有一个 EventFiringDecorator
允许观察所有 WebDriver
调用。 Javadoc:
此装饰器围绕任意 WebDriver
实例创建一个包装器,通知注册的侦听器有关此 WebDriver 和派生对象(例如 WebElement
和 Alert
)中发生的事件。
请注意,这尚未发布(最新版本:selenium-4.0.0-alpha-7
)。