首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >代理不工作时,如何记录webdriver调用

代理不工作时,如何记录webdriver调用
EN

Stack Overflow用户
提问于 2018-08-09 03:51:02
回答 1查看 52关注 0票数 0

我正在尝试为RemoteWebDriver编写一个代理,以便为findElement等方法添加自定义日志。作为一个实验,我发现了一个TimingHandler,它只为方法提供开始/停止时间戳-它在selenium之外工作得很好。但是,我不能让它与RemoteWebDriver一起工作。

问: RemoteWebDriver有没有阻止使用代理的东西?我是否错误地实现了这一点?有没有不同的/更好的方法来做这件事?

代码语言:javascript
复制
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来创建驱动程序。在没有代理的情况下,我执行了以下操作,它按预期工作:

代码语言:javascript
复制
 driver = new RemoteWebDriver(new URL(HUB_URL), caps);
 driver.get(APP_URL);
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

但是,当我更改为使用代理时,它会挂起:

代码语言:javascript
复制
    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);

我得到以下输出:

代码语言:javascript
复制
12:06:06.941 [main] ERROR BaseTest 175 beforeMethod - java.lang.NoSuchMethodException: com.sun.proxy.$Proxy22.<init>(com.timr.utils.aop.TimingDynamicInvocationHandler)
EN

回答 1

Stack Overflow用户

发布于 2018-08-09 11:27:19

它认为RemoteWebDriver不是动态代理的一个很好的候选者,因为它已经是selenium客户端org.openqa.selenium.remote.Augmenter.java中的CompoundHandler的一部分,参见: CompoundHandler实现InvocationHandler。

取而代之的是,我选择了一个更简单的解决方案来扩展每个驱动程序类,RemoteWebDriver,ChromeDriver,FirefoxDriver。

代码语言:javascript
复制
public class ChromeLoggingDriver extends ChromeDriver {
  private static final Logger log = LogManager.getLogger(ChromeLoggingDriver.class.getName());

  public ChromeLoggingDriver(ChromeOptions options) {
    super(options);
  } 

  @Override
  public void get(String url) {
    log.info("url: " + url);
    super.get(url);
  }

  @Override
  public String getCurrentUrl() {
    String url = super.getCurrentUrl();
    log.info(url);
    return url;
  }

  @Override
  public String getTitle() {
    String title = super.getTitle();
    log.info(title);
    return title;
  }

  @Override
  public List<WebElement> findElements(By by) {
    log.info(by.toString());
    return super.findElements(by);
  }

  @Override
  public WebElement findElement(By by) {
    log.info(by.toString());
    return super.findElement(by);
  }

  // ... 

  @Override
  public void close() {
    log.info("");
    super.close();
  }

  @Override
  public void quit() {
    log.info("");
    super.quit();
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51754595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档