簡體   English   中英

使用Selenium和Chrome Dev Tools進行瀏覽器內存泄漏自動化

[英]Browser memory leak automation using Selenium and Chrome Dev Tools

我們使用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已經提出了類似的問題,但我還沒有看到很多有用的答案,因此請重新發布更多詳細信息。

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

由於流口水是開源的,你可以在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”條目的性能日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM