Chrome DevTools Protocol API

Seleniumバインディングはそれぞれ、さまざまなCDPドメインと機能のためのクラスとメソッドを動的に生成します。これらはChromeの特定のバージョンに関連付けられています。

Selenium 4はChrome DevTools Protocol(CDP)への直接アクセスを提供しますが、これらのメソッドは最終的に削除されます。将来の互換性を確保するために、可能な限りWebDriver BiDi APIメソッドを使用することをお勧めします。

使用方法

ユースケースがWebDriver BiDiまたはBiDi APIによって実装されている場合は、この実装ではなく、それらの実装を使用する必要があります。 特にRubyでは、CDPエンドポイントで実行するよりも、一般的にこのアプローチを優先する必要があります。

代替実装は、CDPエンドポイントCookieの設定にあります。

Javaではすべてのパラメータを使用した例を使用する必要があるため、CDPエンドポイントCookieの設定で使用されているMapアプローチの方が簡単かもしれません。

    devTools = ((HasDevTools) driver).getDevTools();
    devTools.createSession();

    devTools.send(
        Network.setCookie(
            "cheese",
            "gouda",
            Optional.empty(),
            Optional.of("www.selenium.dev"),
            Optional.empty(),
            Optional.of(true),
            Optional.empty(),
            Optional.empty(),
            Optional.empty(),
            Optional.empty(),
            Optional.empty(),
            Optional.empty(),
            Optional.empty(),
            Optional.empty()));

Pythonではこの例に非同期メソッドを使用する必要があるため、CDPエンドポイントCookieの設定にある同期アプローチの方が簡単かもしれません。

    async with driver.bidi_connection() as connection:
        execution = connection.devtools.network.set_cookie(
            name="cheese",
            value="gouda",
            domain="www.selenium.dev",
            secure=True
        )

        await connection.session.execute(execution)

.NETではドメインを取得してawaitで実行することの複雑さが増すため、CDPエンドポイントCookieの設定の方が簡単かもしれません。

            var session = ((IDevTools)driver).GetDevToolsSession();
            var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V121.DevToolsSessionDomains>();
            await domains.Network.Enable(new OpenQA.Selenium.DevTools.V121.Network.EnableCommandSettings());

            var cookieCommandSettings = new SetCookieCommandSettings
            {
                Name = "cheese",
                Value = "gouda",
                Domain = "www.selenium.dev",
                Secure = true
            };

            await domains.Network.SetCookie(cookieCommandSettings);
    driver.devtools.network.set_cookie(name: 'cheese',
                                       value: 'gouda',
                                       domain: 'www.selenium.dev',
                                       secure: true)

パフォーマンス測定基準

代替実装は、CDPエンドポイントパフォーマンス測定基準にあります。

    devTools = ((HasDevTools) driver).getDevTools();
    devTools.createSession();
    devTools.send(Performance.enable(Optional.empty()));

    List<Metric> metricList = devTools.send(Performance.getMetrics());

Pythonではこの例に非同期メソッドを使用する必要があるため、CDPエンドポイントパフォーマンス測定基準にある同期アプローチの方が簡単かもしれません。

    async with driver.bidi_connection() as connection:
        await connection.session.execute(connection.devtools.performance.enable())

        metric_list = await connection.session.execute(connection.devtools.performance.get_metrics())

.NETではドメインを取得してawaitで実行することの複雑さが増すため、CDPエンドポイントパフォーマンス測定基準の方が簡単かもしれません。

            var session = ((IDevTools)driver).GetDevToolsSession();
            var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V121.DevToolsSessionDomains>();
            await domains.Performance.Enable(new OpenQA.Selenium.DevTools.V121.Performance.EnableCommandSettings());

            var metricsResponse =
                await session.SendCommand<GetMetricsCommandSettings, GetMetricsCommandResponse>(
                    new GetMetricsCommandSettings()
                );
    driver.devtools.performance.enable

    metric_list = driver.devtools.performance.get_metrics.dig('result', 'metrics')

ベーシック認証

代替実装は、CDPエンドポイントベーシック認証BiDi APIベーシック認証にあります。

BiDi APIベーシック認証実装が推奨されます。

    devTools = ((HasDevTools) driver).getDevTools();
    devTools.createSession();
    devTools.send(Network.enable(Optional.of(100000), Optional.of(100000), Optional.of(100000)));

    String encodedAuth = Base64.getEncoder().encodeToString("admin:admin".getBytes());
    Map<String, Object> headers = ImmutableMap.of("Authorization", "Basic " + encodedAuth);

    devTools.send(Network.setExtraHTTPHeaders(new Headers(headers)));

