パフォーマンス ログ

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 機能(ChromeOptions 経由)を使用できます。トレースするには、1 つ以上の Chrome トレース カテゴリを指定します。詳しくは、Chrome トレースをご覧ください。

トレースが無効になっている場合、タイムライン ドメインは暗黙的に無効になります。loggingPrefs 機能を使用してパフォーマンス ログを有効にする必要があります。

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.
}

method 値は、DevTools イベントのメソッドです。たとえば、タイムライン イベントには、バージョン 1.1(この記事の執筆時点での最新バージョン)までのすべてのバージョンのプロトコルで Timeline.eventRecorded というメソッドがあります。

トレースログエントリ

トレース機能は、バージョン 1.1 時点では公開されている DevTools プロトコルの一部ではないため、詳細はここで説明します。

すべてのトレース イベントのウェブビュー値は「ブラウザ」です。これは、イベントがブラウザ全体で収集されるためです。

トレース イベントの方法は 2 つあります。

  • 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
    }
  }
}