16.1 浏览器架构概述

生成模型:Claude Opus 4.6 (anthropic/claude-opus-4-6) Token 消耗:输入 ~160k tokens,输出 ~5k tokens(本节)


在前几章中,我们分析了 OpenClaw 如何通过 Bash 工具让 AI Agent 在操作系统层面执行命令。但在现代 Web 时代,浏览器是信息获取和交互的核心载体。OpenClaw 的浏览器控制子系统让 Agent 能够像人类一样浏览网页——导航、点击、填表、截图,甚至执行 JavaScript。本节将从全局视角解析这个复杂子系统的架构设计。


16.1.1 Playwright + CDP 混合方案

为什么需要两层?

OpenClaw 的浏览器控制采用了双层架构:底层的 CDP(Chrome DevTools Protocol)和上层的 Playwright。

┌─────────────────────────────────────┐
│          OpenClaw Agent             │
│         (工具调用层)                 │
├─────────────────────────────────────┤
│     Playwright 高级 API 层          │
│  click / fill / snapshot / navigate │
│  页面状态管理 / 角色快照             │
├─────────────────────────────────────┤
│        CDP 低级 API 层              │
│  WebSocket → Chrome DevTools        │
│  截图 / JS 执行 / 标签页创建        │
├─────────────────────────────────────┤
│    Chrome / Chromium 浏览器实例      │
│  (OpenClaw 管理 或 用户已有)         │
└─────────────────────────────────────┘

衍生解释:**CDP(Chrome DevTools Protocol)**是 Chrome 浏览器内置的远程调试协议。当 Chrome 以 --remote-debugging-port=9222 参数启动时,会在该端口上暴露一个 HTTP + WebSocket 接口。外部程序可以通过这个接口控制浏览器的几乎所有行为——导航页面、执行 JavaScript、截取屏幕截图、修改 DOM 等。它是所有浏览器自动化框架(Puppeteer、Playwright、Selenium 4)的底层基础。

衍生解释Playwright 是微软开发的浏览器自动化库。与直接使用 CDP 不同,Playwright 提供了更高级的抽象——自动等待元素可交互、智能选择器(通过 ARIA 角色、文本内容等定位元素)、跨浏览器支持(Chrome、Firefox、Safari)。对 AI Agent 来说,Playwright 的"角色快照(Aria Snapshot)"功能尤其重要——它能将页面的可访问性树(Accessibility Tree)转换为 Agent 可读的文本描述。

混合方案的设计理由:

场景
使用层
原因

截图

CDP

直接调用 Page.captureScreenshot,零额外开销

执行 JS

CDP

直接调用 Runtime.evaluate,无需 Playwright 上下文

创建标签页

CDP

Target.createTarget 更底层可靠

点击/填表

Playwright

自动等待、智能定位、错误恢复

页面快照

Playwright

ARIA 快照是 Playwright 独有功能

网络监控

Playwright

Request/Response 事件更易使用


16.1.2 Chrome 实例管理

浏览器发现与启动

chrome.ts 负责发现系统中的 Chrome/Chromium 浏览器并管理其生命周期:

浏览器可执行文件发现

chrome.executables.ts 为三大平台(macOS、Linux、Windows)提供了浏览器发现逻辑:

启动流程

launchOpenClawChrome() 的启动流程包含多个阶段:

Chrome 启动参数经过精心选择:

CDP 就绪检测

两级检查确保 Chrome 不仅启动了 HTTP 服务,WebSocket 连接也能正常建立。


16.1.3 配置文件(Profiles)管理

多配置文件设计

OpenClaw 支持同时管理多个浏览器配置文件,每个配置文件有独立的 CDP 端口和用户数据目录:

CDP 端口分配

allocateCdpPort() 从范围中找到第一个未被使用的端口。已使用的端口从所有配置文件中收集:

配置文件主题色

每个配置文件有一个可视化标识色,用于在 Chrome 的标题栏上区分不同实例:

decorateOpenClawProfile() 修改 Chrome 的 PreferencesLocal State 文件,注入配置文件名和主题色。这样用户一眼就能辨认出哪个 Chrome 窗口是 OpenClaw 控制的。

两种驱动模式

驱动
场景
原理

openclaw

OpenClaw 自己启动和管理 Chrome

完全控制生命周期

extension

用户已有 Chrome,安装了 OpenClaw 扩展

通过 Chrome Extension Relay 中继 CDP 命令

extension 模式解决了一个实际问题:用户可能已经在使用 Chrome 并登录了各种网站。与其启动一个全新的 Chrome 实例(没有 cookie、没有登录状态),不如复用用户现有的浏览器——只需安装一个 OpenClaw 扩展来建立控制通道。


16.1.4 配置常量

其中 DEFAULT_AI_SNAPSHOT_MAX_CHARS = 80,000DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS = 10,000 控制页面快照发送给 LLM 的文本长度上限——页面越复杂,快照越大,但过大的快照会消耗过多的 context window。


本节小结

  1. 双层架构:CDP 用于低级操作(截图、JS 执行、标签页管理),Playwright 用于高级操作(点击、填表、页面快照)

  2. Chrome 生命周期管理:自动发现浏览器可执行文件(支持 Chrome/Brave/Edge/Chromium)、创建隔离的用户数据目录、首次引导配置文件、等待 CDP 就绪

  3. 多配置文件:每个配置文件分配独立的 CDP 端口(18800-18899 范围)、主题色、用户数据目录

  4. 两种驱动模式openclaw 模式自行启动 Chrome,extension 模式通过扩展中继复用用户已有的浏览器

  5. 端口规划清晰——Gateway、Bridge、浏览器控制、Canvas 各有保留端口,CDP 端口池最多支持 100 个配置文件

Last updated