備忘録

備忘録

Go で chromedp を利用して Chrome を操作する方法

Ⅰ. はじめに

タイトルの通り「Go で chromedp を利用して Chrome を自動操作する方法」です。

Ⅱ. やり方

1. ライブラリをインストールする
go get github.com/chromedp/chromedp
2. サンプルプログラムを書く
package main

import (
  "context"
  "log"
  "time"

  "github.com/chromedp/chromedp"
)

func main() {
  allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), []chromedp.ExecAllocatorOption{
    chromedp.NoFirstRun,
    chromedp.NoDefaultBrowserCheck,
    chromedp.DisableGPU,
    // chromedp.NoSandbox,
    // chromedp.Headless,

    chromedp.Flag("disable-infobars", true),
  }...)
  defer cancel()

  ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf))
  defer cancel()

  ctx, cancel = context.WithTimeout(ctx, 15*time.Second)
  defer cancel()

  var value string
  var attributes map[string]string
  err := chromedp.Run(ctx,
    chromedp.Navigate("https://example.org/"),
    chromedp.WaitVisible("/html/body/div/h1"),
    // innerHTML を取得する
    chromedp.InnerHTML("/html/body/div/h1", &value),

    // 属性を取得する
    chromedp.Attributes("/html/body/div/p[2]/a", &attributes),

    // chromedp.Value("xpath", &value),
    // chromedp.Click("xpath"),
    // chromedp.SendKeys("xpath", "hoge"),
  )
  if err != nil {
    log.Fatal(err)
  }

  log.Printf("h1 innerHTML = %s", value)
  log.Printf("a href = %s", attributes["href"])
}

実行結果

h1 innerHTML = Example Domain
a href = http://www.iana.org/domains/example