capybara-ng 0.0.3 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +88 -3
- data/lib/angular.rb +2 -0
- data/lib/angular/capybara_setup.rb +4 -0
- data/lib/angular/dsl.rb +170 -32
- data/lib/angular/setup.rb +36 -5
- data/lib/angular/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52f9e96dfa5ce32dfc53c66148d301d82e20dbc1
|
4
|
+
data.tar.gz: 0827939aa362e10eedea420ecee2baa077aa98c2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48174a887a6f82642bd390f24383e2c8f360104a89904fc42c6398b47189f0dbf5bd0773c62b35ba0e5a1f5868eb8079f62d69fd231505cdb63fc5f2b4fbb517
|
7
|
+
data.tar.gz: 1fc2e8382d0d81355b214cbcdf69b7bd8b285b253d486beff3dbc65df881073ac1b7000faf1a5164d2439deb4304b5c0b937aea84c72040ef05fba193dd468bc
|
data/README.md
CHANGED
@@ -1,7 +1,18 @@
|
|
1
1
|
# Angular
|
2
2
|
|
3
|
-
Basic bindings for AngularJS to be used with Capybara.
|
3
|
+
Basic bindings for AngularJS to be used with Capybara. Implementation is based into
|
4
|
+
logic copied from Protractor.
|
4
5
|
|
6
|
+
NOTE: At this point of development, I would classify DSL API "unstable". This means that
|
7
|
+
DSL language may change in incompatible ways.
|
8
|
+
|
9
|
+
## Related Projects
|
10
|
+
|
11
|
+
- https://github.com/jnicklas/capybara
|
12
|
+
- https://github.com/angular/protractor
|
13
|
+
- https://code.google.com/p/selenium/wiki/RubyBindings
|
14
|
+
- https://github.com/teampoltergeist/poltergeist
|
15
|
+
- https://github.com/colszowka/phantomjs-gem
|
5
16
|
|
6
17
|
## Installation
|
7
18
|
|
@@ -20,12 +31,22 @@ Or install it yourself as:
|
|
20
31
|
|
21
32
|
## Usage
|
22
33
|
|
34
|
+
### Setup
|
35
|
+
|
36
|
+
spec/spec_helper.rb
|
37
|
+
````ruby
|
38
|
+
RSpec.configure do |config|
|
39
|
+
config.include Angular::DSL
|
40
|
+
...
|
41
|
+
end
|
42
|
+
```
|
43
|
+
|
44
|
+
### Experimenting features
|
45
|
+
|
23
46
|
````ruby
|
24
47
|
require 'spec_helper'
|
25
48
|
|
26
49
|
describe 'capybara', type: :feature do
|
27
|
-
include Angular::DSL
|
28
|
-
|
29
50
|
it 'test' do
|
30
51
|
visit 'http://localhost:4000/sampler'
|
31
52
|
|
@@ -76,6 +97,70 @@ describe 'capybara', type: :feature do
|
|
76
97
|
end
|
77
98
|
```
|
78
99
|
|
100
|
+
### Example test
|
101
|
+
Example taken from https://github.com/kikonen/sampler/blob/master/dummy/spec/request/task_spec.rb
|
102
|
+
|
103
|
+
#### Test file
|
104
|
+
````ruby
|
105
|
+
require 'spec_helper'
|
106
|
+
|
107
|
+
describe 'capybara', type: :feature do
|
108
|
+
include Angular::DSL
|
109
|
+
|
110
|
+
it 'create task' do
|
111
|
+
visit 'http://localhost:4000/sampler'
|
112
|
+
|
113
|
+
init_task_count = 2
|
114
|
+
|
115
|
+
# login
|
116
|
+
ng_repeater_row('view in views', 0).click
|
117
|
+
ng_model('user.username').set('admin')
|
118
|
+
ng_model('user.password').set('password')
|
119
|
+
click_button 'Login'
|
120
|
+
|
121
|
+
# check initial state
|
122
|
+
ng_repeater_row('view in views', 2).click
|
123
|
+
expect(ng_repeater_rows('task in $data').length).to eq init_task_count
|
124
|
+
|
125
|
+
# create new task
|
126
|
+
click_link 'New Task'
|
127
|
+
ng_model('task.name').set('Some')
|
128
|
+
ng_model('task.message').set('Thing')
|
129
|
+
ng_model('task.done').set('true')
|
130
|
+
click_button 'Save'
|
131
|
+
|
132
|
+
# check task is created
|
133
|
+
rows = ng_repeater_columns('task in $data', 'task.name')
|
134
|
+
expect(rows.length).to eq init_task_count + 1
|
135
|
+
|
136
|
+
# delete created task
|
137
|
+
cell = rows.select { |row| row.visible_text == 'Some' }.first
|
138
|
+
cell.click
|
139
|
+
accept_alert do
|
140
|
+
click_button 'Delete'
|
141
|
+
end
|
142
|
+
expect(ng_repeater_rows('task in $data').length).to eq init_task_count
|
143
|
+
end
|
144
|
+
end
|
145
|
+
```
|
146
|
+
|
147
|
+
#### Running Example Test
|
148
|
+
````bash
|
149
|
+
# download and install chrome-driver
|
150
|
+
# http://chromedriver.storage.googleapis.com/index.html
|
151
|
+
|
152
|
+
git clone git@github.com:kikonen/sampler.git
|
153
|
+
cd sampler
|
154
|
+
cd dummy
|
155
|
+
bundle
|
156
|
+
rails s -p 4000&
|
157
|
+
bundle exec rspec spec/request/test_spec.rb
|
158
|
+
bundle exec rspec spec/request/task_spec.rb
|
159
|
+
fg
|
160
|
+
CTRL^C
|
161
|
+
```
|
162
|
+
|
163
|
+
|
79
164
|
## Contributing
|
80
165
|
|
81
166
|
1. Fork it ( https://github.com/[my-github-username]/capybara/fork )
|
data/lib/angular.rb
CHANGED
data/lib/angular/dsl.rb
CHANGED
@@ -15,129 +15,267 @@ module DSL
|
|
15
15
|
#
|
16
16
|
# @return current location absolute url
|
17
17
|
#
|
18
|
-
def ng_location_abs(
|
19
|
-
|
18
|
+
def ng_location_abs(opt = {})
|
19
|
+
selector = opt.delete(:rootSelector) || 'body'
|
20
|
+
ng.make_call :getLocationAbsUrl, [selector], opt
|
20
21
|
end
|
21
22
|
|
22
23
|
# @return current location absolute url
|
23
24
|
#
|
24
|
-
def ng_location(
|
25
|
-
|
25
|
+
def ng_location(opt = {})
|
26
|
+
selector = opt.delete(:rootSelector) || 'body'
|
27
|
+
ng.make_call :getLocation, [selector], opt
|
26
28
|
end
|
27
29
|
|
28
30
|
#
|
29
31
|
# @return current location
|
30
32
|
#
|
31
|
-
def ng_set_location(url,
|
32
|
-
|
33
|
+
def ng_set_location(url, opt = {})
|
34
|
+
selector = opt.delete(:rootSelector) || 'body'
|
35
|
+
ng.make_call :setLocation, [selector, url], opt
|
33
36
|
end
|
34
37
|
|
35
38
|
#
|
39
|
+
# @param opt
|
40
|
+
# - :rootSelector
|
41
|
+
# - :wait
|
36
42
|
# @return eval result
|
37
43
|
#
|
38
|
-
def ng_eval(
|
39
|
-
|
44
|
+
def ng_eval(expr, opt = {})
|
45
|
+
selector = opt.delete(:rootSelector) || 'body'
|
46
|
+
ng.make_call :evaluate, [selector, expr], opt
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Does binding exist
|
51
|
+
#
|
52
|
+
# @param opt
|
53
|
+
# - :exact
|
54
|
+
# - :using
|
55
|
+
# - :rootSelector
|
56
|
+
# - :wait
|
57
|
+
# @return true | false
|
58
|
+
#
|
59
|
+
def has_ng_binding?(binding, opt = {})
|
60
|
+
ng_bindings(model, opt)
|
61
|
+
true
|
62
|
+
rescue NotFound
|
63
|
+
false
|
40
64
|
end
|
41
65
|
|
42
66
|
#
|
43
67
|
# Node for nth binding match
|
68
|
+
#
|
69
|
+
# @param opt
|
70
|
+
# - :row
|
71
|
+
# - :exact
|
72
|
+
# - :using
|
73
|
+
# - :rootSelector
|
74
|
+
# - :wait
|
44
75
|
# @return nth node
|
45
76
|
#
|
46
|
-
def ng_binding(binding,
|
47
|
-
|
77
|
+
def ng_binding(binding, opt = {})
|
78
|
+
row = ng.row(opt)
|
79
|
+
ng_bindings(binding, opt)[row]
|
48
80
|
end
|
49
81
|
|
50
82
|
#
|
51
83
|
# All nodes matching binding
|
52
84
|
#
|
85
|
+
# @param opt
|
86
|
+
# - :exact
|
87
|
+
# - :using
|
88
|
+
# - :rootSelector
|
89
|
+
# - :wait
|
53
90
|
# @return [node, ...]
|
54
91
|
#
|
55
|
-
def ng_bindings(binding,
|
56
|
-
ng.
|
92
|
+
def ng_bindings(binding, opt = {})
|
93
|
+
ng.get_nodes :findBindings, [binding, opt[:exact]], opt
|
94
|
+
end
|
95
|
+
|
96
|
+
#
|
97
|
+
# Does model exist
|
98
|
+
#
|
99
|
+
# @param opt
|
100
|
+
# - :using
|
101
|
+
# - :rootSelector
|
102
|
+
# - :wait
|
103
|
+
# @return true | false
|
104
|
+
#
|
105
|
+
def has_ng_model?(model, opt = {})
|
106
|
+
ng_models(model, opt)
|
107
|
+
true
|
108
|
+
rescue NotFound
|
109
|
+
false
|
57
110
|
end
|
58
111
|
|
59
112
|
#
|
60
113
|
# Node for nth model match
|
61
114
|
#
|
115
|
+
# @param opt
|
116
|
+
# - :row
|
117
|
+
# - :using
|
118
|
+
# - :rootSelector
|
119
|
+
# - :wait
|
62
120
|
# @return nth node
|
63
121
|
#
|
64
|
-
def ng_model(model,
|
65
|
-
|
122
|
+
def ng_model(model, opt = {})
|
123
|
+
row = ng.row(opt)
|
124
|
+
ng_models(model, opt)[row]
|
66
125
|
end
|
67
126
|
|
68
127
|
#
|
69
128
|
# All nodes matching model
|
70
129
|
#
|
130
|
+
# @param opt
|
131
|
+
# - :using
|
132
|
+
# - :rootSelector
|
133
|
+
# - :wait
|
71
134
|
# @return [node, ...]
|
72
135
|
#
|
73
|
-
def ng_models(model,
|
74
|
-
ng.
|
136
|
+
def ng_models(model, opt = {})
|
137
|
+
ng.get_nodes :findByModel, [model], opt
|
138
|
+
end
|
139
|
+
|
140
|
+
#
|
141
|
+
# Does option exist
|
142
|
+
#
|
143
|
+
# @param opt
|
144
|
+
# - :using
|
145
|
+
# - :rootSelector
|
146
|
+
# - :wait
|
147
|
+
# @return true | false
|
148
|
+
#
|
149
|
+
def has_ng_option?(options, opt = {})
|
150
|
+
ng_options(options, opt)
|
151
|
+
true
|
152
|
+
rescue NotFound
|
153
|
+
false
|
75
154
|
end
|
76
155
|
|
77
156
|
#
|
78
157
|
# Node for nth option
|
79
158
|
#
|
159
|
+
# @param opt
|
160
|
+
# - :row
|
161
|
+
# - :using
|
162
|
+
# - :rootSelector
|
163
|
+
# - :wait
|
80
164
|
# @return nth node
|
81
165
|
#
|
82
|
-
def ng_option(options,
|
83
|
-
|
166
|
+
def ng_option(options, opt = {})
|
167
|
+
row = ng.row(opt)
|
168
|
+
ng_options(options, opt)[row]
|
84
169
|
end
|
85
170
|
|
86
171
|
#
|
87
172
|
# All option values matching option
|
173
|
+
#
|
174
|
+
# @param opt
|
175
|
+
# - :using
|
176
|
+
# - :rootSelector
|
177
|
+
# - :wait
|
88
178
|
# @return [node, ...]
|
89
179
|
#
|
90
|
-
def ng_options(options,
|
91
|
-
ng.
|
180
|
+
def ng_options(options, opt = {})
|
181
|
+
ng.get_nodes :findByOptions, [options], opt
|
182
|
+
end
|
183
|
+
|
184
|
+
#
|
185
|
+
# Does row exist
|
186
|
+
#
|
187
|
+
# @param opt
|
188
|
+
# - :using
|
189
|
+
# - :rootSelector
|
190
|
+
# - :wait
|
191
|
+
# @return true | false
|
192
|
+
#
|
193
|
+
def has_ng_repeater_row?(repeater, opt = {})
|
194
|
+
ng.get_nodes(:findRepeaterRows, [repeater, 0], opt)
|
195
|
+
true
|
196
|
+
rescue NotFound
|
197
|
+
false
|
92
198
|
end
|
93
199
|
|
94
200
|
#
|
95
201
|
# Node for nth repeater row
|
202
|
+
#
|
203
|
+
# @param opt
|
204
|
+
# - :row
|
205
|
+
# - :using
|
206
|
+
# - :rootSelector
|
207
|
+
# - :wait
|
96
208
|
# @return nth node
|
97
209
|
#
|
98
|
-
def ng_repeater_row(repeater,
|
99
|
-
ng.
|
210
|
+
def ng_repeater_row(repeater, opt = {})
|
211
|
+
row = ng.row(opt)
|
212
|
+
data = ng.get_nodes(:findRepeaterRows, [repeater, row], opt)
|
213
|
+
data.first
|
100
214
|
end
|
101
215
|
|
102
216
|
#
|
103
217
|
# All nodes matching repeater
|
104
218
|
#
|
219
|
+
# @param opt
|
220
|
+
# - :using
|
221
|
+
# - :rootSelector
|
222
|
+
# - :wait
|
105
223
|
# @return [node, ...]
|
106
224
|
#
|
107
|
-
def ng_repeater_rows(repeater,
|
108
|
-
ng.
|
225
|
+
def ng_repeater_rows(repeater, opt = {})
|
226
|
+
ng.get_nodes :findAllRepeaterRows, [repeater], opt
|
109
227
|
end
|
110
228
|
|
111
229
|
#
|
112
230
|
# Node for column binding value in row
|
113
231
|
#
|
232
|
+
# @param opt
|
233
|
+
# - :row
|
234
|
+
# - :using
|
235
|
+
# - :rootSelector
|
236
|
+
# - :wait
|
114
237
|
# @return nth node
|
115
238
|
#
|
116
|
-
def ng_repeater_column(repeater, binding,
|
117
|
-
|
239
|
+
def ng_repeater_column(repeater, binding, opt = {})
|
240
|
+
row = ng.row(opt)
|
241
|
+
ng_repeater_columns(repeater, binding, opt)[row]
|
118
242
|
end
|
119
243
|
|
120
244
|
#
|
121
245
|
# Node for column binding value in all rows
|
122
246
|
#
|
247
|
+
# @param opt
|
248
|
+
# - :using
|
249
|
+
# - :rootSelector
|
250
|
+
# - :wait
|
123
251
|
# @return [node, ...]
|
124
252
|
#
|
125
|
-
def ng_repeater_columns(repeater, binding,
|
126
|
-
ng.
|
253
|
+
def ng_repeater_columns(repeater, binding, opt = {})
|
254
|
+
ng.get_nodes :findRepeaterColumn, [repeater, binding], opt
|
127
255
|
end
|
128
256
|
|
129
257
|
#
|
258
|
+
# @param opt
|
259
|
+
# - :row
|
260
|
+
# - :using
|
261
|
+
# - :rootSelector
|
262
|
+
# - :wait
|
130
263
|
# @return nth node
|
131
264
|
#
|
132
|
-
def ng_repeater_element(repeater, index, binding,
|
133
|
-
|
265
|
+
def ng_repeater_element(repeater, index, binding, opt = {})
|
266
|
+
row = ng.row(opt)
|
267
|
+
ng_repeater_elements(repeater, index, binding, opt)[row]
|
134
268
|
end
|
135
269
|
|
136
270
|
#
|
271
|
+
# @param opt
|
272
|
+
# - :using
|
273
|
+
# - :rootSelector
|
274
|
+
# - :wait
|
137
275
|
# @return [node, ...]
|
138
276
|
#
|
139
|
-
def ng_repeater_elements(repeater, index, binding,
|
140
|
-
ng.
|
277
|
+
def ng_repeater_elements(repeater, index, binding, opt = {})
|
278
|
+
ng.get_nodes :findRepeaterElement, [repeater, index, binding], opt
|
141
279
|
end
|
142
280
|
end
|
143
281
|
end
|
data/lib/angular/setup.rb
CHANGED
@@ -11,9 +11,40 @@ module Angular
|
|
11
11
|
Waiter.new(self).wait_until_ready
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
14
|
+
def row(opt)
|
15
|
+
opt.has_key?(:row) ? opt[:row] : 0
|
16
|
+
end
|
17
|
+
|
18
|
+
#
|
19
|
+
# @param opt
|
20
|
+
# - :using
|
21
|
+
# - :rootSelector
|
22
|
+
# - :wait
|
23
|
+
#
|
24
|
+
def get_nodes(method, params, opt = {})
|
25
|
+
opt = {
|
26
|
+
nodes: true,
|
27
|
+
using: nil,
|
28
|
+
rootSelector: 'body',
|
29
|
+
}.merge(opt)
|
30
|
+
make_call(method, params, opt)
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# @param opt
|
35
|
+
# - :nodes
|
36
|
+
# - :wait
|
37
|
+
#
|
38
|
+
def make_call(method, params, opt = {})
|
39
|
+
opt = {
|
40
|
+
nodes: false,
|
41
|
+
wait: true,
|
42
|
+
}.merge(opt)
|
43
|
+
|
44
|
+
ng_wait if opt[:wait]
|
16
45
|
|
46
|
+
params << opt[:using] if opt.has_key?(:using)
|
47
|
+
params << opt[:rootSelector] if opt.has_key?(:rootSelector)
|
17
48
|
js_params = params.map do |p|
|
18
49
|
if p.nil?
|
19
50
|
'null'
|
@@ -26,12 +57,12 @@ module Angular
|
|
26
57
|
end
|
27
58
|
|
28
59
|
js = "#{method}(#{js_params.join(', ')});"
|
29
|
-
logger.
|
60
|
+
logger.debug js
|
30
61
|
|
31
62
|
js_result = page.evaluate_script(js);
|
32
|
-
logger.
|
63
|
+
# logger.debug js_result
|
33
64
|
|
34
|
-
if nodes
|
65
|
+
if opt[:nodes]
|
35
66
|
make_result method, params, js_result
|
36
67
|
else
|
37
68
|
js_result
|
data/lib/angular/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-ng
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kari
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-10-
|
11
|
+
date: 2014-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -68,6 +68,7 @@ files:
|
|
68
68
|
- Rakefile
|
69
69
|
- capybara-ng.gemspec
|
70
70
|
- lib/angular.rb
|
71
|
+
- lib/angular/capybara_setup.rb
|
71
72
|
- lib/angular/client_script.rb
|
72
73
|
- lib/angular/driver.rb
|
73
74
|
- lib/angular/dsl.rb
|