Chrome DevTools 通訊協定 API

Selenium 繫結會動態產生各種 CDP 網域和功能的類別和方法;這些繫結與特定版本的 Chrome 相關。

儘管 Selenium 4 提供直接存取 Chrome DevTools 通訊協定 (CDP),但這些方法最終會移除。建議在可能的情況下使用 WebDriver Bidi API 方法,以確保未來的相容性。

用法

如果你的用例已由 WebDriver BidiBiDi API 實作,你應該使用這些實作,而不是這個實作。通常你應該優先採用這種方法,而不是使用 CDP 端點 執行,特別是在 Ruby 中。

範例

可以在 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 在取得網域和使用等待執行時增加了複雜性,因此 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 主控台記錄和錯誤 實作

    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);

下載完成

在繼續之前,請等待下載完成。由於取得下載狀態需要設定一個偵聽器,因此無法使用 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
上次修改時間:2023 年 11 月 17 日:升級至 Docsy 0 7 2 (#1529) (48f43616907)