【问题标题】:How can I log webdriver calls, proxy is not working如何记录 webdriver 调用,代理不工作
【发布时间】: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


    【解决方案1】:

    它认为 RemoteWebDriver 不是动态代理的理想选择,因为它已经是 selenium 客户端 org.openqa.selenium.remote.Augmenter.java 中的 CompoundHandler 的一部分,请参阅:CompoundHandler 实现 InvocationHandler。

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

    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();
      }
    }
    

    【讨论】:

    • 这不是正确的答案。事实证明,FirefoxDriver、ChromeDriver 等驱动程序是从 RemoteWebDriver 扩展而来的,RemoteWebDriver 又实现了 WebDriver 以及许多其他接口:WebDriver、JavascriptExecutor 等。典型的用途是 WebDriver driver = new FirefoxDriver(...),这很有效,因为在某些情况下点驱动程序向上转换回 RemoteWebDriver。我在尝试将我的 WebDriverLogger 转换为 JavaScriptExecutor 时发现了这一点——但失败了。所以我仍在寻找一种提供自定义日志记录的方法。
    • 我修改了上面的代码创建了 3 个独立的日志驱动程序,它们分别扩展了 FirefoxDriver、ChromeDriver、RemoteDriver。此解决方案中有很多重复代码,如果有人有更好的想法,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多