forked from saurabh-agarwals/agouti
-
Notifications
You must be signed in to change notification settings - Fork 0
/
repository.go
138 lines (113 loc) · 2.9 KB
/
repository.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package element
import (
"errors"
"fmt"
"github.com/Aayushi-Bansal/agouti/api"
"github.com/Aayushi-Bansal/agouti/internal/target"
)
type Repository struct {
Client Client
Selectors target.Selectors
}
type Client interface {
GetElement(selector api.Selector) (*api.Element, error)
GetElements(selector api.Selector) ([]*api.Element, error)
}
type Element interface {
Client
GetID() string
GetText() (string, error)
GetName() (string, error)
GetAttribute(attribute string) (string, error)
GetCSS(property string) (string, error)
IsSelected() (bool, error)
IsDisplayed() (bool, error)
IsEnabled() (bool, error)
IsEqualTo(other *api.Element) (bool, error)
Click() error
Clear() error
Value(text string) error
Submit() error
GetLocation() (x, y int, err error)
}
func (e *Repository) GetAtLeastOne() ([]Element, error) {
elements, err := e.Get()
if err != nil {
return nil, err
}
if len(elements) == 0 {
return nil, errors.New("no elements found")
}
return elements, nil
}
func (e *Repository) GetExactlyOne() (Element, error) {
elements, err := e.GetAtLeastOne()
if err != nil {
return nil, err
}
if len(elements) > 1 {
return nil, fmt.Errorf("method does not support multiple elements (%d)", len(elements))
}
return elements[0], nil
}
func (e *Repository) Get() ([]Element, error) {
if len(e.Selectors) == 0 {
return nil, errors.New("empty selection")
}
lastElements, err := retrieveElements(e.Client, e.Selectors[0])
if err != nil {
return nil, err
}
for _, selector := range e.Selectors[1:] {
elements := []Element{}
for _, element := range lastElements {
subElements, err := retrieveElements(element, selector)
if err != nil {
return nil, err
}
elements = append(elements, subElements...)
}
lastElements = elements
}
return lastElements, nil
}
func retrieveElements(client Client, selector target.Selector) ([]Element, error) {
if selector.Single {
elements, err := client.GetElements(selector.API())
if err != nil {
return nil, err
}
if len(elements) == 0 {
return nil, errors.New("element not found")
} else if len(elements) > 1 {
return nil, errors.New("ambiguous find")
}
return []Element{Element(elements[0])}, nil
}
if selector.Indexed && selector.Index > 0 {
elements, err := client.GetElements(selector.API())
if err != nil {
return nil, err
}
if selector.Index >= len(elements) {
return nil, errors.New("element index out of range")
}
return []Element{Element(elements[selector.Index])}, nil
}
if selector.Indexed && selector.Index == 0 {
element, err := client.GetElement(selector.API())
if err != nil {
return nil, err
}
return []Element{Element(element)}, nil
}
elements, err := client.GetElements(selector.API())
if err != nil {
return nil, err
}
newElements := []Element{}
for _, element := range elements {
newElements = append(newElements, element)
}
return newElements, nil
}