go selenium较好的库
在go+selenium 上踩了不少坑,推荐下面这个比较完善的库
https://github.com/tebeka/selenium
支持chrome、safari、firefox、IE
另外还有:
https://github.com/sclevine/agouti
https://github.com/sourcegraph/go-selenium
放在一起的例子:
package main
import (
agwd "github.com/sclevine/agouti"
tbwd "github.com/tebeka/selenium"
"log"
sgwd "sourcegraph.com/sourcegraph/go-selenium"
)
// Helper for sourcegraph/go-selenium
type fatalfer struct{}
func (fatalfer) Fatalf(fmt string, v ...interface{}) {
panic([]interface{}{fmt, v})
}
var errorhandler fatalfer
// Helper for tebeka/selenium and agouti
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
defer func() {
r := recover()
// Catch the errors from the tebeka/selenium and agouti helpers
err, is_error := r.(error)
if is_error {
log.Fatal(err)
}
// Catch the errors from the sourcegraph/go-selenium helper
arr, is_array := r.([]interface{})
if is_array {
fmt := arr[0].(string)
v := arr[1].([]interface{})
log.Fatalf(fmt, v...)
}
}()
//sourcegraphExample()
//tebekaExample()
//agoutiExample()
}
func sourcegraphExample() {
// Pro: .T
// Con: Doesn't report the full error
var err error
wdRaw, err := sgwd.NewRemote(sgwd.Capabilities(map[string]interface{}{"browserName": "chrome"}), "http://localhost:4444/wd/hub")
checkError(err)
driver := wdRaw.T(errorhandler)
defer driver.Quit()
// Make sure the debug panel doesn't overlay the login
driver.ResizeWindow(driver.CurrentWindowHandle(), sgwd.Size{1200, 500})
driver.Get("http://localhost/shop")
driver.FindElement(sgwd.ByCSSSelector, "header.header li.login a").Click()
mailInput := driver.FindElement(sgwd.ByCSSSelector, "section.login-area input[name=email_address]")
mailInput.Click()
mailInput.SendKeys("info@example.com")
passwordInput := driver.FindElement(sgwd.ByCSSSelector, "section.login-area input[name=password]")
passwordInput.Click()
passwordInput.SendKeys("xxx" + sgwd.EnterKey)
// go-selenium doesn't seem to have explicit wait
driver.SetImplicitWaitTimeout(30000)
// Wait for login to complete (either the "My Account" button or the confirm address popup appears)
driver.FindElement(sgwd.ByCSSSelector, "header.header li.account a, a[data-widget=confirm_address_link]")
// Go to "My Account" page
driver.FindElement(sgwd.ByCSSSelector, "header.header li.account a").Click()
}
func tebekaExample() {
// Pro: Easier capabilities, provides full error info
// Con: No .T
var err error
driver, err := tbwd.NewRemote(tbwd.Capabilities{"browserName": "chrome"}, "http://localhost:4444/wd/hub")
checkError(err)
defer driver.Quit()
// Make sure the debug panel doesn't overlay the login
cwh, err := driver.CurrentWindowHandle()
checkError(err)
err = driver.ResizeWindow(cwh, 1200, 500)
checkError(err)
err = driver.Get("http://localhost/shop")
checkError(err)
loginButton, err := driver.FindElement(tbwd.ByCSSSelector, "header.header li.login a")
checkError(err)
err = loginButton.Click()
mailInput, err := driver.FindElement(tbwd.ByCSSSelector, "section.login-area input[name=email_address]")
checkError(err)
err = mailInput.Click()
checkError(err)
err = mailInput.SendKeys("info@example.com")
checkError(err)
passwordInput, err := driver.FindElement(tbwd.ByCSSSelector, "section.login-area input[name=password]")
checkError(err)
err = passwordInput.SendKeys("xxx" + tbwd.EnterKey)
checkError(err)
// tebeka/selenium doesn't seem to have explicit wait
err = driver.SetImplicitWaitTimeout(30000)
checkError(err)
// Wait for login to complete (either the "My Account" button or the confirm address popup appears)
driver.FindElement(sgwd.ByCSSSelector, "header.header li.account a, a[data-widget=confirm_address_link]")
// Go to "My Account" page
accountButton, err := driver.FindElement(sgwd.ByCSSSelector, "header.header li.account a")
checkError(err)
err = accountButton.Click()
checkError(err)
}
func agoutiExample() {
var err error
driver, err := agwd.NewPage("http://localhost:4444/wd/hub", agwd.Browser("chrome"))
checkError(err)
defer driver.Destroy()
// Make sure the debug panel doesn't overlay the login
err = driver.Size(1200, 500)
checkError(err)
err = driver.Navigate("http://localhost/shop")
checkError(err)
err = driver.Find("header.header li.login a").Click()
checkError(err)
mailInput := driver.Find("section.login-area input[name=email_address]")
err = mailInput.Click()
checkError(err)
err = mailInput.SendKeys("info@example.com")
checkError(err)
passwordInput := driver.Find("section.login-area input[name=password]")
err = passwordInput.SendKeys("xxx" + string('\ue007'))
checkError(err)
// agoudi doesn't seem to have explicit wait
err = driver.SetImplicitWait(30000)
checkError(err)
// Wait for login to complete (either the "My Account" button or the confirm address popup appears)
driver.Find("header.header li.account a, a[data-widget=confirm_address_link]")
// Go to "My Account" page
err = driver.Find("header.header li.account a").Click()
checkError(err)
}
// forked from https://gist.github.com/AndreKR/213996c501ed9da927ede1ff7d23699c
0
Nearby
- 上一篇 › HyperLevelDB 提高了LevelDB 性能的一个分支
- 下一篇 › 添加了防恶意灌水、广告、垃圾识别功能