package browser import ( "fmt" "strings" "time" "github.com/tebeka/selenium" ) type WebDriver interface { Get(string) error Quit() error Close() error FindElement(string, string) (selenium.WebElement, error) FindElements(string, string) ([]selenium.WebElement, error) Refresh() error } type WebElement interface { FindElement(string, string) (selenium.WebElement, error) FindElements(string, string) ([]selenium.WebElement, error) Text() (string, error) GetAttribute(string) (string, error) } type Browser struct { Driver WebDriver } func New() (*Browser, error) { var Driver selenium.WebDriver var err error caps := selenium.Capabilities{"browserName": "chrome"} //caps := selenium.Capabilities{"browserName": "firefox"} for i := 0; i < 5; i++ { Driver, err = selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%v/wd/hub", 4444)) if err != nil { if strings.Contains(err.Error(), "connection refused") { time.Sleep(time.Second * time.Duration(i+1)) continue } if strings.Contains(err.Error(), "timeout") { time.Sleep(time.Second * time.Duration(i+1)) continue } return nil, err } } return &Browser{ Driver: Driver, }, err } func (b *Browser) Get(addr string) error { return b.Driver.Get(addr) } func (b *Browser) Close() error { if b == nil || b.Driver == nil { return nil } if err := b.Driver.Close(); err != nil { return err } if err := b.Driver.Quit(); err != nil { return err } return nil }