如何免Chrome直连Moli:Playwright与Puppeteer的CDP自动化服务完整实践指南
【免费下载链接】moliBest headless browser for AI agents. Lite, Fast, High-Compatibility. Built in Rust项目地址: https://gitcode.com/gh_mirrors/moli/moli
Moli 是一个用 Rust 编写的轻量级无头浏览器,专为 AI Agent 设计。它的moli serve命令可以启动一个标准的 CDP(Chrome DevTools Protocol)自动化服务,让 Playwright 和 Puppeteer 通过connectOverCDP/connect直接连上 Moli,无需安装或启动 Chrome 浏览器,即可完整实现页面抓取、DOM 操作、截图、请求拦截等自动化任务。
Moli 渲染 rust-lang.org,其 DOM、CSS 与几何信息可直接在 Chrome DevTools 中检查
为什么选择 Moli 替代 Chrome 跑自动化?
大多数自动化任务真正需要的是页面结构(DOM、JS 运行结果、网络数据),而不是一个持续渲染的像素世界。传统方案必须启动一个完整的 Chrome 进程,带来高内存开销和大量子进程。Moli 采用"按需渲染"架构:
- 结构优先:DOM 查询、JS 执行、网络请求等操作直接读取浏览器运行时状态,不触发布局和绘制
- 按需布局:只有请求几何信息、坐标输入或截图时才临时构建布局树
- 资源高效:典型 Agent 工作负载下,Moli 的 CDP 就绪时间约 35ms(Chrome 约 169ms),峰值内存约 100 MiB(Chrome 约 350 MiB),且只需 1 个进程
在 Lexbench-Headless-Browser 基准测试(1,308 个可比较任务,覆盖 Playwright、Puppeteer、Selenium 等 13 种自动化工具)中,Moli 0.1.1 的通过率达到了 81.9%,仅次于 Chrome 的 99.8%:
一键启动 Moli CDP 自动化服务
安装完成后,一条命令即可启动自动化服务。Moli 默认绑定本机回环地址127.0.0.1的9222端口:
# 基础服务:适合 DOM 优先的工作负载(抓取、查询、执行 JS) moli serve # 启用真实几何:坐标输入、截图、PDF、Screencast moli serve --layout # 同时加载可选的图片/字体/音视频等资源 moli serve --layout --resource💡 需要持久化 Cookie、localStorage 或 IndexedDB 时,加上
--profile-dir;需要导入浏览器 Cookie 时,用--cookie-file。更多选项见 skills/moli-cdp-server/references/protocols.md。
服务就绪后,通过 CDP 发现端点验证(这也是客户端连接前的推荐步骤):
curl http://127.0.0.1:9222/json/version该端点会返回浏览器的 WebSocket 调试地址,客户端应优先使用它,而不是硬编码/devtools/...路径。
Playwright 通过 CDP 直连 Moli 的最快配置方法
已有 Playwright 代码几乎零改动:把"启动浏览器"换成chromium.connectOverCDP指向 Moli 端点即可。
import { chromium } from "playwright"; const browser = await chromium.connectOverCDP("http://127.0.0.1:9222"); const context = browser.contexts()[0]; const page = context.pages()[0] ?? await context.newPage(); await page.goto("https://example.com"); console.log(await page.locator("body").innerText()); await browser.close();接入时注意两点:
- 去掉 Chrome 专属假设:删除
executablePath和 Chrome 启动参数,把 Moli 当作远程端点,不要尝试再启动一个本地 Chromium - 能力边界:Moli 覆盖的是精选的 CDP 命令集而非完整 Chrome 协议;遇到明确返回的"不支持"错误属于能力边界,不要伪装成成功
仓库内置的 Playwright 冒烟测试 scripts/playwright-cdp-smoke.mjs 验证了完整的兼容面:connectOverCDP连接、多页/多上下文、iframe 子框架文本读取、waitForFunction、Cookie 往返、重定向与 History 前进后退、弹窗(popup)、请求拦截(routefulfill / continue / abort)等全部通过。
Puppeteer 直连 Moli 的完整实践步骤
Puppeteer 的接入方式是puppeteer.connect+ Moli 的 browser WebSocket 地址(从/json/version发现):
import puppeteer from "puppeteer-core"; const res = await fetch("http://127.0.0.1:9222/json/version"); const { webSocketDebuggerUrl } = await res.json(); const browser = await puppeteer.connect({ browserWSEndpoint: webSocketDebuggerUrl, protocolTimeout: 10000, }); const page = (await browser.pages())[0] ?? await browser.newPage(); await page.goto("https://example.com", { waitUntil: "load" }); console.log(await page.$eval("main", n => n.textContent)); // 需要截图时,确保服务端以 --layout 启动 await page.screenshot({ encoding: "base64" }); await browser.disconnect();官方冒烟脚本 moli-cdp-smoke/moli_cdp_smoke/puppeteer_smoke.mjs 展示了 Puppeteer 在 Moli 上被验证的工作流:
| 能力 | 说明 |
|---|---|
| 断线重连 | disconnect后再次connect,原有页面与运行时上下文保留 |
| 导航与历史 | goto、reload、waitForNavigation、History API |
| DOM 操作 | 选择器查询、XPath 激活、元素 handle、文件上传 |
| 运行时 | Worker 生命周期、console 事件、dialog 处理、evaluate |
| 网络层 | 请求拦截respond/continue、CDP 网络事件监听、下载 |
| 视觉输出 | 视口截图返回标准 PNG(需服务端--layout) |
常见连接问题排查清单
遇到问题时按 SKILL.md 中的排查顺序处理:
- 确认
moli serve进程仍在运行 - 用精确的主机和端口探测
/json/version - 确认客户端是"附加/连接远程",而不是在本地启动捆绑浏览器
- 移除 Chrome 专属启动参数和
executablePath配置 - 失败涉及几何或视觉输出时,检查是否漏开
--layout - 只启用页面真正需要的资源族(
--resource或单项标志) - 把明确的"协议不支持"错误当作能力边界,不要用合成成功掩盖它
架构参考:CDP 服务是怎么实现的?
如果想深入理解 Moli 的 CDP 层,可以从两个模块入手:协议数据结构定义在 moli-protocol-cdp/src/wire.rs,而服务端调度、命令分发与 WebSocket 会话管理位于 moli-protocol-server/src/cdp_scheduler.rs。同一个二进制还同时提供 WebDriver Classic 与 WebDriver BiDi 端点,无需额外的 ChromeDriver 或 geckodriver。
Moli 无头浏览器:轻量、快速、高兼容,为 AI Agent 而生的浏览器内核
总结
- 免 Chrome:
moli serve一条命令启动 CDP 服务,Playwright 用connectOverCDP、Puppeteer 用connect直连,现有代码几乎不用改 - 更快更省:CDP 就绪约 35ms,峰值内存约为 Chrome 的 1/3,单进程运行
- 按需开销:默认 DOM 优先零渲染开销;截图、坐标输入等视觉能力用
--layout显式开启 - 能力可信:1,308 个自动化任务基准中通过率 81.9%,且对不支持的命令始终返回显式错误
把它部署进爬虫、browser-use Agent、检索管线或评测环境,你会发现"无头浏览器"这个词第一次和"轻量"真正画上了等号 🚀
【免费下载链接】moliBest headless browser for AI agents. Lite, Fast, High-Compatibility. Built in Rust项目地址: https://gitcode.com/gh_mirrors/moli/moli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考