性能日志

ChromeDriver 支持性能日志记录,您可以通过该日志获取“时间轴”“网络”和“网页”网域的事件,以及指定轨迹类别的轨迹数据

启用性能日志

默认情况下,系统不会启用性能日志记录功能。因此,在创建新会话时,您必须启用此功能。

DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);

启用后,性能日志会收集时间轴、网络和网页事件。如需同时启用跟踪功能或自定义性能日志记录,请继续阅读。

查看由 Michael Klepikov 撰写的使用默认选项的性能日志记录完整示例

Angular Benchpress 也使用性能日志记录。

跟踪和自定义日志记录

如果您需要自定义性能日志记录(例如启用跟踪),可以使用 perfLoggingPrefs capability(通过 ChromeOptions)。您可以通过指定一个或多个 Chrome 轨迹类别来启用轨迹功能。详细了解 Chrome 跟踪

启用轨迹后,系统会隐式停用时间轴网域。您仍然需要使用 loggingPrefs capability 启用性能日志。

DesiredCapabilities cap = DesiredCapabilities.chrome();
LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);
Map<String, Object> perfLogPrefs = new HashMap<String, Object>();
perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools"); // comma-separated trace categories
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs);
caps.setCapability(ChromeOptions.CAPABILITY, options);
RemoteWebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:9515"), cap);

您还可以使用 perfLoggingPrefs 分别启用或停用“广告联盟”和“网页”网域。例如,您可以在跟踪时明确启用“网络”网域:

...

Map<String, Object> perfLogPrefs = new HashMap<String, Object>();
perfLogPrefs.put("traceCategories", "browser,devtools.timeline,devtools");
perfLogPrefs.put("enableNetwork", true);
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("perfLoggingPrefs", perfLogPrefs);
caps.setCapability(ChromeOptions.CAPABILITY, options);

...

如果启用了跟踪功能,ChromeDriver 会在 Chrome 启动时启动全浏览器跟踪,并会一直跟踪到 Chrome 关闭为止。跟踪记录正在运行时,Chrome 会在内存中缓冲跟踪记录事件,直到跟踪记录停止。

跟踪缓冲区满后,系统将不再记录跟踪事件。为了避免缓冲区满载(从而丢失轨迹数据),ChromeDriver 会定期停止当前轨迹,收集缓冲的事件,并在测试期间的特定时间点重新启动轨迹跟踪。

收集轨迹事件可能会增加测试开销,因此 ChromeDriver 仅会在测试期间的适当时间收集轨迹事件。只有在页面导航事件发生时以及请求任何 ChromeDriver 日志(例如性能日志)时,才会收集轨迹事件。

缓冲区始终有可能填满,因此 ChromeDriver 会监控受支持的 Chrome 版本(r263512 及更高版本)的缓冲区用量。如果缓冲区已满,ChromeDriver 会记录一条警告,并在性能日志中添加一条条目。

收集日志条目

在测试中,您可以获取性能日志条目。如需了解详情,请参阅 WebDriver 日志记录文档

for (LogEntry entry : driver.manage().logs().get(LogType.PERFORMANCE)) {
  System.out.println(entry.toString());
}

每个条目都是一个采用以下结构的 JSON 字符串:

{
  "webview": <originating WebView ID>,
  "message": { "method": "...", "params": { ... }} // DevTools message.
}

方法值是 DevTools 事件的方法。例如,时间轴事件的所有版本(包括版本 1.1 在内,这是本文撰写时的最新版本)均采用 Timeline.eventRecorded 方法。

轨迹日志条目

从版本 1.1 开始,跟踪不属于已发布的 DevTools 协议的一部分,因此我们在此处提供了详细信息。

由于这些事件是全浏览器收集的,因此所有轨迹事件的 WebView 值均为“browser”。

有两种可能的轨迹事件方法:

  • tracing.dataCollected:params 是字典形式的单个轨迹事件。
  • tracing.bufferUsage:params 包含一个错误键,其中包含一条消息,指示 DevTools 轨迹缓冲区在测试期间已填满。

下面是一个轨迹事件示例:

{
  "webview":"browser",
  "message":{
    "method":"Tracing.dataCollected",
    "params":{
      "args":{"layerTreeId":1},
      "cat":"cc,devtools",
      "name":"DrawFrame",
      "ph":"i",
      "pid":11405,
      "s":"t",
      "tid":11405,
      "ts":3846117219.0,
      "tts":1134680
    }
  }
}