mirror of
https://github.com/MontFerret/ferret.git
synced 2025-11-06 08:39:09 +02:00
Externalized common timeout values (#371)
* Externalized common timeout values * Updated go.sum
This commit is contained in:
@@ -326,19 +326,19 @@ func (doc *HTMLDocument) ClickBySelectorAll(ctx context.Context, selector values
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) SelectBySelector(ctx context.Context, selector values.String, value *values.Array) (*values.Array, error) {
|
||||
return doc.input.SelectBySelector(ctx, doc.element.id.nodeID, selector, value)
|
||||
return doc.input.SelectBySelector(ctx, doc.element.id.nodeID, selector.String(), value)
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) FocusBySelector(ctx context.Context, selector values.String) error {
|
||||
return doc.input.FocusBySelector(ctx, doc.element.id.nodeID, selector)
|
||||
return doc.input.FocusBySelector(ctx, doc.element.id.nodeID, selector.String())
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) MoveMouseBySelector(ctx context.Context, selector values.String) error {
|
||||
return doc.input.MoveMouseBySelector(ctx, doc.element.id.nodeID, selector)
|
||||
return doc.input.MoveMouseBySelector(ctx, doc.element.id.nodeID, selector.String())
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) MoveMouseByXY(ctx context.Context, x, y values.Float) error {
|
||||
return doc.input.MoveMouseByXY(ctx, x, y)
|
||||
return doc.input.MoveMouseByXY(ctx, float64(x), float64(y))
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) WaitForElement(ctx context.Context, selector values.String, when drivers.WaitEvent) error {
|
||||
@@ -497,11 +497,11 @@ func (doc *HTMLDocument) ScrollBottom(ctx context.Context) error {
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) ScrollBySelector(ctx context.Context, selector values.String) error {
|
||||
return doc.input.ScrollIntoViewBySelector(ctx, selector)
|
||||
return doc.input.ScrollIntoViewBySelector(ctx, selector.String())
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) ScrollByXY(ctx context.Context, x, y values.Float) error {
|
||||
return doc.input.ScrollByXY(ctx, x, y)
|
||||
return doc.input.ScrollByXY(ctx, float64(x), float64(y))
|
||||
}
|
||||
|
||||
func (doc *HTMLDocument) loadChildren(ctx context.Context) (value core.Value, e error) {
|
||||
|
||||
@@ -2,15 +2,13 @@ package cdp
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/mafredri/cdp"
|
||||
"github.com/mafredri/cdp/devtool"
|
||||
"github.com/mafredri/cdp/protocol/target"
|
||||
"github.com/mafredri/cdp/rpcc"
|
||||
"github.com/mafredri/cdp/session"
|
||||
"github.com/pkg/errors"
|
||||
"sync"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/drivers"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/logging"
|
||||
@@ -18,7 +16,6 @@ import (
|
||||
|
||||
const DriverName = "cdp"
|
||||
const BlankPageURL = "about:blank"
|
||||
const DefaultTimeout = 5000 * time.Millisecond
|
||||
|
||||
var defaultViewport = &drivers.Viewport{
|
||||
Width: 1600,
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/drivers"
|
||||
"github.com/MontFerret/ferret/pkg/drivers/cdp/eval"
|
||||
@@ -208,7 +209,7 @@ func (el *HTMLElement) MarshalJSON() ([]byte, error) {
|
||||
}
|
||||
|
||||
func (el *HTMLElement) String() string {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), DefaultTimeout)
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(drivers.DefaultWaitTimeout)*time.Millisecond)
|
||||
defer cancel()
|
||||
|
||||
res, err := el.GetInnerHTML(ctx)
|
||||
@@ -1056,11 +1057,11 @@ func (el *HTMLElement) Click(ctx context.Context) error {
|
||||
}
|
||||
|
||||
func (el *HTMLElement) ClickBySelector(ctx context.Context, selector values.String) error {
|
||||
return el.input.ClickBySelector(ctx, el.id.nodeID, selector)
|
||||
return el.input.ClickBySelector(ctx, el.id.nodeID, selector.String())
|
||||
}
|
||||
|
||||
func (el *HTMLElement) ClickBySelectorAll(ctx context.Context, selector values.String) error {
|
||||
return el.input.ClickBySelectorAll(ctx, el.id.nodeID, selector)
|
||||
return el.input.ClickBySelectorAll(ctx, el.id.nodeID, selector.String())
|
||||
}
|
||||
|
||||
func (el *HTMLElement) Input(ctx context.Context, value core.Value, delay values.Int) error {
|
||||
@@ -1069,17 +1070,17 @@ func (el *HTMLElement) Input(ctx context.Context, value core.Value, delay values
|
||||
}
|
||||
|
||||
return el.input.Type(ctx, el.id.objectID, input.TypeParams{
|
||||
Text: value,
|
||||
Text: value.String(),
|
||||
Clear: false,
|
||||
Delay: delay,
|
||||
Delay: time.Duration(delay) * time.Millisecond,
|
||||
})
|
||||
}
|
||||
|
||||
func (el *HTMLElement) InputBySelector(ctx context.Context, selector values.String, value core.Value, delay values.Int) error {
|
||||
return el.input.TypeBySelector(ctx, el.id.nodeID, selector, input.TypeParams{
|
||||
Text: value,
|
||||
return el.input.TypeBySelector(ctx, el.id.nodeID, selector.String(), input.TypeParams{
|
||||
Text: value.String(),
|
||||
Clear: false,
|
||||
Delay: delay,
|
||||
Delay: time.Duration(delay) * time.Millisecond,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1088,7 +1089,7 @@ func (el *HTMLElement) Clear(ctx context.Context) error {
|
||||
}
|
||||
|
||||
func (el *HTMLElement) ClearBySelector(ctx context.Context, selector values.String) error {
|
||||
return el.input.ClearBySelector(ctx, el.id.nodeID, selector)
|
||||
return el.input.ClearBySelector(ctx, el.id.nodeID, selector.String())
|
||||
}
|
||||
|
||||
func (el *HTMLElement) Select(ctx context.Context, value *values.Array) (*values.Array, error) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"reflect"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/mafredri/cdp/protocol/dom"
|
||||
"github.com/mafredri/cdp/protocol/page"
|
||||
@@ -289,7 +290,7 @@ func (broker *EventBroker) emit(ctx context.Context, event Event, message interf
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
ctx2, fn := drivers.WithDefaultTimeout(ctx)
|
||||
ctx2, fn := context.WithTimeout(ctx, time.Duration(drivers.DefaultTimeout)*time.Millisecond)
|
||||
|
||||
listener(ctx2, message)
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ func (k *Keyboard) Up(ctx context.Context, char string) error {
|
||||
)
|
||||
}
|
||||
|
||||
func (k *Keyboard) Type(ctx context.Context, text string, delay int) error {
|
||||
func (k *Keyboard) Type(ctx context.Context, text string, delay time.Duration) error {
|
||||
for _, ch := range text {
|
||||
ch := string(ch)
|
||||
|
||||
@@ -70,7 +70,7 @@ func (k *Keyboard) Type(ctx context.Context, text string, delay int) error {
|
||||
return err
|
||||
}
|
||||
|
||||
releaseDelay := randomDuration(delay) * time.Millisecond
|
||||
releaseDelay := randomDuration(int(delay))
|
||||
time.Sleep(releaseDelay)
|
||||
|
||||
if err := k.Up(ctx, ch); err != nil {
|
||||
|
||||
@@ -8,6 +8,7 @@ import (
|
||||
"github.com/mafredri/cdp/protocol/dom"
|
||||
"github.com/mafredri/cdp/protocol/runtime"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/drivers"
|
||||
"github.com/MontFerret/ferret/pkg/drivers/cdp/eval"
|
||||
"github.com/MontFerret/ferret/pkg/drivers/cdp/templates"
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
@@ -16,9 +17,9 @@ import (
|
||||
|
||||
type (
|
||||
TypeParams struct {
|
||||
Text core.Value
|
||||
Clear values.Boolean
|
||||
Delay values.Int
|
||||
Text string
|
||||
Clear bool
|
||||
Delay time.Duration
|
||||
}
|
||||
|
||||
Manager struct {
|
||||
@@ -69,14 +70,14 @@ func (m *Manager) ScrollIntoView(ctx context.Context, objectID runtime.RemoteObj
|
||||
)
|
||||
}
|
||||
|
||||
func (m *Manager) ScrollIntoViewBySelector(ctx context.Context, selector values.String) error {
|
||||
return m.exec.Eval(ctx, templates.ScrollIntoViewBySelector(selector.String()))
|
||||
func (m *Manager) ScrollIntoViewBySelector(ctx context.Context, selector string) error {
|
||||
return m.exec.Eval(ctx, templates.ScrollIntoViewBySelector(selector))
|
||||
}
|
||||
|
||||
func (m *Manager) ScrollByXY(ctx context.Context, x, y values.Float) error {
|
||||
func (m *Manager) ScrollByXY(ctx context.Context, x, y float64) error {
|
||||
return m.exec.Eval(
|
||||
ctx,
|
||||
templates.Scroll(eval.ParamFloat(float64(x)), eval.ParamFloat(float64(y))),
|
||||
templates.Scroll(eval.ParamFloat(x), eval.ParamFloat(y)),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -90,14 +91,14 @@ func (m *Manager) Focus(ctx context.Context, objectID runtime.RemoteObjectID) er
|
||||
return m.client.DOM.Focus(ctx, dom.NewFocusArgs().SetObjectID(objectID))
|
||||
}
|
||||
|
||||
func (m *Manager) FocusBySelector(ctx context.Context, parentNodeID dom.NodeID, selector values.String) error {
|
||||
func (m *Manager) FocusBySelector(ctx context.Context, parentNodeID dom.NodeID, selector string) error {
|
||||
err := m.ScrollIntoViewBySelector(ctx, selector)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector.String()))
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector))
|
||||
|
||||
if err != nil {
|
||||
return nil
|
||||
@@ -120,12 +121,12 @@ func (m *Manager) MoveMouse(ctx context.Context, objectID runtime.RemoteObjectID
|
||||
return m.mouse.Move(ctx, q.X, q.Y)
|
||||
}
|
||||
|
||||
func (m *Manager) MoveMouseBySelector(ctx context.Context, parentNodeID dom.NodeID, selector values.String) error {
|
||||
func (m *Manager) MoveMouseBySelector(ctx context.Context, parentNodeID dom.NodeID, selector string) error {
|
||||
if err := m.ScrollIntoViewBySelector(ctx, selector); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector.String()))
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -140,12 +141,12 @@ func (m *Manager) MoveMouseBySelector(ctx context.Context, parentNodeID dom.Node
|
||||
return m.mouse.Move(ctx, q.X, q.Y)
|
||||
}
|
||||
|
||||
func (m *Manager) MoveMouseByXY(ctx context.Context, x, y values.Float) error {
|
||||
func (m *Manager) MoveMouseByXY(ctx context.Context, x, y float64) error {
|
||||
if err := m.ScrollByXY(ctx, x, y); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return m.mouse.Move(ctx, float64(x), float64(y))
|
||||
return m.mouse.Move(ctx, x, y)
|
||||
}
|
||||
|
||||
func (m *Manager) Click(ctx context.Context, objectID runtime.RemoteObjectID) error {
|
||||
@@ -159,19 +160,19 @@ func (m *Manager) Click(ctx context.Context, objectID runtime.RemoteObjectID) er
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.mouse.Click(ctx, points.X, points.Y, 50); err != nil {
|
||||
if err := m.mouse.Click(ctx, points.X, points.Y, drivers.DefaultInputDelay); err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Manager) ClickBySelector(ctx context.Context, parentNodeID dom.NodeID, selector values.String) error {
|
||||
func (m *Manager) ClickBySelector(ctx context.Context, parentNodeID dom.NodeID, selector string) error {
|
||||
if err := m.ScrollIntoViewBySelector(ctx, selector); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector.String()))
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -183,29 +184,29 @@ func (m *Manager) ClickBySelector(ctx context.Context, parentNodeID dom.NodeID,
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.mouse.Click(ctx, points.X, points.Y, 50); err != nil {
|
||||
if err := m.mouse.Click(ctx, points.X, points.Y, drivers.DefaultInputDelay); err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Manager) ClickBySelectorAll(ctx context.Context, parentNodeID dom.NodeID, selector values.String) error {
|
||||
func (m *Manager) ClickBySelectorAll(ctx context.Context, parentNodeID dom.NodeID, selector string) error {
|
||||
if err := m.ScrollIntoViewBySelector(ctx, selector); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := m.client.DOM.QuerySelectorAll(ctx, dom.NewQuerySelectorAllArgs(parentNodeID, selector.String()))
|
||||
found, err := m.client.DOM.QuerySelectorAll(ctx, dom.NewQuerySelectorAllArgs(parentNodeID, selector))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, nodeID := range found.NodeIDs {
|
||||
_, min := core.NumberBoundaries(100)
|
||||
beforeTypeDelay := time.Duration(min)
|
||||
_, min := core.NumberBoundaries(drivers.DefaultInputDelay * 2)
|
||||
beforeTypeDelay := time.Duration(min) * time.Millisecond
|
||||
|
||||
time.Sleep(beforeTypeDelay * time.Millisecond)
|
||||
time.Sleep(beforeTypeDelay)
|
||||
|
||||
points, err := GetClickablePointByNodeID(ctx, m.client, nodeID)
|
||||
|
||||
@@ -213,7 +214,7 @@ func (m *Manager) ClickBySelectorAll(ctx context.Context, parentNodeID dom.NodeI
|
||||
return err
|
||||
}
|
||||
|
||||
if err := m.mouse.Click(ctx, points.X, points.Y, 50); err != nil {
|
||||
if err := m.mouse.Click(ctx, points.X, points.Y, drivers.DefaultInputDelay); err != nil {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
@@ -246,22 +247,22 @@ func (m *Manager) Type(ctx context.Context, objectID runtime.RemoteObjectID, par
|
||||
}
|
||||
}
|
||||
|
||||
_, min := core.NumberBoundaries(float64(params.Delay))
|
||||
beforeTypeDelay := time.Duration(min)
|
||||
d := core.NumberLowerBoundary(float64(params.Delay))
|
||||
beforeTypeDelay := time.Duration(d)
|
||||
|
||||
time.Sleep(beforeTypeDelay * time.Millisecond)
|
||||
time.Sleep(beforeTypeDelay)
|
||||
|
||||
return m.keyboard.Type(ctx, params.Text.String(), int(params.Delay))
|
||||
return m.keyboard.Type(ctx, params.Text, params.Delay)
|
||||
}
|
||||
|
||||
func (m *Manager) TypeBySelector(ctx context.Context, parentNodeID dom.NodeID, selector values.String, params TypeParams) error {
|
||||
func (m *Manager) TypeBySelector(ctx context.Context, parentNodeID dom.NodeID, selector string, params TypeParams) error {
|
||||
err := m.ScrollIntoViewBySelector(ctx, selector)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector.String()))
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -285,12 +286,12 @@ func (m *Manager) TypeBySelector(ctx context.Context, parentNodeID dom.NodeID, s
|
||||
}
|
||||
}
|
||||
|
||||
_, min := core.NumberBoundaries(float64(params.Delay))
|
||||
beforeTypeDelay := time.Duration(min)
|
||||
d := core.NumberLowerBoundary(float64(params.Delay))
|
||||
beforeTypeDelay := time.Duration(d)
|
||||
|
||||
time.Sleep(beforeTypeDelay * time.Millisecond)
|
||||
time.Sleep(beforeTypeDelay)
|
||||
|
||||
return m.keyboard.Type(ctx, params.Text.String(), int(params.Delay))
|
||||
return m.keyboard.Type(ctx, params.Text, params.Delay)
|
||||
}
|
||||
|
||||
func (m *Manager) Clear(ctx context.Context, objectID runtime.RemoteObjectID) error {
|
||||
@@ -315,14 +316,14 @@ func (m *Manager) Clear(ctx context.Context, objectID runtime.RemoteObjectID) er
|
||||
return m.ClearByXY(ctx, points)
|
||||
}
|
||||
|
||||
func (m *Manager) ClearBySelector(ctx context.Context, parentNodeID dom.NodeID, selector values.String) error {
|
||||
func (m *Manager) ClearBySelector(ctx context.Context, parentNodeID dom.NodeID, selector string) error {
|
||||
err := m.ScrollIntoViewBySelector(ctx, selector)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector.String()))
|
||||
found, err := m.client.DOM.QuerySelector(ctx, dom.NewQuerySelectorArgs(parentNodeID, selector))
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -375,12 +376,12 @@ func (m *Manager) Select(ctx context.Context, objectID runtime.RemoteObjectID, v
|
||||
return arr, nil
|
||||
}
|
||||
|
||||
func (m *Manager) SelectBySelector(ctx context.Context, parentNodeID dom.NodeID, selector values.String, value *values.Array) (*values.Array, error) {
|
||||
func (m *Manager) SelectBySelector(ctx context.Context, parentNodeID dom.NodeID, selector string, value *values.Array) (*values.Array, error) {
|
||||
if err := m.FocusBySelector(ctx, parentNodeID, selector); err != nil {
|
||||
return values.NewArray(0), err
|
||||
}
|
||||
|
||||
res, err := m.exec.EvalWithReturnValue(ctx, templates.SelectBySelector(selector.String(), value.String()))
|
||||
res, err := m.exec.EvalWithReturnValue(ctx, templates.SelectBySelector(selector, value.String()))
|
||||
|
||||
if err != nil {
|
||||
return values.NewArray(0), err
|
||||
|
||||
8
pkg/drivers/consts.go
Normal file
8
pkg/drivers/consts.go
Normal file
@@ -0,0 +1,8 @@
|
||||
package drivers
|
||||
|
||||
const (
|
||||
DefaultPageLoadTimeout = 60000
|
||||
DefaultWaitTimeout = 5000
|
||||
DefaultInputDelay = 25
|
||||
DefaultTimeout = 30000
|
||||
)
|
||||
@@ -2,14 +2,10 @@ package drivers
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"time"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
"io"
|
||||
)
|
||||
|
||||
const DefaultTimeout = time.Second * 30
|
||||
|
||||
type (
|
||||
ctxKey struct{}
|
||||
|
||||
|
||||
@@ -1,15 +1,9 @@
|
||||
package drivers
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/MontFerret/ferret/pkg/runtime/core"
|
||||
)
|
||||
|
||||
func WithDefaultTimeout(ctx context.Context) (context.Context, context.CancelFunc) {
|
||||
return context.WithTimeout(ctx, DefaultTimeout)
|
||||
}
|
||||
|
||||
func ToPage(value core.Value) (HTMLPage, error) {
|
||||
err := core.ValidateType(value, HTMLPageType)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user