Skip to content

Commit

Permalink
should use sleeper generator for operations
Browse files Browse the repository at this point in the history
  • Loading branch information
ysmood committed Sep 2, 2020
1 parent 38450d4 commit 604786d
Show file tree
Hide file tree
Showing 10 changed files with 37 additions and 25 deletions.
4 changes: 2 additions & 2 deletions browser.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type Browser struct {
ctx context.Context
ctxCancel func()
timeoutCancel func()
sleeper utils.Sleeper
sleeper func() utils.Sleeper

// BrowserContextID is the id for incognito window
BrowserContextID proto.BrowserBrowserContextID
Expand All @@ -61,7 +61,7 @@ type Browser struct {
// New creates a controller
func New() *Browser {
b := &Browser{
sleeper: Sleeper,
sleeper: DefaultSleeper,
lock: &sync.Mutex{},
slowmotion: defaults.Slow,
quiet: defaults.Quiet,
Expand Down
12 changes: 6 additions & 6 deletions context.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ func (b *Browser) CancelTimeout() *Browser {
}

// Sleeper for chained sub-operations
func (b *Browser) Sleeper(sleeper utils.Sleeper) *Browser {
func (b *Browser) Sleeper(sleeper func() utils.Sleeper) *Browser {
newObj := *b
newObj.sleeper = sleeper
newObj.sleeper = ensureSleeper(sleeper)
return &newObj
}

Expand Down Expand Up @@ -67,9 +67,9 @@ func (p *Page) CancelTimeout() *Page {
}

// Sleeper for chained sub-operations
func (p *Page) Sleeper(sleeper utils.Sleeper) *Page {
func (p *Page) Sleeper(sleeper func() utils.Sleeper) *Page {
newObj := *p
newObj.sleeper = sleeper
newObj.sleeper = ensureSleeper(sleeper)
return &newObj
}

Expand Down Expand Up @@ -100,8 +100,8 @@ func (el *Element) CancelTimeout() *Element {
}

// Sleeper for chained sub-operations
func (el *Element) Sleeper(sleeper utils.Sleeper) *Element {
func (el *Element) Sleeper(sleeper func() utils.Sleeper) *Element {
newObj := *el
newObj.sleeper = sleeper
newObj.sleeper = ensureSleeper(sleeper)
return &newObj
}
4 changes: 2 additions & 2 deletions element.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type Element struct {
ctx context.Context
ctxCancel func()
timeoutCancel func()
sleeper utils.Sleeper
sleeper func() utils.Sleeper

page *Page

Expand Down Expand Up @@ -405,7 +405,7 @@ func (el *Element) WaitStable(interval time.Duration) error {

// Wait doc is similar to the method MustWait
func (el *Element) Wait(js string, params ...interface{}) error {
return utils.Retry(el.ctx, el.sleeper, func() (bool, error) {
return utils.Retry(el.ctx, el.sleeper(), func() (bool, error) {
res, err := el.Eval(js, params...)
if err != nil {
return true, err
Expand Down
2 changes: 1 addition & 1 deletion element_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ func (s *S) TestHover() {
func (s *S) TestElementContext() {
p := s.page.MustNavigate(srcFile("fixtures/click.html"))
el := p.MustElement("button").Timeout(time.Minute).CancelTimeout()
s.Error(el.Click(proto.InputMouseButtonLeft))
s.Error(el.Sleeper(rod.DefaultSleeper).Click(proto.InputMouseButtonLeft))
}

func (s *S) TestIframes() {
Expand Down
9 changes: 6 additions & 3 deletions examples_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/go-rod/rod/lib/input"
"github.com/go-rod/rod/lib/launcher"
"github.com/go-rod/rod/lib/proto"
"github.com/go-rod/rod/lib/utils"
)

// Example_basic is a simple test that opens https://github.com/, searches for
Expand Down Expand Up @@ -195,9 +196,11 @@ func Example_customize_retry_strategy() {
page := browser.MustPage("https://github.com")

// sleep for 0.5 seconds before every retry
sleeper := func(context.Context) error {
time.Sleep(time.Second / 2)
return nil
sleeper := func() utils.Sleeper {
return func(context.Context) error {
time.Sleep(time.Second / 2)
return nil
}
}
el, _ := page.Sleeper(sleeper).Element("input")

Expand Down
2 changes: 1 addition & 1 deletion lib/utils/utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ func Sleep(seconds float64) {
}

// Sleeper sleeps for sometime, returns the reason to wake, if ctx is done release resource
type Sleeper func(ctx context.Context) error
type Sleeper func(context.Context) error

// ErrMaxSleepCount ...
var ErrMaxSleepCount = errors.New("max sleep count")
Expand Down
6 changes: 3 additions & 3 deletions page.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type Page struct {
ctx context.Context
ctxCancel func()
timeoutCancel func()
sleeper utils.Sleeper
sleeper func() utils.Sleeper

browser *Browser

Expand Down Expand Up @@ -542,9 +542,9 @@ func (p *Page) EvalWithOptions(opts *EvalOptions) (*proto.RuntimeRemoteObject, e

// Wait js function until it returns true
func (p *Page) Wait(thisID proto.RuntimeRemoteObjectID, js string, params Array) error {
sleeper := p.sleeper
sleeper := p.sleeper()
if sleeper == nil {
sleeper = func(_ context.Context) error {
sleeper = func(context.Context) error {
return newErr(ErrWaitJSTimeout, js, js)
}
}
Expand Down
8 changes: 4 additions & 4 deletions query.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,9 @@ func (p *Page) ElementByJS(opts *EvalOptions) (*Element, error) {
var res *proto.RuntimeRemoteObject
var err error

sleeper := p.sleeper
sleeper := p.sleeper()
if sleeper == nil {
sleeper = func(_ context.Context) error {
sleeper = func(context.Context) error {
return newErr(ErrElementNotFound, opts, opts.JS)
}
}
Expand Down Expand Up @@ -230,9 +230,9 @@ func (p *Page) ElementsByJS(opts *EvalOptions) (Elements, error) {
// The query can be plain text or css selector or xpath.
// It will search nested iframes and shadow doms too.
func (p *Page) Search(from, to int, queries ...string) (Elements, error) {
sleeper := p.sleeper
sleeper := p.sleeper()
if sleeper == nil {
sleeper = func(_ context.Context) error {
sleeper = func(context.Context) error {
return newErr(ErrElementNotFound, queries, fmt.Sprintf("%v", queries))
}
}
Expand Down
2 changes: 1 addition & 1 deletion setup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func Test(t *testing.T) {
s.browser = rod.New().ControlURL("").Client(s.client).MustConnect().
DefaultViewport(&proto.EmulationSetDeviceMetricsOverride{
Width: 800, Height: 600, DeviceScaleFactor: 1,
})
}).Sleeper(rod.DefaultSleeper)

defer s.browser.MustClose()

Expand Down
13 changes: 11 additions & 2 deletions utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,18 @@ import (
// CDPCall type for cdp.Client.CDPCall
type CDPCall func(ctx context.Context, sessionID, method string, params interface{}) ([]byte, error)

// Sleeper is the default sleeper for retry, it uses backoff to grow the interval.
// DefaultSleeper generates the default sleeper for retry, it uses backoff to grow the interval.
// The growth looks like: A(0) = 100ms, A(n) = A(n-1) * random[1.9, 2.1), A(n) < 1s
var Sleeper = utils.BackoffSleeper(100*time.Millisecond, time.Second, nil)
var DefaultSleeper = func() utils.Sleeper {
return utils.BackoffSleeper(100*time.Millisecond, time.Second, nil)
}

func ensureSleeper(gen func() utils.Sleeper) func() utils.Sleeper {
if gen == nil {
return func() utils.Sleeper { return nil }
}
return gen
}

// Array of any type
type Array []interface{}
Expand Down

0 comments on commit 604786d

Please sign in to comment.