Update from Sync Service
This commit is contained in:
425
AI工程/ChromeDevTools与CDP协议完全指南.md
Executable file
425
AI工程/ChromeDevTools与CDP协议完全指南.md
Executable file
@@ -0,0 +1,425 @@
|
|||||||
|
# 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 调试与性能分析
|
||||||
|
- 网络请求监控与拦截
|
||||||
|
- 内存泄漏检测
|
||||||
|
- 移动端模拟
|
||||||
|
|
||||||
|
**底层协议:CDP(Chrome 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-rod(Go 语言)
|
||||||
|
|
||||||
|
```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 生态、高性能爬虫 |
|
||||||
|
|
||||||
|
### ichrome(Python)
|
||||||
|
|
||||||
|
```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
|
||||||
|
关键 API:Page.navigate, Page.click, Page.type
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 网络请求拦截
|
||||||
|
|
||||||
|
```
|
||||||
|
场景:Mock API 响应、修改请求头
|
||||||
|
方案:Fetch Domain
|
||||||
|
关键 API:Fetch.enable, Fetch.fulfillRequest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 性能分析
|
||||||
|
|
||||||
|
```
|
||||||
|
场景:检测页面加载性能、内存泄漏
|
||||||
|
方案:Performance + HeapProfiler Domain
|
||||||
|
关键 API:Performance.getMetrics, HeapProfiler.takeHeapSnapshot
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. 移动端测试
|
||||||
|
|
||||||
|
```
|
||||||
|
场景:模拟手机设备访问
|
||||||
|
方案:Emulation Domain
|
||||||
|
关键 API:Emulation.setDeviceMetricsOverride
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5. 安全审计
|
||||||
|
|
||||||
|
```
|
||||||
|
场景:检测 XSS、检查 HTTPS
|
||||||
|
方案:Security + DOMDebugger Domain
|
||||||
|
关键 API:Security.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*
|
||||||
Reference in New Issue
Block a user