# 如何使用 Golang + selenium 操作瀏覽器 ## 環境建立 1. 取得selenium package https://github.com/tebeka/selenium 執行文件裡Installing指令即可 ``` go get -t -d github.com/tebeka/selenium ``` 因為我的OS是Windows,沒辦法用文件裡Downloading Dependencies的例子(那是linux),所以要自己找到瀏覽器的Binary檔 2. 下載ChromeDriver Binary [官網下載](https://sites.google.com/chromium.org/driver/),記得要配合自己的Chrome版本下載 3. 建議把下載的ChromeDriver Binary放在main package的資料夾內 ![](https://i.imgur.com/KFhGHLL.png) ## Hello World 使用[如何使用 Golang 操作瀏覽器](https://opensourcedoc.com/selenium/manipulate-selenium-with-golang/)的例子,但<font color=red>要設定ChromeDriver Binary檔的路徑(第20行)</font> ```go= import ( "fmt" "os" "time" "github.com/tebeka/selenium" ) const ( port = 8080 ) func main() { opts := []selenium.ServiceOption{ // Enable fake XWindow session. // selenium.StartFrameBuffer(), selenium.Output(os.Stderr), // Output debug information to STDERR //設定ChromeDriver Binary檔的路徑 //因為我把下載的ChromeDriver Binary放在main資料夾內,所以用相對路徑設定就好 //這個設定在20221005被發現沒有作用,可能是我誤解了他的用法,也可能是go升版1.19後的關係,總之先註解 //selenium.ChromeDriver("main"), } // Enable debug info. // selenium.SetDebug(true) //這裡用相對路徑的方式去寫chromedriver的位置 service, err := selenium.NewChromeDriverService("./chromedriver", port, opts...) if err != nil { panic(err) } defer service.Stop() caps := selenium.Capabilities{"browserName": "chrome"} wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://127.0.0.1:%d/wd/hub", port)) if err != nil { panic(err) } defer wd.Quit() wd.Get("https://tw.yahoo.com") time.Sleep(5 * time.Second) } ``` ## 用selenium操作網頁 [參考官網](https://github.com/tebeka/selenium/blob/master/example_test.go)去改 ```go= package main import ( "fmt" "os" "strings" "time" "github.com/tebeka/selenium" ) const ( port = 8080 ) func main() { opts := []selenium.ServiceOption{ // Enable fake XWindow session. // selenium.StartFrameBuffer(), selenium.Output(os.Stderr), // Output debug information to STDERR //設定ChromeDriver Binary檔的路徑 //因為我把下載的ChromeDriver Binary放在main資料夾內,所以用相對路徑設定就好 selenium.ChromeDriver("main"), } // Enable debug info. // selenium.SetDebug(true) service, err := selenium.NewChromeDriverService("chromedriver", port, opts...) if err != nil { panic(err) } defer service.Stop() caps := selenium.Capabilities{"browserName": "chrome"} wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://127.0.0.1:%d/wd/hub", port)) if err != nil { panic(err) } defer wd.Quit() // Navigate to the simple playground interface. url := "https://go.dev/play/" if err := wd.Get(url); err != nil { panic(err) } // Get a reference to the text box containing code. elem, err := wd.FindElement(selenium.ByCSSSelector, "#code") if err != nil { panic(err) } // Remove the boilerplate code already in the text box. if err := elem.Clear(); err != nil { panic(err) } // Enter some new code in text box. keys := `package main import "fmt" func main() { fmt.Println("Hello WebDriver!") }` err = elem.SendKeys(keys) if err != nil { panic(err) } // Click the run button. btn, err := wd.FindElement(selenium.ByCSSSelector, "#run") if err != nil { panic(err) } if err := btn.Click(); err != nil { panic(err) } // Wait for the program to finish running and get the output. outputDiv, err := wd.FindElement(selenium.ByTagName, "pre") if err != nil { panic(err) } var output string for { output, err = outputDiv.Text() if err != nil { panic(err) } if output != "Waiting for remote server..." { break } time.Sleep(time.Millisecond * 100) } fmt.Printf("%s", strings.Replace(output, "\n\n", "\n", -1)) time.Sleep(10 * time.Second) } ``` 印出 ``` Hello WebDriver! Program exited. ``` ## 參考資料 * 如何使用 Golang 操作瀏覽器 >https://opensourcedoc.com/selenium/manipulate-selenium-with-golang/ * The most complete, best-tested WebDriver client for Go >https://github.com/tebeka/selenium >https://github.com/tebeka/selenium/blob/master/example_test.go * ChromeDriver官網 >https://sites.google.com/chromium.org/driver/