Автоматизация утечки памяти в браузере с помощью Selenium и Chrome Dev Tools - PullRequest
0 голосов
/ 15 февраля 2019

У нас есть существующие веб-тесты, написанные на Java с использованием selenium-chrome-driver.Теперь мы хотим проверить утечки памяти в браузере после выполнения этих тестов.

Вручную, я делаю это с помощью Chrome Dev Tools - вкладка памяти.Возьмите дамп кучи, прежде чем я начну тестирование, выполните тесты, а затем снова возьмите дамп кучи.Сравните эти два дампа кучи, которые дают дельту кучи.

Я не могу найти API-интерфейс selenium-chrome-dev-tools, с помощью которого могу запустить профилировщик памяти Chrome Dev Tool (и, возможно, некоторые другие инструменты), запуститьмои тесты WebDriver (создание экземпляра браузера Chrome, манипулирование элементами DOM и т. д.), а затем остановка профилировщика, а затем проверка результатов профилировщика на наличие утечек памяти.

Является ли эта концепция даже осуществимой илия могу выйти на обед?Почему / почему нет?

С другой стороны, я сталкивался с https://github.com/samccone/drool, используя который, я мог бы получить эту информацию, но проблема в том, что мне придется переписать весь свой существующий Java-селен.тесты в javascript, если нет, я могу интегрировать drool с существующими тестами на селен.

Пожалуйста, предложите.

Примечание: аналогичный вопрос уже задавался в разделе Chrome Dev Tools API и Selenium WebDriver но я пока не вижу много полезного ответа, поэтому пишите снова с более подробной информацией.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

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);
0 голосов
/ 15 февраля 2019

Поскольку 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".

...