【发布时间】:2018-08-08 19:51:02
【问题描述】:
我正在尝试为 RemoteWebDriver 编写一个代理来为 findElement 等方法添加自定义日志记录。作为一个实验,我发现了一个 TimingHandler,它只为方法提供一个开始/停止时间戳 - 它在 selenium 之外工作正常。但是,我无法让它与 RemoteWebDriver 一起使用。
问题: RemoteWebDriver 有什么东西可以阻止使用代理吗? 我执行不正确吗? 有没有不同/更好的方法来做到这一点?
public class TimingDynamicInvocationHandler implements InvocationHandler {
private static final Logger logger = LogManager.getLogger(TimingDynamicInvocationHandler.class.getName());
private final Map<String, Method> methods = new HashMap<>();
private Object target;
public TimingDynamicInvocationHandler(Object target) {
this.target = target;
for(Method method: target.getClass().getDeclaredMethods()) {
System.out.println("TDIHandler method: " + method.getName());
this.methods.put(method.getName(), method);
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("invoke method: " + method.getName());
long start = System.nanoTime();
Object result = methods.get(method.getName()).invoke(target, args);
long elapsed = System.nanoTime() - start;
logger.info("Executing {} finished in {} ns", method.getName(),
elapsed);
return result;
}
}
我正在使用 TestNG 并且我有一个 BaseTest 类,所有测试都由此扩展而来。我使用创建驱动程序的 beforeMethod 。如果没有代理,我会执行以下操作,并且可以按预期工作:
driver = new RemoteWebDriver(new URL(HUB_URL), caps);
driver.get(APP_URL);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
但是,当我更改为使用代理时,它会挂起:
RemoteWebDriver rrDriver = new RemoteWebDriver(new URL(HUB_URL), caps);
TimingDynamicInvocationHandler handler = new TimingDynamicInvocationHandler(rrDriver);
Class<?> proxyClass = Proxy.getProxyClass(WebDriver.class.getClassLoader(), WebDriver.class);
driver = (WebDriver) proxyClass.getConstructor(TimingDynamicInvocationHandler.class).newInstance(handler);
我得到以下输出:
12:06:06.941 [main] ERROR BaseTest 175 beforeMethod - java.lang.NoSuchMethodException: com.sun.proxy.$Proxy22.<init>(com.timr.utils.aop.TimingDynamicInvocationHandler)
【问题讨论】:
标签: java selenium dynamic-proxy