この記事では、Golang を使ったWebブラウザの起動について解説します。
Agouti
Agouti はアクセプタンスとテスティングのフレームワークです。もし Go プロジェクトの完璧なテスティングソリューションをお探しなら、BBD テスティングフレームワークである Ginkgo 、Gomega マッチャー/アサーションライブラリと併用可能です。
以下の例では、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)
}
}
Agouti は PhantomJS や Selenium 、Chrome などの 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サイトからタイトルを取得できます。
まとめ