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