Damnit again

Former-commit-id: b394f26caf0df7d113ac4cc7dacc9c544af6897f
This commit is contained in:
bel
2019-06-21 18:12:31 -06:00
commit 90a31495c9
32 changed files with 3464 additions and 0 deletions

71
copart/browser/browser.go Normal file
View 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
}

View 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)
}
}

View 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,
}
}

View 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)
}