Chrome DevTools Protocol

Selenium での Chrome DevTools Protocol の使用例。CDP サポートは、WebDriver BiDi が実装されるまでの暫定的なものです。

多くのブラウザは「DevTools」を提供しています。これは、開発者がウェブアプリをデバッグしたり、ページのパフォーマンスを調査したりするために使用できる、ブラウザに統合されたツールセットです。Google Chrome の DevTools は、Chrome DevTools Protocol (略して「CDP」) と呼ばれるプロトコルを使用しています。名前が示すように、これはテスト用に設計されたものではなく、安定した API を持つものでもありません。そのため、機能はブラウザのバージョンに大きく依存します。

Selenium は、[WebDriver BiDi] と呼ばれる、標準ベースのクロスブラウザで安定した CDP の代替の実装に取り組んでいます。この新しいプロトコルのサポートが完了するまで、Selenium は適用可能な場合に CDP 機能へのアクセスを提供する予定です。

Selenium で Chrome DevTools Protocol を使用する

Chrome と Edge には、基本的な CDP コマンドを送信する方法があります。これは、双方向通信を必要とする機能では動作しません。また、いつどのドメインを有効にするか、およびドメイン/メソッド/パラメータの正確な名前とタイプを知る必要があります。

    Map<String, Object> cookie = new HashMap<>();
    cookie.put("name", "cheese");
    cookie.put("value", "gouda");
    cookie.put("domain", "www.selenium.dev");
    cookie.put("secure", true);
    ((HasCdp) driver).executeCdpCommand("Network.setCookie", cookie);
    cookie = {'name': 'cheese',
              'value': 'gouda',
              'domain': 'www.selenium.dev',
              'secure': True}

    driver.execute_cdp_cmd('Network.setCookie', cookie)
            var cookie = new Dictionary<string, object>
            {
                { "name", "cheese" },
                { "value", "gouda" },
                { "domain", "www.selenium.dev" },
                { "secure", true }
            };
            ((ChromeDriver)driver).ExecuteCdpCommand("Network.setCookie", cookie);
    driver.execute_cdp('Network.setCookie',
                       name: 'cheese',
                       value: 'gouda',
                       domain: 'www.selenium.dev',
                       secure: true)

CDP の操作を容易にし、より高度な機能へのアクセスを提供するために、Selenium バインディングは、最も一般的なドメインのクラスとメソッドを自動的に生成します。ただし、CDP のメソッドと実装はバージョンごとに変更される可能性があるため、Chrome のバージョンと DevTools のバージョンを一致させる必要があります。Selenium は、常に Chrome の最新 3 バージョンをサポートしており、最新バージョンへのアクセスが利用可能になるようにリリース時期を調整しようとしています。

この制限により、いくつかのバインディングでは追加の課題が生じます。動的に生成される CDP サポートでは、ユーザーは適切なバージョンの CDP を参照するために、定期的にコードを更新する必要があります。場合によっては、ユーザーがコードを変更しなくても、どのバージョンの CDP でも動作するように理想化された実装が作成されていますが、常に利用できるとは限りません。

Selenium テストで CDP を使用する方法の例は、以下のページにあります。ただし、実際的な価値が限られている、一般的に引用される例をいくつか指摘しておきたいと思います。

  • 地理的位置情報 — ほとんどすべてのサイトが IP アドレスを使用して物理的な位置を特定するため、エミュレートされた地理位置情報を設定しても、望ましい効果はほとんどありません。
  • デバイスメトリクスのオーバーライド — Chrome は、オプションクラスでモバイルエミュレーションを設定するための優れた API を提供しており、これは一般的に CDP でこれを行おうとするよりも優れています。

Chrome DevTools のログ機能

CDP を使用したログ機能。

Chrome DevTools のネットワーク機能

CDP を使用したネットワーク機能。

Chrome DevTools のスクリプト機能

CDP を使用したスクリプト機能。