UI 自动化:chromedp 在 Go 生态里的测试价值

如果从“完整 UI 回归框架”的角度看,chromedp 很难和 Playwright 正面对打,因为它本来就不是同类产品。它更像是一层浏览器控制能力,让你用 Go 直接驱动 Chrome DevTools Protocol。

这种定位很容易让它被低估。但如果你的主技术栈已经是 Go,或者你要解决的不是“做一整套 E2E 回归”,而是:

  • 浏览器化探针
  • 页面截图服务
  • 登录可用性检查
  • 内部工具里的页面控制

那 chromedp 反而会非常顺手。

一、我为什么会认真看 chromedp

原因很现实:当测试平台、调度系统、巡检服务本身已经是 Go 写的,你再为某个轻量页面检查单独引入一套 Node 或 Python 执行链,整体复杂度会明显增加。

chromedp 的意义就在这里。它让浏览器能力和 Go 服务自然长在一起,而不是跨进程、跨语言去拼接。

二、怎么给 chromedp 定位

不适合把它当成“全能 UI 自动化解决方案”,而更适合把它定位成三类东西。

1. 浏览器探针工具

适合:

  • 登录页是否可打开
  • 首页是否加载正常
  • 某个关键文案是否出现

2. 截图和留痕工具

适合:

  • 自动保存页面截图
  • 采集某个页面渲染结果
  • 给运维或监控系统提供页面视图证据

3. Go 服务里的浏览器能力模块

适合:

  • 后台巡检服务
  • 内部工具
  • 平台里的轻量 Web 自动操作

这三种场景里,它的价值都很高。

三、它和 Playwright / Selenium 的根本区别

1. chromedp 更底层

它给你的不是完整测试 runner、fixture、report 套件,而是浏览器控制能力。换句话说:

  • 自由度更高
  • 但更多规范要你自己补

2. 它更适合服务化、工具化问题

如果你的问题是“做一个平台内嵌的页面探针”,chromedp 很合适;如果你的问题是“做一套多角色大规模 UI 回归”,Playwright 更省事。

四、我在真实项目里会怎么用它

比较常见的几类用法是:

  • 打开登录页并判断关键元素是否存在
  • 自动登录后台并截首页图
  • 打开列表页提取关键 DOM 文本
  • 做线上关键页面健康检查
  • 给 Go 写的巡检系统增加浏览器可见性验证

这些动作的共性是:动作不重,但信号很值钱

五、怎么组织 chromedp 代码

如果是一个长期运行的 Go 巡检系统,通常不会把所有浏览器代码塞在一起,而会拆成:

1
2
3
4
5
6
7
internal/browser/
├── client.go
├── context.go
├── login.go
├── wait.go
├── screenshot.go
└── probe.go

client.go

负责浏览器实例与执行入口。

context.go

负责超时、取消、生命周期管理。

login.go

负责具体登录动作。

wait.go

负责可见、文本出现、页面稳定等等待能力。

probe.go

负责“检查什么”。

这样浏览器细节就不会污染业务层。

六、一个更贴近实战的例子

假设我要做一个“后台登录页 + 首页可用性巡检”的 Go 服务,通常会这样设计:

  1. 调度服务定时下发任务
  2. worker 创建 chromedp context
  3. 打开登录页
  4. 等待用户名、密码输入框出现
  5. 输入巡检账号密码
  6. 点击登录
  7. 等待首页关键元素出现
  8. 保存截图
  9. 回传:
    • 页面标题
    • URL
    • 截图路径
    • 耗时
    • 失败原因

这条链路用 Go 完成会非常自然,不需要再额外拉一个 Node 服务做浏览器执行。

七、它最容易踩的坑是什么

1. 把 chromedp 当录制型脚本工具

如果只是机械地把点击和输入堆起来,后期会很难维护。它同样需要等待设计和动作抽象。

2. 过度使用 Sleep

因为它偏底层,第一版代码很容易先写成 Sleep(2 * time.Second)。这样做一开始最快,后面最脆。

3. 资源释放不严谨

如果 context 生命周期处理不好,长期运行的 Go 服务很容易出现:

  • 浏览器进程残留
  • 内存增长
  • worker 卡死

这类问题在巡检服务里非常常见。

八、怎么判断该不该选 chromedp

更常见的判断方式是:

  • 需要完整 UI 回归体系: 优先 Playwright
  • 需要兼容历史 WebDriver 资产: 继续 Selenium
  • 需要把浏览器控制嵌进 Go 服务、探针、平台工具: 优先 chromedp

它不是“更先进的 Selenium”,而是一种更贴近 Go 工程世界的浏览器能力组件。

九、结语

chromedp 在 Go 生态里的价值,不在于替代所有 UI 自动化框架,而在于让浏览器控制能力自然进入 Go 服务、巡检系统和内部工具。只要定位准确,它会是一把非常轻量、非常实用、非常贴近工程落地的工具。

本章延伸阅读