DevTools Intermediate Go

chromedp - Go 浏览器自动化

Go 语言浏览器自动化库,基于 Chrome DevTools Protocol,无需外部依赖,支持截图、网络监控和复杂页面操作

chromedevtoolsgo

什么是 chromedp?

chromedp 是一个 Go 语言库,用于驱动支持 Chrome DevTools Protocol 的浏览器。不需要外部依赖(如 Selenium),是 Go 语言中进行浏览器自动化的轻量级方案。

安装

go get -u github.com/chromedp/chromedp

需要系统已安装 Chrome/Chromium。

快速开始

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/chromedp/chromedp"
)

func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    var title string
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://www.google.com"),
        chromedp.Title(&title),
    )
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Page title:", title)
}

常用操作

查找和点击

chromedp.Click("#submit-button")
chromedp.SendKeys("input[name=username]", "myuser")
chromedp.Submit("form")
chromedp.WaitVisible("#result", chromedp.ByID)

截图

var buf []byte
chromedp.Run(ctx, chromedp.CaptureScreenshot(&buf))

// 全页面截图
chromedp.FullScreenshot(&buf, 90)

执行 JavaScript

var result string
chromedp.Evaluate(`document.title`, &result)

表单处理

chromedp.Run(ctx,
    chromedp.Navigate("https://example.com/login"),
    chromedp.SendKeys("#username", "myuser"),
    chromedp.SendKeys("#password", "mypass"),
    chromedp.Click("#login-btn"),
    chromedp.WaitVisible("#dashboard"),
)

调试

ctx, cancel := chromedp.NewContext(
    context.Background(),
    chromedp.WithHeadless(false),  // 显示浏览器窗口
)

Docker 环境

FROM chromedp/headless-shell
COPY myapp /myapp
CMD ["/myapp"]

最佳实践

  1. 复用 Context:创建一次 chromedp.NewContext,在多个操作中复用
  2. defer cancel():确保资源释放
  3. 显式等待:不要用 Sleep,用 WaitVisible 等条件等待
  4. 错误处理:每个操作都可能失败,做好错误处理

参考