這篇文章是關於在 Golang 中驅動瀏覽器。
Agouti
Agouti 是一個驗收和測試框架。如果您正在為 Go 項目尋找一個完整的測試解決方案,它可與 Ginkgo (一個BDD測試框架)和 Gomega 斷言函式庫一起使用。
以下例子僅使用 Agouti 來驅動瀏覽器。
在 $GOPATH 中創建項目
在 $GOPATH/src/gitlab.com/ykyuen/driving-web-browser-in-golang-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)
}
}
除了 Chrome 還支援 PhantomJS , Selenium 等瀏覽器 / Web Driver。
下載 Go 套件
我們使用 dep 來管理 Go 套件,只需運行 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"
然後執行 dep ensure 來更新 Agouti 。
執行代碼
1
2
[ykyuen@camus driving-web-browser-in-go-example]$ go run main.go
2018 /01/21 1942 Getting Agouti
如果您使用的是 ChromeDriver,則應該能夠看到 Chrome 瀏覽器將自動啟動並執行 main.go 中所述的任務。
在 headless 瀏覽器中運行
我們也可以在像 PhantomJS 這樣的 headless 瀏覽器中執行代碼。Chrome 也支援 headless 模式。讓我們更新代碼如下。
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" }),
)
...
我們仍然可以從 Agouti 網站獲得標題,而無需啟動 Chrome 視窗。
總結