Java 无法使用EventFiringWebDriver检索WebDriver包装

Java 无法使用EventFiringWebDriver检索WebDriver包装,java,webdriver,selenium-webdriver,dynamic-proxy,Java,Webdriver,Selenium Webdriver,Dynamic Proxy,我有自己的CustomDriver,它扩展了ChromeDriver public CustomDriver extends ChromeDriver 出于某些需要,我将CustomDriver包装在EventFiringWebDriver中。一切正常。但是当我试图在EventFiringWebDriver中打开下面的驱动程序时,我得到了下面的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy14 cannot be cast to co

我有自己的
CustomDriver
,它扩展了
ChromeDriver

public CustomDriver extends ChromeDriver
出于某些需要,我将CustomDriver包装在
EventFiringWebDriver
中。一切正常。但是当我试图在EventFiringWebDriver中打开下面的驱动程序时,我得到了下面的异常

java.lang.ClassCastException: com.sun.proxy.$Proxy14 cannot be cast to com.test.CustomDriver.
下面是我试图打开我的驱动程序的代码

    private CustomDriver extract(EventFiringWebDriver wd) {
        return (CustomDriver)  wd.getWrappedDriver();
    }

任何人都可以帮忙,这是Selenium 2.0的一个bug还是它所需要的功能,如果是,那么我该如何实现它。

在这种情况下,Selenium似乎使用JDK动态代理。这个代理被包装在您的实现周围,有效地隐藏了它。您可以尝试
Proxy.isProxyClass(wd)
进行检查,如果这是真的。一般来说,无法从代理中提取委托,但您可以尝试查看由
proxy.getInvocationHandler(wd)
获取的
InvocationHandler
,您的
CustomDriver
可能会从中提取:

private CustomDriver extract(EventFiringWebDriver wd) {
    if (Proxy.isCroxyClass(wd)){
       InvocationHandler ih = Proxy.getInvocationHandler(wd);
       // examine ih with debugger or reflection, your CustomDriver is likely to be somewhere inside
    }
}

我可以用这种方法实现它。对于我来说,EventFiringWebDriver最终对代理对象做什么并不重要

public class EventFiringWebDriverWrapper extends EventFiringWebDriver {
    private WebDriver driver;

public EventFiringWebDriverWrapper(WebDriver driver) {
    super(driver);
    this.driver= driver;
}

@Override
public WebDriver getWrappedDriver() {
    return driver;

}
}
我可以用这种方法提取,这很好

private CustomDriver extract(EventFiringWebDriverWrapper wd) {
    return  (CustomDriver) wd.getWrappedDriver();
 }

问题已由解决。上面提到的答案只是一种变通。请参考selenium提供的修复程序。

感谢您的快速响应,让我检查并返回。是的,我可以检查,但找不到如何检索它?如果我扩展EventFiringWebDriver,我可以这样做吗?很高兴您已经解决了这个问题。你唯一需要考虑的是线程问题:确保你没有使用一个多线程的驱动程序。这就是为什么实际将代理放在这里-控制引用线程id。是的,你是对的,我有一个管理器,它在Threadlocal上有一个钩子,所以我可以放心处理多个线程