1
0
mirror of https://github.com/MontFerret/ferret.git synced 2025-06-27 00:41:09 +02:00

Added errors to ClickX methods and added existence check (#341)

* Added errors to ClickX methods and added existence check

* Fixes

* Return None from Iterator when an error occurs
This commit is contained in:
Tim Voronov
2019-07-26 13:22:06 -04:00
committed by GitHub
parent 7e6b3bf15d
commit b323a984cc
10 changed files with 78 additions and 62 deletions

View File

@ -263,7 +263,7 @@ func (doc *HTMLDocument) CountBySelector(ctx context.Context, selector values.St
return doc.element.CountBySelector(ctx, selector) return doc.element.CountBySelector(ctx, selector)
} }
func (doc *HTMLDocument) ExistsBySelector(ctx context.Context, selector values.String) values.Boolean { func (doc *HTMLDocument) ExistsBySelector(ctx context.Context, selector values.String) (values.Boolean, error) {
return doc.element.ExistsBySelector(ctx, selector) return doc.element.ExistsBySelector(ctx, selector)
} }
@ -317,28 +317,16 @@ func (doc *HTMLDocument) GetURL() values.String {
return values.NewString(doc.frames.Frame.URL) return values.NewString(doc.frames.Frame.URL)
} }
func (doc *HTMLDocument) ClickBySelector(ctx context.Context, selector values.String) (values.Boolean, error) { func (doc *HTMLDocument) ClickBySelector(ctx context.Context, selector values.String) error {
if err := doc.input.ClickBySelector(ctx, doc.element.id.nodeID, selector); err != nil { return doc.input.ClickBySelector(ctx, doc.element.id.nodeID, selector)
return values.False, err
}
return values.True, nil
} }
func (doc *HTMLDocument) ClickBySelectorAll(ctx context.Context, selector values.String) (values.Boolean, error) { func (doc *HTMLDocument) ClickBySelectorAll(ctx context.Context, selector values.String) error {
if err := doc.input.ClickBySelectorAll(ctx, doc.element.id.nodeID, selector); err != nil { return doc.input.ClickBySelectorAll(ctx, doc.element.id.nodeID, selector)
return values.False, err
}
return values.True, nil
} }
func (doc *HTMLDocument) InputBySelector(ctx context.Context, selector values.String, value core.Value, delay values.Int) (values.Boolean, error) { func (doc *HTMLDocument) InputBySelector(ctx context.Context, selector values.String, value core.Value, delay values.Int) error {
if err := doc.input.TypeBySelector(ctx, doc.element.id.nodeID, selector, value, delay); err != nil { return doc.input.TypeBySelector(ctx, doc.element.id.nodeID, selector, value, delay)
return values.False, err
}
return values.True, nil
} }
func (doc *HTMLDocument) SelectBySelector(ctx context.Context, selector values.String, value *values.Array) (*values.Array, error) { func (doc *HTMLDocument) SelectBySelector(ctx context.Context, selector values.String, value *values.Array) (*values.Array, error) {

View File

@ -850,9 +850,9 @@ func (el *HTMLElement) CountBySelector(ctx context.Context, selector values.Stri
return values.NewInt(len(res.NodeIDs)) return values.NewInt(len(res.NodeIDs))
} }
func (el *HTMLElement) ExistsBySelector(ctx context.Context, selector values.String) values.Boolean { func (el *HTMLElement) ExistsBySelector(ctx context.Context, selector values.String) (values.Boolean, error) {
if el.IsDetached() { if el.IsDetached() {
return values.False return values.False, drivers.ErrDetached
} }
// TODO: Can we use RemoteObjectID or BackendID instead of NodeId? // TODO: Can we use RemoteObjectID or BackendID instead of NodeId?
@ -860,18 +860,14 @@ func (el *HTMLElement) ExistsBySelector(ctx context.Context, selector values.Str
res, err := el.client.DOM.QuerySelector(ctx, selectorArgs) res, err := el.client.DOM.QuerySelector(ctx, selectorArgs)
if err != nil { if err != nil {
el.logError(err). return values.False, err
Str("selector", selector.String()).
Msg("failed to retrieve nodes by selector")
return values.False
} }
if res.NodeID == 0 { if res.NodeID == 0 {
return values.False return values.False, nil
} }
return values.True return values.True, nil
} }
func (el *HTMLElement) WaitForClass(ctx context.Context, class values.String, when drivers.WaitEvent) error { func (el *HTMLElement) WaitForClass(ctx context.Context, class values.String, when drivers.WaitEvent) error {
@ -947,12 +943,8 @@ func (el *HTMLElement) WaitForStyle(ctx context.Context, name values.String, val
return err return err
} }
func (el *HTMLElement) Click(ctx context.Context) (values.Boolean, error) { func (el *HTMLElement) Click(ctx context.Context) error {
if err := el.input.Click(ctx, el.id.objectID); err != nil { return el.input.Click(ctx, el.id.objectID)
return values.False, err
}
return values.True, nil
} }
func (el *HTMLElement) Input(ctx context.Context, value core.Value, delay values.Int) error { func (el *HTMLElement) Input(ctx context.Context, value core.Value, delay values.Int) error {

View File

@ -169,7 +169,7 @@ func (doc *HTMLDocument) CountBySelector(ctx context.Context, selector values.St
return doc.element.CountBySelector(ctx, selector) return doc.element.CountBySelector(ctx, selector)
} }
func (doc *HTMLDocument) ExistsBySelector(ctx context.Context, selector values.String) values.Boolean { func (doc *HTMLDocument) ExistsBySelector(ctx context.Context, selector values.String) (values.Boolean, error) {
return doc.element.ExistsBySelector(ctx, selector) return doc.element.ExistsBySelector(ctx, selector)
} }
@ -207,16 +207,16 @@ func (doc *HTMLDocument) GetParentDocument() drivers.HTMLDocument {
return doc.parent return doc.parent
} }
func (doc *HTMLDocument) ClickBySelector(_ context.Context, _ values.String) (values.Boolean, error) { func (doc *HTMLDocument) ClickBySelector(_ context.Context, _ values.String) error {
return false, core.ErrNotSupported return core.ErrNotSupported
} }
func (doc *HTMLDocument) ClickBySelectorAll(_ context.Context, _ values.String) (values.Boolean, error) { func (doc *HTMLDocument) ClickBySelectorAll(_ context.Context, _ values.String) error {
return false, core.ErrNotSupported return core.ErrNotSupported
} }
func (doc *HTMLDocument) InputBySelector(_ context.Context, _ values.String, _ core.Value, _ values.Int) (values.Boolean, error) { func (doc *HTMLDocument) InputBySelector(_ context.Context, _ values.String, _ core.Value, _ values.Int) error {
return false, core.ErrNotSupported return core.ErrNotSupported
} }
func (doc *HTMLDocument) SelectBySelector(_ context.Context, _ values.String, _ *values.Array) (*values.Array, error) { func (doc *HTMLDocument) SelectBySelector(_ context.Context, _ values.String, _ *values.Array) (*values.Array, error) {

View File

@ -467,14 +467,14 @@ func (el *HTMLElement) CountBySelector(_ context.Context, selector values.String
return values.NewInt(selection.Size()) return values.NewInt(selection.Size())
} }
func (el *HTMLElement) ExistsBySelector(_ context.Context, selector values.String) values.Boolean { func (el *HTMLElement) ExistsBySelector(_ context.Context, selector values.String) (values.Boolean, error) {
selection := el.selection.Closest(selector.String()) selection := el.selection.Closest(selector.String())
if selection == nil { if selection == nil {
return values.False return values.False, nil
} }
return values.True return values.True, nil
} }
func (el *HTMLElement) GetIn(ctx context.Context, path []core.Value) (core.Value, error) { func (el *HTMLElement) GetIn(ctx context.Context, path []core.Value) (core.Value, error) {
@ -489,8 +489,8 @@ func (el *HTMLElement) Iterate(_ context.Context) (core.Iterator, error) {
return common.NewIterator(el) return common.NewIterator(el)
} }
func (el *HTMLElement) Click(_ context.Context) (values.Boolean, error) { func (el *HTMLElement) Click(_ context.Context) error {
return false, core.ErrNotSupported return core.ErrNotSupported
} }
func (el *HTMLElement) Input(_ context.Context, _ core.Value, _ values.Int) error { func (el *HTMLElement) Input(_ context.Context, _ core.Value, _ values.Int) error {

View File

@ -40,7 +40,7 @@ type (
CountBySelector(ctx context.Context, selector values.String) values.Int CountBySelector(ctx context.Context, selector values.String) values.Int
ExistsBySelector(ctx context.Context, selector values.String) values.Boolean ExistsBySelector(ctx context.Context, selector values.String) (values.Boolean, error)
XPath(ctx context.Context, expression values.String) (core.Value, error) XPath(ctx context.Context, expression values.String) (core.Value, error)
} }
@ -93,7 +93,7 @@ type (
GetInnerTextBySelectorAll(ctx context.Context, selector values.String) (*values.Array, error) GetInnerTextBySelectorAll(ctx context.Context, selector values.String) (*values.Array, error)
Click(ctx context.Context) (values.Boolean, error) Click(ctx context.Context) error
Input(ctx context.Context, value core.Value, delay values.Int) error Input(ctx context.Context, value core.Value, delay values.Int) error
@ -127,11 +127,11 @@ type (
GetChildDocuments(ctx context.Context) (*values.Array, error) GetChildDocuments(ctx context.Context) (*values.Array, error)
ClickBySelector(ctx context.Context, selector values.String) (values.Boolean, error) ClickBySelector(ctx context.Context, selector values.String) error
ClickBySelectorAll(ctx context.Context, selector values.String) (values.Boolean, error) ClickBySelectorAll(ctx context.Context, selector values.String) error
InputBySelector(ctx context.Context, selector values.String, value core.Value, delay values.Int) (values.Boolean, error) InputBySelector(ctx context.Context, selector values.String, value core.Value, delay values.Int) error
SelectBySelector(ctx context.Context, selector values.String, value *values.Array) (*values.Array, error) SelectBySelector(ctx context.Context, selector values.String, value *values.Array) (*values.Array, error)

View File

@ -26,7 +26,7 @@ func Click(ctx context.Context, args ...core.Value) (core.Value, error) {
return values.False, err return values.False, err
} }
return el.Click(ctx) return values.True, el.Click(ctx)
} }
// CLICK(doc, selector) // CLICK(doc, selector)
@ -36,7 +36,16 @@ func Click(ctx context.Context, args ...core.Value) (core.Value, error) {
return values.False, err return values.False, err
} }
selector := args[1].String() selector := values.ToString(args[1])
exists, err := doc.ExistsBySelector(ctx, selector)
return doc.ClickBySelector(ctx, values.NewString(selector)) if err != nil {
return values.False, err
}
if !exists {
return exists, nil
}
return exists, doc.ClickBySelector(ctx, selector)
} }

View File

@ -25,7 +25,17 @@ func ClickAll(ctx context.Context, args ...core.Value) (core.Value, error) {
return values.None, err return values.None, err
} }
selector := args[1].String() selector := values.ToString(args[1])
return doc.ClickBySelectorAll(ctx, values.NewString(selector)) exists, err := doc.ExistsBySelector(ctx, selector)
if err != nil {
return values.False, err
}
if !exists {
return values.False, nil
}
return values.True, doc.ClickBySelectorAll(ctx, selector)
} }

