首页 > 解决方案 > 使用 Selenium 和 Chrome 开发工具实现浏览器内存泄漏自动化

问题描述

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

手动,我使用 Chrome 开发工具 - 内存选项卡来完成。进行堆转储,在我开始测试之前,执行测试,然后再次进行堆转储。比较这两个提供堆增量的堆转储。

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

这个概念是否可行,或者我可以出去吃午饭了吗?为什么/为什么不?

另一方面,我遇到了https://github.com/samccone/drool使用它,我可以获得此信息,但问题是我将不得不用 javascript 重写所有现有的 java selenium 测试,除非有我可以将口水与现有的硒测试集成吗?

请建议。

注意: Chrome Dev Tools API 和 Selenium WebDriver下已经提出了类似的问题,但我还没有看到太多有用的答案,所以再次发布更多详细信息。

标签: javaseleniumgoogle-chromeselenium-webdrivergoogle-chrome-devtools

解决方案


Selenium 支持org.openqa.selenium.JavascriptExecutorwindow.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);

推荐阅读