使用 Go 驅動網頁瀏覽器

這篇文章是關於在 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

在我寫這篇文章的那一刻,depAgouti 的默認版本太舊,我們需要手動把它定義到最新的主分支。

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 視窗。

總結