Try   HackMD

如何使用 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檔

  1. 下載ChromeDriver Binary
    官網下載,記得要配合自己的Chrome版本下載
  2. 建議把下載的ChromeDriver Binary放在main package的資料夾內
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

Hello World

使用如何使用 Golang 操作瀏覽器的例子,但要設定ChromeDriver Binary檔的路徑(第20行)

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操作網頁

參考官網去改

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/