capybara-ng 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|