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