Go を使用した Web ブラウザの起動

この記事では、Golang を使ったWebブラウザの起動について解説します。

Agouti

Agouti はアクセプタンスとテスティングのフレームワークです。もし Go プロジェクトの完璧なテスティングソリューションをお探しなら、BBD テスティングフレームワークである GinkgoGomega マッチャー/アサーションライブラリと併用可能です。

以下の例では、Agouti を使用してブラウザを起動します。

$GOPATH 内にプロジェクトを作る

$GOPATH/src/gitlab.com/ykyuen/driving-web-browser-in-go-example の下に main.go を作りましょう。

main.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
  "log"

  "github.com/sclevine/agouti"
)

func main() {
  // driver := agouti.PhantomJS()
  driver := agouti.ChromeDriver()
  // driver := agouti.ChromeDriver(
  //   agouti.ChromeOptions("args", []string{"--headless", "--disable-gpu", "--no-sandbox"}),
  // )

  if err := driver.Start(); err != nil {
    log.Fatal("Failed to start driver:", err)
  }

  page, err := driver.NewPage()
  if err != nil {
    log.Fatal("Failed to open page:", err)
  }

  if err := page.Navigate("https://agouti.org/"); err != nil {
    log.Fatal("Failed to navigate:", err)
  }

  sectionTitle, err := page.FindByID(`getting-agouti`).Text()
  log.Println(sectionTitle)

  if err := driver.Stop(); err != nil {
    log.Fatal("Failed to close pages and stop WebDriver:", err)
  }
}

AgoutiPhantomJSSeleniumChrome などの Web ブラウザをサポートしています。

Go の依存関係をダウンロードする

Go の依存関係管理には dep を使用します。dep init コマンドを実行しましょう。

1
2
3
[ykyuen@camus driving-web-browser-in-go-example]$ dep init
  Using ^2.0.0 as constraint for direct dep github.com/sclevine/agouti
  Locking in v2.0 (b920a9c) for direct dep github.com/sclevine/agouti

この記事を書いているまさにその瞬間です。dep による Agouti のデフォルトダウンロードバージョンが古すぎるようです。手動で最新のマスターにアップデートしましょう。

Gopkg.toml

1
2
3
[[constraint]]
  name = "github.com/sclevine/agouti"
  branch = "master"

そして Agouti のバージョンをアップデートするために dep ensure を実行します。

コードを実行する

1
2
[ykyuen@camus driving-web-browser-in-go-example]$ go run main.go
2018/01/21 1942 Getting Agouti

もし ChromeDriver を使用しているのであれば、Chrome ブラウザが自動的に起動され、main.go に記載されているタスクを実行していることがわかるはずです。

ヘッドレスブラウザでの実行

PhantomJS でコードを実行することも可能です。また、Chrome もヘッドレスモードをサポートしています。以下のようにコードを更新しましょう。

main.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package main

import (
  "log"

  "github.com/sclevine/agouti"
)

func main() {
  // driver := agouti.PhantomJS()
  // driver := agouti.ChromeDriver()
  driver := agouti.ChromeDriver(
    agouti.ChromeOptions("args", []string{"--headless", "--disable-gpu", "--no-sandbox"}),
  )
  ...

Chrome のウィンドウを起動しなくても、Agouti のWebサイトからタイトルを取得できます。

まとめ