# Chrome DevTools 协议

> 使用 Selenium 操作 Chrome DevTools 协议的示例。 CDP 的支持是临时的，直到 WebDriver BiDi 实现为止。

URL: https://deploy-preview-2977--selenium-dev.netlify.app/zh-cn/documentation/webdriver/bidi/cdp/

---

许多浏览器提供“开发者工具”（DevTools），这是与浏览器集成的一组工具，开发人员可以使用它们来调试网页应用程序并探索网页的性能。Google Chrome 的开发者工具使用一种称为 Chrome DevTools 协议（简称 "CDP"）的协议。顾名思义，该协议并非为测试设计，也没有稳定的 API，因此功能很大程度上取决于浏览器的版本。

Selenium 正在致力于实现一种基于标准的、跨浏览器的、稳定的 CDP 替代方案，称为 [WebDriver BiDi]。在对该新协议的支持完成之前，Selenium 计划在适用的地方提供对 CDP 功能的访问。

### 在 Selenium 中使用 Chrome DevTools 协议

Chrome 和 Edge 提供了发送基本 CDP 命令的方法。
但对于需要双向通信的功能，这种方法无效。你需要知道在何时启用哪些域，以及域、方法和参数的确切名称和类型。

**Java**

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

**Python**

```python
cookie = {'name': 'cheese',
          'value': 'gouda',
          'domain': 'www.selenium.dev',
          'secure': True}

driver.execute_cdp_cmd('Network.setCookie', cookie)
```

**CSharp**

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

**Ruby**

```ruby
driver.execute_cdp('Network.setCookie',
                   name: 'cheese',
                   value: 'gouda',
                   domain: 'www.selenium.dev',
                   secure: true)
```

**JavaScript**

_No example for this language yet ([add one](https://deploy-preview-2977--selenium-dev.netlify.app/zh-cn/documentation/about/contributing/code_examples/index.md#creating-examples))._

**Kotlin**

_No example for this language yet ([add one](https://deploy-preview-2977--selenium-dev.netlify.app/zh-cn/documentation/about/contributing/code_examples/index.md#creating-examples))._

为简化 CDP 的使用并提供对更高级功能的访问，Selenium 绑定会自动为最常见的域生成类和方法。  
不过，CDP 方法和实现可能会因版本而异，因此你需要确保 Chrome 版本和 DevTools 版本相匹配。  
Selenium 在任何时间点支持 Chrome 的最近三个版本，并且尽量同步发布以确保可以访问最新版本。

这种限制给一些绑定带来了额外的挑战，动态生成的 CDP 支持要求用户定期更新代码，以引用正确版本的 CDP。  
在某些情况下，已创建了一个理想化的实现，它应该适用于任何版本的 CDP，而无需用户更改代码，但这并非总是可用。

关于如何在 Selenium 测试中使用 CDP 的示例可以在以下页面找到，但我们想提到一些常被引用但实际价值有限的例子：
* **地理位置** ——几乎所有网站都使用 IP 地址来确定物理位置，因此设置模拟地理位置很少能达到预期效果。
* **覆盖设备指标** ——Chrome 提供了一个很棒的 API 来在 Options 类中设置[移动模拟](https://chromedriver.chromium.org/mobile-emulation)，这通常比尝试使用 CDP 更优越。

---

Section pages:

- [Chrome DevTools Logging Features](https://deploy-preview-2977--selenium-dev.netlify.app/zh-cn/documentation/webdriver/bidi/cdp/logging/index.md): Logging features using CDP.
- [Chrome DevTools Network Features](https://deploy-preview-2977--selenium-dev.netlify.app/zh-cn/documentation/webdriver/bidi/cdp/network/index.md): Network features using CDP.
- [Chrome DevTools Script Features](https://deploy-preview-2977--selenium-dev.netlify.app/zh-cn/documentation/webdriver/bidi/cdp/script/index.md): Script features using CDP.
