パフォーマンス ログ

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 経由)。トレースを有効にするには、Chrome のトレース カテゴリを 1 つ以上指定します。詳しくは、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);

...

トレースが有効になっている場合、Chrome の起動時に ChromeDriver はブラウザ全体のトレースを開始し、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」になります。

利用可能なトレース イベント メソッドは次の 2 つです。

  • tracing.dataCollected: パラメータは、辞書形式の単一のトレース イベントです。
  • tracing.bufferUsage: パラメータには単一のエラーキーが含まれ、テスト中に 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
        }
    }
}