パフォーマンス ログ

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