Damnit again
Former-commit-id: b394f26caf0df7d113ac4cc7dacc9c544af6897f
This commit is contained in:
71
copart/browser/browser.go
Normal file
71
copart/browser/browser.go
Normal file
@@ -0,0 +1,71 @@
|
||||
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
|
||||
}
|
||||
25
copart/browser/browser_test.go
Normal file
25
copart/browser/browser_test.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package browser
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNew(t *testing.T) {
|
||||
browser, err := New()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer browser.Close()
|
||||
|
||||
if err := browser.Driver.Get("https://www.google.com"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
elem, err := browser.Driver.FindElement("tag name", "body")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if elem == nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
91
copart/browser/mockselenium.go
Normal file
91
copart/browser/mockselenium.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package browser
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"local/storage"
|
||||
"sync"
|
||||
|
||||
"github.com/tebeka/selenium"
|
||||
)
|
||||
|
||||
type MockDriver struct {
|
||||
Ret *sync.Map
|
||||
}
|
||||
|
||||
var notImpl = errors.New("not impl")
|
||||
|
||||
func (wd MockDriver) Quit() error { return nil }
|
||||
func (wd MockDriver) Close() error { return nil }
|
||||
func (wd MockDriver) Get(string) error { return nil }
|
||||
func (wd MockDriver) GetCookies() ([]selenium.Cookie, error) { return []selenium.Cookie{}, nil }
|
||||
func (wd MockDriver) GetCookie(string) (selenium.Cookie, error) { return selenium.Cookie{}, nil }
|
||||
func (wd MockDriver) AddCookie(*selenium.Cookie) error { return nil }
|
||||
func (wd MockDriver) FindElement(_ string, key string) (selenium.WebElement, error) {
|
||||
v, err := wd.FindElements("", key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return v[0], nil
|
||||
}
|
||||
func (wd MockDriver) FindElements(_ string, key string) ([]selenium.WebElement, error) {
|
||||
we := []selenium.WebElement{}
|
||||
if v, ok := wd.Ret.Load(key); ok {
|
||||
w, _ := v.([]MockElement)
|
||||
for i := range w {
|
||||
we = append(we, w[i])
|
||||
}
|
||||
return we, nil
|
||||
}
|
||||
return nil, storage.ErrNotFound
|
||||
}
|
||||
|
||||
type MockElement struct {
|
||||
selenium.WebElement
|
||||
Ret map[string][]MockElement
|
||||
Txt string
|
||||
Attrs map[string]string
|
||||
}
|
||||
|
||||
func (we MockElement) FindElement(_ string, key string) (selenium.WebElement, error) {
|
||||
v, err := we.FindElements("", key)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return v[0], nil
|
||||
}
|
||||
func (we MockElement) FindElements(_ string, key string) ([]selenium.WebElement, error) {
|
||||
elems := []selenium.WebElement{}
|
||||
if v, ok := we.Ret[key]; ok {
|
||||
for i := range v {
|
||||
elems = append(elems, v[i])
|
||||
}
|
||||
return elems, nil
|
||||
}
|
||||
return nil, storage.ErrNotFound
|
||||
}
|
||||
func (we MockElement) Text() (string, error) { return we.Txt, nil }
|
||||
func (we MockElement) GetAttribute(key string) (string, error) {
|
||||
v, _ := we.Attrs[key]
|
||||
return v, nil
|
||||
}
|
||||
|
||||
func (we MockElement) Click() error { return notImpl }
|
||||
func (we MockElement) SendKeys(keys string) error { return notImpl }
|
||||
func (we MockElement) Submit() error { return notImpl }
|
||||
func (we MockElement) Clear() error { return notImpl }
|
||||
func (we MockElement) MoveTo(int, int) error { return notImpl }
|
||||
func (we MockElement) TagName() (string, error) { return "", notImpl }
|
||||
func (we MockElement) IsSelected() (bool, error) { return false, notImpl }
|
||||
func (we MockElement) IsEnabled() (bool, error) { return false, notImpl }
|
||||
func (we MockElement) IsDisplayed() (bool, error) { return false, notImpl }
|
||||
func (we MockElement) Location() (*selenium.Point, error) { return nil, notImpl }
|
||||
func (we MockElement) LocationInView() (*selenium.Point, error) { return nil, notImpl }
|
||||
func (we MockElement) Size() (*selenium.Size, error) { return nil, notImpl }
|
||||
func (we MockElement) CSSProperty(name string) (string, error) { return "", notImpl }
|
||||
func (we MockElement) Screenshot(bool) ([]byte, error) { return nil, notImpl }
|
||||
|
||||
func NewMockDriver(elements *sync.Map) *MockDriver {
|
||||
return &MockDriver{
|
||||
Ret: elements,
|
||||
}
|
||||
}
|
||||
17
copart/browser/mockselenium_test.go
Normal file
17
copart/browser/mockselenium_test.go
Normal file
@@ -0,0 +1,17 @@
|
||||
package browser
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/tebeka/selenium"
|
||||
)
|
||||
|
||||
func TestMockSeleniumInterfaces(t *testing.T) {
|
||||
var wd WebDriver
|
||||
wd = MockDriver{}
|
||||
|
||||
var we selenium.WebElement
|
||||
we = MockElement{}
|
||||
|
||||
t.Log(wd, we)
|
||||
}
|
||||
Reference in New Issue
Block a user