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 中获取域并使用 awaits 执行的复杂性增加,因此 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 中获取域并使用 awaits 执行的复杂性增加,因此 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 中获取域并使用 awaits 执行的复杂性增加,因此 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)