Files
chill_notes/AI工程/ChromeDevTools与CDP协议完全指南.md
2026-04-25 00:32:04 +08:00

425 lines
9.2 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Chrome DevTools 与 CDP 协议完全指南
> Chrome DevTools 开发者工具 + Chrome DevTools Protocol (CDP) 协议深度研究
>
> 归档2026-04-25
---
## 📊 生态概览
| 项目 | Stars | 定位 |
|------|-------|------|
| **Puppeteer** | 94,185 | Google 官方 Node.js CDP 库 |
| **Playwright** | 87,219 | 微软多浏览器自动化框架 |
| **go-rod/rod** | 6,881 | Go 语言 CDP 驱动 |
| **CDP 协议仓库** | 1,476 | 官方协议定义 |
| **cdpnetool** | 336 | CDP 网络调试工具 |
| **ichrome** | 259 | Python CDP 控制器 |
---
## 🎯 Chrome DevTools 是什么
**Chrome DevTools** 是 Chrome/Chromium 浏览器内置的**开发者调试工具集**,提供:
- DOM/CSS 检查与编辑
- JavaScript 调试与性能分析
- 网络请求监控与拦截
- 内存泄漏检测
- 移动端模拟
**底层协议CDPChrome DevTools Protocol**
CDP 是 DevTools 的**通信协议**,允许外部工具通过 WebSocket 与浏览器交互,实现:
- 自动化测试
- 网页爬取
- 性能监控
- 安全审计
---
## 🔌 CDP 协议架构
### 核心概念
```
外部工具Puppeteer/Playwright/自定义)
↓ WebSocket
Chrome DevTools Protocol (CDP)
Chromium 浏览器内核
```
- **Domain**功能分类Network、DOM、Page 等)
- **Command命令**:工具→浏览器的请求
- **Event事件**:浏览器→工具的通知
- **Type类型**:数据结构定义
### 协议版本
| 版本 | 说明 | 适用场景 |
|------|------|---------|
| **latest (tot)** | 最新版本,频繁变更 | 最新功能探索 |
| **v8-inspector** | Node.js 调试专用 | Node.js 调试 |
| **stable 1.3** | Chrome 64 锁定,向后兼容 | 生产环境 |
---
## 📦 45+ 核心 Domain 分类
### 🔍 页面与 DOM
| Domain | 核心能力 |
|--------|---------|
| **Page** | 页面导航、截图、打印、生命周期管理 |
| **DOM** | DOM 树查询、修改、监听变化 |
| **DOMSnapshot** | 获取完整 DOM 快照 |
| **DOMDebugger** | DOM 事件断点 |
| **DOMStorage** | localStorage/sessionStorage 操作 |
### 🌐 网络
| Domain | 核心能力 |
|--------|---------|
| **Network** | 请求/响应拦截、修改、性能分析 |
| **Fetch** | 请求级拦截与修改Mock API |
| **Security** | 证书、HTTPS、安全状态 |
| **ServiceWorker** | SW 注册/注销/调试 |
### ⚡ 调试与性能
| Domain | 核心能力 |
|--------|---------|
| **Runtime** | JS 执行、对象检查、异常捕获 |
| **Debugger** | 断点、单步执行、调用栈 |
| **Profiler** | CPU 性能分析 |
| **HeapProfiler** | 内存堆分析、泄漏检测 |
| **Performance** | 性能指标采集 |
| **Tracing** | 底层追踪数据 |
### 📱 模拟与仿真
| Domain | 核心能力 |
|--------|---------|
| **Emulation** | 设备模拟、屏幕尺寸、地理位置 |
| **Input** | 模拟鼠标/键盘/触摸输入 |
| **DeviceOrientation** | 模拟设备方向 |
### 🎨 样式与渲染
| Domain | 核心能力 |
|--------|---------|
| **CSS** | 样式表查询、修改、计算样式 |
| **Overlay** | 高亮元素、网格线、滚动条 |
| **LayerTree** | 渲染层分析 |
| **Animation** | 动画检查与控制 |
### 🔧 其他
| Domain | 核心能力 |
|--------|---------|
| **Browser** | 浏览器级操作(版本、窗口管理) |
| **Target** | Tab/Worker 管理 |
| **Log** | 控制台日志捕获 |
| **Console** | 控制台消息 |
| **IO** | 流式数据读写 |
| **Storage** | Cookie、IndexedDB、Cache |
---
## 💻 常用 CDP 命令速查
### 页面操作
```javascript
// 导航到页面
Page.navigate({ url: 'https://example.com' })
// 截图
Page.captureScreenshot({ format: 'png' })
// 打印为 PDF
Page.printToPDF({
landscape: false,
displayHeaderFooter: true
})
```
### 网络拦截
```javascript
// 启用网络域
Network.enable()
// 拦截并修改请求
Fetch.enable({
patterns: [{ urlPattern: '*', requestStage: 'Request' }]
})
// 修改请求头
Fetch.continueRequest({
requestId,
headers: [{ name: 'User-Agent', value: 'Custom' }]
})
// Mock 响应
Fetch.fulfillRequest({
requestId,
responseCode: 200,
body: btoa(JSON.stringify({ mock: true }))
})
```
### JS 执行
```javascript
// 执行 JS
Runtime.evaluate({
expression: 'document.title'
})
// 设置断点
Debugger.enable()
Debugger.setBreakpoint({
location: {
scriptId: '1',
lineNumber: 10
}
})
```
### 设备模拟
```javascript
// 模拟 iPhone
Emulation.setDeviceMetricsOverride({
width: 375,
height: 812,
deviceScaleFactor: 3,
mobile: true
})
// 模拟地理位置
Emulation.setGeolocationOverride({
latitude: 39.9042,
longitude: 116.4074
})
```
### DOM 操作
```javascript
// 获取 DOM 树
DOM.getDocument({ depth: 2 })
// 查询元素
DOM.querySelector({
nodeId: 1,
selector: '.my-class'
})
// 修改属性
DOM.setAttributeValue({
nodeId: 42,
name: 'class',
value: 'new-class'
})
```
---
## 🛠️ 主流 CDP 库对比
### Puppeteer官方推荐
```javascript
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });
await browser.close();
```
| 特性 | 说明 |
|------|------|
| **语言** | Node.js |
| **维护** | Google 官方 |
| **Stars** | 94k+ |
| **适合** | 爬虫、截图、自动化测试 |
### Playwright多浏览器
```javascript
const { chromium } = require('playwright');
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// 同时支持 Chromium / Firefox / WebKit
```
| 特性 | 说明 |
|------|------|
| **语言** | JS/Python/Java/.NET |
| **维护** | 微软 |
| **Stars** | 87k+ |
| **适合** | 跨浏览器 E2E 测试 |
### go-rodGo 语言)
```go
package main
import "github.com/go-rod/rod"
func main() {
page := rod.New().MustConnect().MustPage("https://example.com")
page.MustElement("input").MustInput("hello")
page.MustScreenshot("example.png")
}
```
| 特性 | 说明 |
|------|------|
| **语言** | Go |
| **Stars** | 6.8k |
| **适合** | Go 生态、高性能爬虫 |
### ichromePython
```python
import asyncio
from ichrome import AsyncChrome
async def main():
async with AsyncChrome() as chrome:
tab = await chrome.connect_tab(0)
await tab.goto('https://example.com')
await tab.screenshot(path='example.png')
asyncio.run(main())
```
| 特性 | 说明 |
|------|------|
| **语言** | Python |
| **Stars** | 259 |
| **适合** | Python 爬虫、自动化 |
---
## 🎯 典型应用场景
### 1. 网页自动化
```
场景:自动填写表单、点击按钮、爬取数据
方案Puppeteer / Playwright
关键 APIPage.navigate, Page.click, Page.type
```
### 2. 网络请求拦截
```
场景Mock API 响应、修改请求头
方案Fetch Domain
关键 APIFetch.enable, Fetch.fulfillRequest
```
### 3. 性能分析
```
场景:检测页面加载性能、内存泄漏
方案Performance + HeapProfiler Domain
关键 APIPerformance.getMetrics, HeapProfiler.takeHeapSnapshot
```
### 4. 移动端测试
```
场景:模拟手机设备访问
方案Emulation Domain
关键 APIEmulation.setDeviceMetricsOverride
```
### 5. 安全审计
```
场景:检测 XSS、检查 HTTPS
方案Security + DOMDebugger Domain
关键 APISecurity.getSecurityState, DOMDebugger.setDOMBreakpoint
```
---
## 🔧 开发调试技巧
### 启用 Protocol Monitor
1. 打开 DevTools → 设置 ⚙️
2. Experiments → 启用 "Protocol Monitor"
3. More Tools → Protocol monitor
4. 查看所有 CDP 命令和响应
### 直接发送 CDP 命令
```
# 截图
Page.captureScreenshot
# 带参数
{"cmd":"Page.captureScreenshot","args":{"format":"jpeg"}}
```
### 远程调试
```bash
# 启动 Chrome 远程调试
chrome --remote-debugging-port=9222
# 连接 WebSocket
ws://localhost:9222/devtools/page/<pageId>
```
---
## 📊 CDP 在 AI 编程中的应用
| 场景 | CDP 的作用 |
|------|-----------|
| **Superpowers 代码审查** | 通过 CDP 检查页面实际渲染效果 |
| **AI 自动化测试** | 控制浏览器执行 E2E 测试 |
| **网页爬取** | 动态渲染页面的内容提取 |
| **性能优化建议** | CDP 采集真实性能数据 |
| **安全扫描** | 自动检测前端安全问题 |
---
## 🔗 资源
| 资源 | 链接 |
|------|------|
| **CDP 官方文档** | https://chromedevtools.github.io/devtools-protocol/ |
| **Getting Started with CDP** | https://github.com/aslushnikov/getting-started-with-cdp |
| **awesome-chrome-devtools** | https://github.com/ChromeDevTools/awesome-chrome-devtools |
| **Puppeteer** | https://github.com/puppeteer/puppeteer |
| **Playwright** | https://github.com/microsoft/playwright |
| **go-rod** | https://github.com/go-rod/rod |
| **cdpnetool** | https://github.com/241x/cdpnetool |
---
## 💡 与 OpenClaw 的结合点
| 结合方式 | 说明 |
|---------|------|
| **Browser 工具** | OpenClaw 已通过 Playwright 集成 CDP |
| **网页自动化** | 可通过 CDP 控制浏览器完成任务 |
| **性能监控** | CDP 采集数据 → AI 分析建议 |
| **安全审计** | CDP 检测 → AI 生成报告 |
---
*整理:知识库管理员 | 归档2026-04-25*