浏览器沙箱(Playwright)源码级讲解
概述
本例实现了一个完整的"隔离浏览器"方案:在 Cube Sandbox 的 KVM MicroVM 中运行 Chromium,外部通过 Playwright CDP 协议远程控制。
核心设计思想:浏览器本身就是沙箱里最危险的攻击面——把它再隔离一层到独立 VM,才是真正的安全。
端到端架构
源码解析:browser.py
python
# ① 创建沙箱(控制面)
sandbox = Sandbox.create(template=template_id)
# ② 获取 CDP 路由地址
cdp_url = f"https://{sandbox.get_host(9000)}/cdp?"
# ③ 通过 Playwright CDP 协议连接
browser = playwright.chromium.connect_over_cdp(cdp_url)
# ④ 在隔离浏览器中导航
page = context.new_page()
page.goto("http://www.tencent.com")四步调用链详解
关键设计点
| 层 | 职责 | 为什么这么设计 |
|---|---|---|
Sandbox.create() | 控制面:从模板快照启动 VM | 50ms 级冷启动,每个任务一个全新浏览器 |
get_host(9000) | 获取 CubeProxy 路由域名 | SDK 无需知道 VM IP,只需域名 |
connect_over_cdp() | WebSocket 连接到 CDP | Playwright 通过标准 CDP 协议控制 Chromium |
| CubeProxy | TLS 终结 + WebSocket 转发 | 公网安全暴露,Host 路由到正确 VM |
Chromium 启动时序(模板内部)
使用场景与扩展思路
| 场景 | 实现方式 |
|---|---|
| 网页爬取 | page.content() 获取 DOM |
| 截图/PDF | page.screenshot() / page.pdf() |
| UI 自动化测试 | Playwright locator + assert |
| LLM Agent 浏览 | Agent 调用 page.goto + page.text_content |
阅读建议
- 先读
browser.py(只有 30 行,但串联了控制面+数据面完整链路) - 再理解 CubeProxy 的 Host 路由机制
- 最后看模板 Dockerfile,理解 Chromium 启动参数
源码参考:browser.py | README_zh.md