Browser Agent:让多个 AI Agent 共用同一个真实 Chrome
一个本地共享浏览器运行时:统一管理真实 Chrome、固定 Profile、CDP 和自动恢复,让 Skill 与 AI Agent 只负责页面业务。
Browser Agent 是一个本地共享浏览器运行时。它统一管理真实 Google Chrome、固定 Profile、CDP 端口和浏览器生命周期,让多个 Skill、Python 项目与 AI Agent 连接同一个浏览器环境。
它不负责具体网站的采集逻辑,只负责保证浏览器可用。
项目定位
不使用临时 Chromium,保留正常浏览器环境。
复用 Cookie、登录状态和 Local Storage。
Playwright 通过固定地址连接现有 Chrome。
外部项目调用一次,即可保证浏览器在线。
它解决什么问题
没有统一浏览器运行时,每个自动化项目通常会重复处理同一批问题:
- 自己选择 Chrome 或 Chromium。
- 自己维护 Profile 路径。
- 自己分配远程调试端口。
- 浏览器关闭后连接直接报错。
- Profile 被旧进程占用时无法启动。
- 多个项目分别登录同一批网站。
- Agent 任务结束时误关共享浏览器。
Browser Agent 把这些通用能力集中到一个项目里。
统一登录状态
所有接入方复用同一个 Chrome Profile,不需要每个 Skill 单独登录。
- Cookie 和本地存储长期保留
- 登录验证可在可见 Chrome 中人工完成
统一生命周期
浏览器启动、健康检查、异常进程清理和重启都由 Browser Agent 负责。
- 浏览器在线时直接复用
- CDP 异常时自动恢复
统一连接地址
外部项目不再自行管理端口,统一连接固定 CDP 地址。
http://127.0.0.1:19312- Playwright 使用
connect_over_cdp()
统一使用规范
README、SKILL.md、AGENTS.md 和 CLAUDE.md 描述同一套接入边界。
- 适配 Codex、Claude Code 和 OpenClaw
- 新 Skill 不再重复实现 Chrome 管理
整体架构
flowchart LR
A[Skill / Python / AI Agent] --> B[browser-agent ensure]
B --> C{CDP 是否正常}
C -->|正常| D[复用现有 Chrome]
C -->|异常| E[清理异常进程与运行锁]
E --> F[启动真实 Google Chrome]
F --> G[固定 Profile + 固定 CDP]
D --> H[Playwright connect_over_cdp]
G --> H
H --> I[创建独立 Page]
I --> J[执行网站业务逻辑] 浏览器运行时和网站业务逻辑分开维护。
固定约定如下:
控制入口:~/browser-agent/browser-agent
共享 Profile:~/browser-agent/chrome-profile
CDP:http://127.0.0.1:19312
ensure 如何工作
外部项目不需要判断浏览器当前处于什么状态,只需要执行:
~/browser-agent/browser-agent ensure
浏览器自愈流程
访问 /json/version。正常时直接返回,不重复启动 Chrome。
CDP 不可用但共享 Profile 仍有 Chrome 进程时,先正常结束,再按需强制结束。
确认端口未被其他程序占用,并清理 SingletonLock、SingletonCookie 和 SingletonSocket。
使用固定 Profile 和端口启动真实 Chrome,等待 CDP 可访问后返回成功。
外部项目怎么接入
Python 项目只需要先调用 ensure,再通过 Playwright 连接 CDP:
import subprocess
from pathlib import Path
from playwright.sync_api import sync_playwright
browser_agent = Path.home() / "browser-agent" / "browser-agent"
subprocess.run(
[str(browser_agent), "ensure"],
check=True,
)
with sync_playwright() as playwright:
browser = playwright.chromium.connect_over_cdp(
"http://127.0.0.1:19312"
)
context = browser.contexts[0]
page = context.new_page()
try:
page.goto("https://example.com")
# 当前项目的页面业务逻辑
finally:
page.close()
业务项目不再负责以下内容:
Chrome 可执行文件路径
Profile 创建与迁移
远程调试端口分配
Chrome 进程启动与结束
CDP 健康检查
异常进程恢复
使用价值
减少重复代码
Chrome 管理只维护一份,网站适配器不再复制启动和重启逻辑。
提高任务稳定性
浏览器未启动或 CDP 异常时,项目可以自动恢复,而不是直接连接失败。
跨 Agent 复用
ChatGPT、Codex、Claude Code、OpenClaw 和普通 Python 可以连接同一个环境。
它尤其适合以下场景:
- 需要登录状态的网页采集。
- 多个 Skill 操作相同网站。
- 本地 Agent 调试网页结构和选择器。
- 定时任务需要在 Chrome 关闭后自动恢复。
- 不希望每个项目创建临时 Profile。
使用边界
Browser Agent 是单机共享运行时,不是远程浏览器集群,也不是并发调度平台。
需要遵守以下边界:
- 每个任务创建自己的
page,任务结束只关闭该页面。 - 不调用
context.close()或browser.close(),避免影响其他任务。 - 默认不要让多个 Agent 同时操作同一个页面。
- 验证码、扫码和账号安全验证需要人工处理。
- Profile 包含登录信息,不能提交到 Git 仓库。