Pythonではこの例に非同期メソッドを使用する必要があるため、CDPエンドポイントベーシック認証にある同期アプローチの方が簡単かもしれません。

    async with driver.bidi_connection() as connection:
        await connection.session.execute(connection.devtools.network.enable())

        credentials = base64.b64encode("admin:admin".encode()).decode()
        auth = {'authorization': 'Basic ' + credentials}

        await connection.session.execute(connection.devtools.network.set_extra_http_headers(Headers(auth)))

.NETではドメインを取得してawaitで実行することの複雑さが増すため、CDPエンドポイントベーシック認証の方が簡単かもしれません。

            var session = ((IDevTools)driver).GetDevToolsSession();
            var domains = session.GetVersionSpecificDomains<OpenQA.Selenium.DevTools.V121.DevToolsSessionDomains>();
            await domains.Network.Enable(new OpenQA.Selenium.DevTools.V121.Network.EnableCommandSettings());

            var encodedAuth = Convert.ToBase64String(Encoding.Default.GetBytes("admin:admin"));
            var headerSettings = new SetExtraHTTPHeadersCommandSettings
            {
                Headers = new Headers()
                {
                    { "authorization", "Basic " + encodedAuth }
                }
            };

            await domains.Network.SetExtraHTTPHeaders(headerSettings);

BiDi APIベーシック認証実装が推奨されます。

    driver.devtools.network.enable

    credentials = Base64.strict_encode64('admin:admin')

    driver.devtools.network.set_extra_http_headers(headers: {authorization: "Basic #{credentials}"})

コンソールログ

コンソールログの読み取りにはイベントリスナーの設定が必要なため、CDPエンドポイント実装では実行できません。代替実装は、BiDi APIコンソールログとエラーWebDriver BiDiコンソールログにあります。

WebDriver BiDiコンソールログ実装を使用してください。

    DevTools devTools = ((HasDevTools) driver).getDevTools();
    devTools.createSession();
    devTools.send(Runtime.enable());

    CopyOnWriteArrayList<String> logs = new CopyOnWriteArrayList<>();
    devTools.addListener(
        Runtime.consoleAPICalled(),
        event -> logs.add((String) event.getArgs().get(0).getValue().orElse("")));

BiDi APIコンソールログとエラー実装を使用してください。

例を追加

BiDi APIコンソールログとエラー実装を使用してください。

例を追加

BiDi APIコンソールログとエラー実装が推奨されます。

    driver.devtools.runtime.enable

    logs = []
    driver.devtools.runtime.on(:console_api_called) do |params|
      logs << params['args'].first['value']
    end

JavaScriptの例外

コンソールログと似ていますが、これはログに記録されたエラーだけでなく、実際のJavaScriptの例外をリスンします。代替実装は、BiDi API JavaScript例外WebDriver BiDi JavaScript例外にあります。

WebDriver BiDi JavaScript例外実装を使用してください。

    DevTools devTools = ((HasDevTools) driver).getDevTools();
    devTools.createSession();
    devTools.send(Runtime.enable());

    CopyOnWriteArrayList<JavascriptException> errors = new CopyOnWriteArrayList<>();
    devTools.getDomains().events().addJavascriptExceptionListener(errors::add);

BiDi API JavaScript例外実装を使用してください。

例を追加

BiDi API JavaScript例外実装を使用してください。

例を追加

BiDi API JavaScript例外実装を使用してください。

例を追加

ダウンロード完了

続行する前に、ダウンロードが完了するまで待ちます。ダウンロードステータスの取得にはリスナーの設定が必要なため、CDPエンドポイント実装では実行できません。

    devTools = ((HasDevTools) driver).getDevTools();
    devTools.createSession();
    devTools.send(
        Browser.setDownloadBehavior(
            Browser.SetDownloadBehaviorBehavior.ALLOWANDNAME,
            Optional.empty(),
            Optional.of(""),
            Optional.of(true)));

    AtomicBoolean completed = new AtomicBoolean(false);
    devTools.addListener(
        Browser.downloadProgress(),
        e -> completed.set(Objects.equals(e.getState().toString(), "completed")));
    driver.devtools.browser.set_download_behavior(behavior: 'allow',
                                                  download_path: '',
                                                  events_enabled: true)

    driver.devtools.browser.on(:download_progress) do |progress|
      @completed = progress['state'] == 'completed'
    end