View File

@ -18,5 +18,5 @@ func ElementExists(ctx context.Context, args ...core.Value) (core.Value, error)
return values.None, err return values.None, err
} }
return el.ExistsBySelector(ctx, selector), nil return el.ExistsBySelector(ctx, selector)
} }

View File

@ -44,6 +44,7 @@ func Input(ctx context.Context, args ...core.Value) (core.Value, error) {
return values.False, err return values.False, err
} }
selector := values.ToString(arg2)
delay := values.Int(0) delay := values.Int(0)
if len(args) == 4 { if len(args) == 4 {
@ -55,10 +56,20 @@ func Input(ctx context.Context, args ...core.Value) (core.Value, error) {
return values.False, err return values.False, err
} }
delay = arg4.(values.Int) delay = values.ToInt(arg4)
} }
return doc.InputBySelector(ctx, arg2.(values.String), args[2], delay) exists, err := doc.ExistsBySelector(ctx, selector)
if err != nil {
return values.False, err
}
if !exists {
return values.False, nil
}
return values.True, doc.InputBySelector(ctx, selector, args[2], delay)
} }
el, err := drivers.ToElement(arg1) el, err := drivers.ToElement(arg1)

View File

@ -92,11 +92,17 @@ func (i *PagingIterator) Next(ctx context.Context) (core.Value, core.Value, erro
return values.ZeroInt, values.ZeroInt, nil return values.ZeroInt, values.ZeroInt, nil
} }
if !i.document.ExistsBySelector(ctx, i.selector) { exists, err := i.document.ExistsBySelector(ctx, i.selector)
return values.ZeroInt, values.ZeroInt, core.ErrNoMoreData
if err != nil {
return values.None, values.None, err
} }
_, err := i.document.ClickBySelector(ctx, i.selector) if !exists {
return values.None, values.None, core.ErrNoMoreData
}
err = i.document.ClickBySelector(ctx, i.selector)
if err != nil { if err != nil {
return values.None, values.None, err return values.None, values.None, err