使用Selenium和Chrome开发工具的浏览器内存泄漏自动化

时间:2019-02-15 13:39:04

标签: java selenium google-chrome selenium-webdriver google-chrome-devtools

我们有使用selenium-chrome-driver用Java编写的现有Web测试用例。 现在,我们要在执行这些测试后检查浏览器内存泄漏。

手动,我可以使用Chrome开发工具-内存标签来做到这一点。进行堆转储,在开始测试之前,请执行测试,然后再次进行堆转储。比较这两个给出堆增量的堆转储。

我找不到selenium-chrome-dev-tools API,无法使用该API启动Chrome Dev Tool内存分析器(可能还有其他一些工具),运行WebDriver测试(实例化Chrome浏览器实例,操作DOM元素)等等),然后停止探查器,然后检查探查器的结果以查看是否存在内存泄漏。

这个概念甚至可行吗,还是我出去吃午餐了?为什么/为什么不呢?

另一方面,我遇到了https://github.com/samccone/drool,可以使用它来获取此信息,但是问题是我必须用javascript重写所有现有的Java硒测试,除非可以将流口水与现有的硒测试结合起来。

请提出建议。

注意:在Chrome Dev Tools API & Selenium WebDriver下已经提出了类似的问题,但是我没有看到太多有用的答案,因此请重新发布以提供更多详细信息。

2 个答案:

答案 0 :(得分:2)

硒支持org.openqa.selenium.JavascriptExecutor。在测试过程中的任何阶段,我们都可以获取window.performance.memory.usedJSHeapSize的值。下面是代码。

  public static void reportMemoryUsage(WebDriver webDriver, String message) {
    ((JavascriptExecutor) webDriver).executeScript("window.gc()");
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        LOGGER.error(e.getLocalizedMessage());
    }
    Double usedJSHeapSize = (Double) ((JavascriptExecutor) webDriver)
            .executeScript("return window.performance.memory.usedJSHeapSize/1024/1024");
    LOGGER.info("Memory Usage at " + message + " - " + usedJSHeapSize + " MB ");
 }

从测试套件中调用此方法,在测试开始时调用一个方法,在测试结束时调用一个方法。 两个usedJSHeapSize值之间的差异将导致内存泄漏。

我在使用usedJSHeapSize之前强制进行垃圾收集,以确保没有收集到任何垃圾信息。要在窗口上启用gc功能,您必须设置-js-flags=--expose-gc选项。

ChromeOptions options = new ChromeOptions();
options.addArguments("-js-flags=--expose-gc");
WebDriver webDriver = new ChromeDriver(options);

答案 1 :(得分:0)

由于drool是开源的,因此您可以在https://github.com/samccone/drool/blob/master/lib/index.js看到它们的实现,并在Java中执行类似的操作:

    ChromeOptions options = new ChromeOptions();

    // Enable performance logging
    LoggingPreferences logPrefs = new LoggingPreferences();
    logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
    options.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

    // Enable timeline tracing
    Map<String, Object> chromeOptions = new HashMap<>();
    Map<String, String> perfLoggingPrefs = new HashMap<>();
    perfLoggingPrefs.put(
        "traceCategories", "v8,blink.console,disabled-by-default-devtools.timeline");
    chromeOptions.put("perfLoggingPrefs", perfLoggingPrefs);
    options.setCapability(ChromeOptions.CAPABILITY, chromeOptions);

    WebDriver driver = new ChromeDriver(options);

...

    LogEntries performanceLogsBefore = driver.manage().logs().get("performance");

...

    LogEntries performanceLogsAfter = driver.manage().logs().get("performance");


然后过滤“ V8.GCScavenger”,“ V8.GCIncrementalMarking”,“ MajorGC”和“ MinorGC”条目的性能日志。