为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

扬帆大鱼 2022-06-23 10:37:55
我们有使用 selenium-chrome-driver 用 Java 编写的现有 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下已经提出了类似的问题,但我还没有看到太多有用的答案,所以再次发布更多详细信息。
查看完整描述

2 回答

?
DIEA

TA贡献1820条经验 获得超3个赞

Selenium 支持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);


查看完整回答
反对 回复 2022-06-23
?
FFIVE

TA贡献1797条经验 获得超6个赞

由于 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”条目的性能日志。


查看完整回答
反对 回复 2022-06-23
  • 2 回答
  • 0 关注
  • 594 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号