Skip to content

浏览器沙箱(Playwright)源码级讲解

源码路径:CubeSandbox/examples/browser-sandbox/

概述

本例实现了一个完整的"隔离浏览器"方案:在 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()控制面:从模板快照启动 VM50ms 级冷启动,每个任务一个全新浏览器
get_host(9000)获取 CubeProxy 路由域名SDK 无需知道 VM IP,只需域名
connect_over_cdp()WebSocket 连接到 CDPPlaywright 通过标准 CDP 协议控制 Chromium
CubeProxyTLS 终结 + WebSocket 转发公网安全暴露,Host 路由到正确 VM

Chromium 启动时序(模板内部)

使用场景与扩展思路

场景实现方式
网页爬取page.content() 获取 DOM
截图/PDFpage.screenshot() / page.pdf()
UI 自动化测试Playwright locator + assert
LLM Agent 浏览Agent 调用 page.goto + page.text_content

阅读建议

  1. 先读 browser.py(只有 30 行,但串联了控制面+数据面完整链路)
  2. 再理解 CubeProxy 的 Host 路由机制
  3. 最后看模板 Dockerfile,理解 Chromium 启动参数

源码参考:browser.py | README_zh.md