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