我们有使用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下已经提出了类似的问题,但是我没有看到太多有用的答案,因此请重新发布以提供更多详细信息。
答案 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”条目的性能日志。