capybara 3.30.0 → 3.35.3
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/History.md +153 -13
- data/README.md +9 -4
- data/lib/capybara.rb +18 -8
- data/lib/capybara/config.rb +4 -6
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +4 -0
- data/lib/capybara/dsl.rb +10 -2
- data/lib/capybara/helpers.rb +25 -1
- data/lib/capybara/minitest.rb +232 -144
- data/lib/capybara/minitest/spec.rb +156 -97
- data/lib/capybara/node/actions.rb +16 -21
- data/lib/capybara/node/base.rb +6 -6
- data/lib/capybara/node/element.rb +14 -13
- data/lib/capybara/node/finders.rb +12 -7
- data/lib/capybara/node/matchers.rb +36 -27
- data/lib/capybara/node/simple.rb +6 -2
- data/lib/capybara/queries/ancestor_query.rb +1 -1
- data/lib/capybara/queries/base_query.rb +2 -1
- data/lib/capybara/queries/current_path_query.rb +14 -4
- data/lib/capybara/queries/selector_query.rb +40 -18
- data/lib/capybara/queries/sibling_query.rb +1 -1
- data/lib/capybara/queries/style_query.rb +1 -1
- data/lib/capybara/queries/text_query.rb +7 -1
- data/lib/capybara/rack_test/browser.rb +9 -3
- data/lib/capybara/rack_test/driver.rb +1 -0
- data/lib/capybara/rack_test/form.rb +1 -1
- data/lib/capybara/rack_test/node.rb +35 -10
- data/lib/capybara/registration_container.rb +44 -0
- data/lib/capybara/registrations/drivers.rb +18 -12
- data/lib/capybara/registrations/patches/puma_ssl.rb +3 -1
- data/lib/capybara/registrations/servers.rb +3 -2
- data/lib/capybara/result.rb +35 -15
- data/lib/capybara/rspec.rb +2 -0
- data/lib/capybara/rspec/matcher_proxies.rb +5 -5
- data/lib/capybara/rspec/matchers.rb +33 -32
- data/lib/capybara/rspec/matchers/base.rb +12 -6
- data/lib/capybara/rspec/matchers/count_sugar.rb +2 -1
- data/lib/capybara/rspec/matchers/have_ancestor.rb +4 -3
- data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
- data/lib/capybara/rspec/matchers/have_selector.rb +15 -7
- data/lib/capybara/rspec/matchers/have_sibling.rb +3 -3
- data/lib/capybara/rspec/matchers/have_text.rb +3 -3
- data/lib/capybara/rspec/matchers/have_title.rb +2 -2
- data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
- data/lib/capybara/rspec/matchers/match_style.rb +7 -2
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +2 -1
- data/lib/capybara/selector.rb +14 -3
- data/lib/capybara/selector/builders/css_builder.rb +1 -1
- data/lib/capybara/selector/builders/xpath_builder.rb +3 -1
- data/lib/capybara/selector/definition.rb +11 -9
- data/lib/capybara/selector/definition/button.rb +26 -14
- data/lib/capybara/selector/definition/css.rb +1 -1
- data/lib/capybara/selector/definition/datalist_input.rb +1 -1
- data/lib/capybara/selector/definition/element.rb +2 -1
- data/lib/capybara/selector/definition/fillable_field.rb +1 -1
- data/lib/capybara/selector/definition/label.rb +2 -2
- data/lib/capybara/selector/definition/link.rb +8 -0
- data/lib/capybara/selector/definition/select.rb +32 -13
- data/lib/capybara/selector/definition/table.rb +1 -1
- data/lib/capybara/selector/definition/table_row.rb +2 -2
- data/lib/capybara/selector/filter_set.rb +2 -2
- data/lib/capybara/selector/selector.rb +9 -1
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -1
- data/lib/capybara/selenium/atoms/src/getAttribute.js +1 -1
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +1 -1
- data/lib/capybara/selenium/driver.rb +52 -7
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +10 -12
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +9 -11
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +3 -3
- data/lib/capybara/selenium/extensions/find.rb +4 -4
- data/lib/capybara/selenium/extensions/html5_drag.rb +24 -8
- data/lib/capybara/selenium/extensions/scroll.rb +8 -10
- data/lib/capybara/selenium/logger_suppressor.rb +8 -2
- data/lib/capybara/selenium/node.rb +96 -16
- data/lib/capybara/selenium/nodes/chrome_node.rb +27 -16
- data/lib/capybara/selenium/nodes/edge_node.rb +1 -1
- data/lib/capybara/selenium/nodes/firefox_node.rb +9 -4
- data/lib/capybara/selenium/nodes/safari_node.rb +1 -1
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +4 -4
- data/lib/capybara/selenium/patches/logs.rb +7 -9
- data/lib/capybara/server/animation_disabler.rb +8 -3
- data/lib/capybara/server/middleware.rb +4 -2
- data/lib/capybara/session.rb +53 -29
- data/lib/capybara/session/config.rb +3 -1
- data/lib/capybara/session/matchers.rb +11 -11
- data/lib/capybara/spec/public/test.js +64 -7
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
- data/lib/capybara/spec/session/all_spec.rb +45 -5
- data/lib/capybara/spec/session/assert_text_spec.rb +5 -5
- data/lib/capybara/spec/session/check_spec.rb +6 -0
- data/lib/capybara/spec/session/click_button_spec.rb +11 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +9 -0
- data/lib/capybara/spec/session/current_url_spec.rb +11 -1
- data/lib/capybara/spec/session/fill_in_spec.rb +29 -0
- data/lib/capybara/spec/session/find_spec.rb +11 -8
- data/lib/capybara/spec/session/has_button_spec.rb +51 -0
- data/lib/capybara/spec/session/has_css_spec.rb +14 -10
- data/lib/capybara/spec/session/has_current_path_spec.rb +15 -2
- data/lib/capybara/spec/session/has_field_spec.rb +16 -0
- data/lib/capybara/spec/session/has_select_spec.rb +32 -4
- data/lib/capybara/spec/session/has_selector_spec.rb +4 -4
- data/lib/capybara/spec/session/has_text_spec.rb +5 -12
- data/lib/capybara/spec/session/html_spec.rb +1 -1
- data/lib/capybara/spec/session/matches_style_spec.rb +2 -2
- data/lib/capybara/spec/session/node_spec.rb +169 -33
- data/lib/capybara/spec/session/refresh_spec.rb +2 -1
- data/lib/capybara/spec/session/save_page_spec.rb +4 -4
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -1
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -1
- data/lib/capybara/spec/session/window/window_spec.rb +8 -8
- data/lib/capybara/spec/session/window/windows_spec.rb +1 -1
- data/lib/capybara/spec/spec_helper.rb +13 -14
- data/lib/capybara/spec/test_app.rb +23 -21
- data/lib/capybara/spec/views/form.erb +36 -3
- data/lib/capybara/spec/views/with_animation.erb +8 -0
- data/lib/capybara/spec/views/with_dragula.erb +3 -1
- data/lib/capybara/spec/views/with_html.erb +2 -2
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +3 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +3 -7
- data/spec/basic_node_spec.rb +9 -8
- data/spec/capybara_spec.rb +1 -1
- data/spec/dsl_spec.rb +14 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
- data/spec/minitest_spec.rb +3 -2
- data/spec/rack_test_spec.rb +28 -6
- data/spec/regexp_dissassembler_spec.rb +0 -4
- data/spec/result_spec.rb +40 -29
- data/spec/rspec/features_spec.rb +3 -1
- data/spec/rspec/scenarios_spec.rb +4 -0
- data/spec/rspec/shared_spec_matchers.rb +63 -51
- data/spec/rspec_spec.rb +4 -0
- data/spec/selector_spec.rb +17 -2
- data/spec/selenium_spec_chrome.rb +45 -21
- data/spec/selenium_spec_chrome_remote.rb +7 -1
- data/spec/selenium_spec_firefox.rb +15 -13
- data/spec/server_spec.rb +60 -49
- data/spec/shared_selenium_node.rb +18 -0
- data/spec/shared_selenium_session.rb +98 -7
- data/spec/spec_helper.rb +1 -1
- metadata +50 -14
- data/lib/capybara/spec/session/source_spec.rb +0 -0
|
@@ -53,7 +53,7 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
|
|
53
53
|
@session.click_link('Alert page change')
|
|
54
54
|
sleep 1 # ensure page change occurs before the accept_alert block exits
|
|
55
55
|
end
|
|
56
|
-
expect(@session).to have_current_path('/with_html')
|
|
56
|
+
expect(@session).to have_current_path('/with_html', wait: 5)
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
context 'with an asynchronous alert' do
|
|
@@ -47,6 +47,39 @@ Capybara::SpecHelper.spec '#all' do
|
|
|
47
47
|
expect { @session.all('//p', schmoo: 'foo') }.to raise_error(ArgumentError)
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
it 'should not reload by default', requires: [:driver] do
|
|
51
|
+
paras = @session.all(:css, 'p', minimum: 3)
|
|
52
|
+
expect { paras[0].text }.not_to raise_error
|
|
53
|
+
@session.refresh
|
|
54
|
+
expect { paras[0].text }.to raise_error do |err|
|
|
55
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'with allow_reload' do
|
|
60
|
+
it 'should reload if true' do
|
|
61
|
+
paras = @session.all(:css, 'p', allow_reload: true, minimum: 3)
|
|
62
|
+
expect { paras[0].text }.not_to raise_error
|
|
63
|
+
@session.refresh
|
|
64
|
+
sleep 1 # Ensure page has started to reload
|
|
65
|
+
expect(paras[0]).to have_text('Lorem ipsum dolor')
|
|
66
|
+
expect(paras[1]).to have_text('Duis aute irure dolor')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should not reload if false', requires: [:driver] do
|
|
70
|
+
paras = @session.all(:css, 'p', allow_reload: false, minimum: 3)
|
|
71
|
+
expect { paras[0].text }.not_to raise_error
|
|
72
|
+
@session.refresh
|
|
73
|
+
sleep 1 # Ensure page has started to reload
|
|
74
|
+
expect { paras[0].text }.to raise_error do |err|
|
|
75
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
76
|
+
end
|
|
77
|
+
expect { paras[2].text }.to raise_error do |err|
|
|
78
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
50
83
|
context 'with css selectors' do
|
|
51
84
|
it 'should find all elements using the given selector' do
|
|
52
85
|
expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
|
|
@@ -176,6 +209,13 @@ Capybara::SpecHelper.spec '#all' do
|
|
|
176
209
|
expect { @session.all(:css, 'h1, p', between: 5..) }.to raise_error(Capybara::ExpectationNotMet)
|
|
177
210
|
end
|
|
178
211
|
TEST
|
|
212
|
+
|
|
213
|
+
eval <<~TEST, binding, __FILE__, __LINE__ + 1 if RUBY_VERSION.to_f > 2.6
|
|
214
|
+
it'treats a beginless range as maximum' do
|
|
215
|
+
expect { @session.all(:css, 'h1, p', between: ..7) }.not_to raise_error
|
|
216
|
+
expect { @session.all(:css, 'h1, p', between: ..3) }.to raise_error(Capybara::ExpectationNotMet)
|
|
217
|
+
end
|
|
218
|
+
TEST
|
|
179
219
|
end
|
|
180
220
|
|
|
181
221
|
context 'with multiple count filters' do
|
|
@@ -184,7 +224,7 @@ Capybara::SpecHelper.spec '#all' do
|
|
|
184
224
|
minimum: 5,
|
|
185
225
|
maximum: 0,
|
|
186
226
|
between: 0..3 }
|
|
187
|
-
expect { @session.all(:css, 'h1, p', o) }.not_to raise_error
|
|
227
|
+
expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
|
|
188
228
|
end
|
|
189
229
|
|
|
190
230
|
context 'with no :count expectation' do
|
|
@@ -192,28 +232,28 @@ Capybara::SpecHelper.spec '#all' do
|
|
|
192
232
|
o = { minimum: 5,
|
|
193
233
|
maximum: 4,
|
|
194
234
|
between: 2..7 }
|
|
195
|
-
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
235
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
196
236
|
end
|
|
197
237
|
|
|
198
238
|
it 'fails if :maximum is not met' do
|
|
199
239
|
o = { minimum: 0,
|
|
200
240
|
maximum: 0,
|
|
201
241
|
between: 2..7 }
|
|
202
|
-
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
242
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
203
243
|
end
|
|
204
244
|
|
|
205
245
|
it 'fails if :between is not met' do
|
|
206
246
|
o = { minimum: 0,
|
|
207
247
|
maximum: 4,
|
|
208
248
|
between: 0..3 }
|
|
209
|
-
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
249
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
210
250
|
end
|
|
211
251
|
|
|
212
252
|
it 'succeeds if all combineable expectations are met' do
|
|
213
253
|
o = { minimum: 0,
|
|
214
254
|
maximum: 4,
|
|
215
255
|
between: 2..7 }
|
|
216
|
-
expect { @session.all(:css, 'h1, p', o) }.not_to raise_error
|
|
256
|
+
expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
|
|
217
257
|
end
|
|
218
258
|
end
|
|
219
259
|
end
|
|
@@ -157,7 +157,7 @@ Capybara::SpecHelper.spec '#assert_text' do
|
|
|
157
157
|
minimum: 6,
|
|
158
158
|
maximum: 0,
|
|
159
159
|
between: 0..4 }
|
|
160
|
-
expect { @session.assert_text('Header', o) }.not_to raise_error
|
|
160
|
+
expect { @session.assert_text('Header', **o) }.not_to raise_error
|
|
161
161
|
end
|
|
162
162
|
|
|
163
163
|
context 'with no :count expectation' do
|
|
@@ -165,28 +165,28 @@ Capybara::SpecHelper.spec '#assert_text' do
|
|
|
165
165
|
o = { minimum: 6,
|
|
166
166
|
maximum: 5,
|
|
167
167
|
between: 2..7 }
|
|
168
|
-
expect { @session.assert_text('Header', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
168
|
+
expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
169
169
|
end
|
|
170
170
|
|
|
171
171
|
it 'fails if :maximum is not met' do
|
|
172
172
|
o = { minimum: 0,
|
|
173
173
|
maximum: 0,
|
|
174
174
|
between: 2..7 }
|
|
175
|
-
expect { @session.assert_text('Header', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
175
|
+
expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
176
176
|
end
|
|
177
177
|
|
|
178
178
|
it 'fails if :between is not met' do
|
|
179
179
|
o = { minimum: 0,
|
|
180
180
|
maximum: 5,
|
|
181
181
|
between: 0..4 }
|
|
182
|
-
expect { @session.assert_text('Header', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
182
|
+
expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
183
183
|
end
|
|
184
184
|
|
|
185
185
|
it 'succeeds if all combineable expectations are met' do
|
|
186
186
|
o = { minimum: 0,
|
|
187
187
|
maximum: 5,
|
|
188
188
|
between: 2..7 }
|
|
189
|
-
expect { @session.assert_text('Header', o) }.not_to raise_error
|
|
189
|
+
expect { @session.assert_text('Header', **o) }.not_to raise_error
|
|
190
190
|
end
|
|
191
191
|
end
|
|
192
192
|
end
|
|
@@ -229,6 +229,12 @@ Capybara::SpecHelper.spec '#check' do
|
|
|
229
229
|
@session.click_button('awesome')
|
|
230
230
|
expect(extract_results(@session)['cars']).to include('bugatti')
|
|
231
231
|
end
|
|
232
|
+
|
|
233
|
+
it 'should check via label if multiple labels' do
|
|
234
|
+
expect(@session).to have_field('multi_label_checkbox', checked: false, visible: :hidden)
|
|
235
|
+
@session.check('Label to click', allow_label_click: true)
|
|
236
|
+
expect(@session).to have_field('multi_label_checkbox', checked: true, visible: :hidden)
|
|
237
|
+
end
|
|
232
238
|
end
|
|
233
239
|
end
|
|
234
240
|
end
|
|
@@ -193,6 +193,17 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
|
193
193
|
end
|
|
194
194
|
end
|
|
195
195
|
|
|
196
|
+
context 'when Capybara.enable_aria_role = true' do
|
|
197
|
+
it 'should click on a button role', requires: [:js] do
|
|
198
|
+
Capybara.enable_aria_role = true
|
|
199
|
+
@session.using_wait_time(1.5) do
|
|
200
|
+
@session.visit('/with_js')
|
|
201
|
+
@session.click_button('ARIA button')
|
|
202
|
+
expect(@session).to have_button('ARIA button has been clicked')
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
196
207
|
context 'with fields associated with the form using the form attribute', requires: [:form_attribute] do
|
|
197
208
|
let(:results) { extract_results(@session) }
|
|
198
209
|
|
|
@@ -38,6 +38,15 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
|
|
|
38
38
|
expect(extract_results(@session)['first_name']).to eq('John')
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
context 'with test_id' do
|
|
42
|
+
it 'should click on a button' do
|
|
43
|
+
Capybara.test_id = 'data-test-id'
|
|
44
|
+
@session.visit('/form')
|
|
45
|
+
@session.click_link_or_button('test_id_button')
|
|
46
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
41
50
|
context 'with :exact option' do
|
|
42
51
|
context 'when `false`' do
|
|
43
52
|
it 'clicks on approximately matching link' do
|
|
@@ -22,7 +22,7 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
|
|
|
22
22
|
|
|
23
23
|
expect(@session.current_url.chomp('?')).to eq("#{scheme}://#{s.host}:#{s.port}#{path}")
|
|
24
24
|
expect(@session.current_host).to eq("#{scheme}://#{s.host}") # no port
|
|
25
|
-
expect(@session.current_path).to eq(path)
|
|
25
|
+
expect(@session.current_path).to eq(path.split('#')[0])
|
|
26
26
|
# Server should agree with us
|
|
27
27
|
expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}") if path == '/host'
|
|
28
28
|
end
|
|
@@ -84,6 +84,16 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
|
|
|
84
84
|
should_be_on 0, '/landed'
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
it 'maintains fragment' do
|
|
88
|
+
@session.visit("#{bases[0]}/redirect#fragment")
|
|
89
|
+
should_be_on 0, '/landed#fragment'
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
it 'redirects to a fragment' do
|
|
93
|
+
@session.visit("#{bases[0]}/redirect_with_fragment")
|
|
94
|
+
should_be_on 0, '/landed#with_fragment'
|
|
95
|
+
end
|
|
96
|
+
|
|
87
97
|
it 'is affected by pushState', requires: [:js] do
|
|
88
98
|
@session.visit('/with_js')
|
|
89
99
|
@session.execute_script("window.history.pushState({}, '', '/pushed')")
|
|
@@ -47,6 +47,15 @@ Capybara::SpecHelper.spec '#fill_in' do
|
|
|
47
47
|
expect(extract_results(@session)['description']).to eq('Texty text')
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
it 'should fill in a textarea in a reasonable time by default' do
|
|
51
|
+
textarea = @session.find(:fillable_field, 'form[description]')
|
|
52
|
+
value = 'a' * 4000
|
|
53
|
+
start = Time.now
|
|
54
|
+
textarea.fill_in(with: value)
|
|
55
|
+
expect(Time.now.to_f).to be_within(0.25).of start.to_f
|
|
56
|
+
expect(textarea.value).to eq value
|
|
57
|
+
end
|
|
58
|
+
|
|
50
59
|
it 'should fill in a password field by id' do
|
|
51
60
|
@session.fill_in('form_password', with: 'supasikrit')
|
|
52
61
|
@session.click_button('awesome')
|
|
@@ -95,6 +104,26 @@ Capybara::SpecHelper.spec '#fill_in' do
|
|
|
95
104
|
expect(extract_results(@session)['html5_color']).to eq('#112233')
|
|
96
105
|
end
|
|
97
106
|
|
|
107
|
+
describe 'with input[type="range"]' do
|
|
108
|
+
it 'should set the range slider correctly' do
|
|
109
|
+
@session.fill_in('form_age', with: 51)
|
|
110
|
+
@session.click_button('awesome')
|
|
111
|
+
expect(extract_results(@session)['age'].to_f).to eq 51
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'should set the range slider to valid values' do
|
|
115
|
+
@session.fill_in('form_age', with: '37.6')
|
|
116
|
+
@session.click_button('awesome')
|
|
117
|
+
expect(extract_results(@session)['age'].to_f).to eq 37.5
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'should respect the range slider limits' do
|
|
121
|
+
@session.fill_in('form_age', with: '3')
|
|
122
|
+
@session.click_button('awesome')
|
|
123
|
+
expect(extract_results(@session)['age'].to_f).to eq 13
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
98
127
|
it 'should fill in a field with a custom type' do
|
|
99
128
|
@session.fill_in('Schmooo', with: 'Schmooo is the game')
|
|
100
129
|
@session.click_button('awesome')
|
|
@@ -451,32 +451,35 @@ Capybara::SpecHelper.spec '#find' do
|
|
|
451
451
|
context 'with spatial filters', requires: [:spatial] do
|
|
452
452
|
before do
|
|
453
453
|
@session.visit('/spatial')
|
|
454
|
-
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
let :center do
|
|
457
|
+
@session.find(:css, 'div.center')
|
|
455
458
|
end
|
|
456
459
|
|
|
457
460
|
it 'should find an element above another element' do
|
|
458
|
-
expect(@session.find(:css, 'div:not(.corner)', above:
|
|
461
|
+
expect(@session.find(:css, 'div:not(.corner)', above: center).text).to eq('2')
|
|
459
462
|
end
|
|
460
463
|
|
|
461
464
|
it 'should find an element below another element' do
|
|
462
|
-
expect(@session.find(:css, 'div:not(.corner):not(.footer)', below:
|
|
465
|
+
expect(@session.find(:css, 'div:not(.corner):not(.footer)', below: center).text).to eq('8')
|
|
463
466
|
end
|
|
464
467
|
|
|
465
468
|
it 'should find an element left of another element' do
|
|
466
|
-
expect(@session.find(:css, 'div:not(.corner)', left_of:
|
|
469
|
+
expect(@session.find(:css, 'div:not(.corner)', left_of: center).text).to eq('4')
|
|
467
470
|
end
|
|
468
471
|
|
|
469
472
|
it 'should find an element right of another element' do
|
|
470
|
-
expect(@session.find(:css, 'div:not(.corner)', right_of:
|
|
473
|
+
expect(@session.find(:css, 'div:not(.corner)', right_of: center).text).to eq('6')
|
|
471
474
|
end
|
|
472
475
|
|
|
473
476
|
it 'should combine spatial filters' do
|
|
474
|
-
expect(@session.find(:css, 'div', left_of:
|
|
475
|
-
expect(@session.find(:css, 'div', right_of:
|
|
477
|
+
expect(@session.find(:css, 'div', left_of: center, above: center).text).to eq('1')
|
|
478
|
+
expect(@session.find(:css, 'div', right_of: center, below: center).text).to eq('9')
|
|
476
479
|
end
|
|
477
480
|
|
|
478
481
|
it 'should find an element "near" another element' do
|
|
479
|
-
expect(@session.find(:css, 'div.distance', near:
|
|
482
|
+
expect(@session.find(:css, 'div.distance', near: center).text).to eq('2')
|
|
480
483
|
end
|
|
481
484
|
end
|
|
482
485
|
|
|
@@ -9,6 +9,8 @@ Capybara::SpecHelper.spec '#has_button?' do
|
|
|
9
9
|
expect(@session).to have_button('med')
|
|
10
10
|
expect(@session).to have_button('crap321')
|
|
11
11
|
expect(@session).to have_button(:crap321)
|
|
12
|
+
expect(@session).to have_button('button with label element')
|
|
13
|
+
expect(@session).to have_button('button within label element')
|
|
12
14
|
end
|
|
13
15
|
|
|
14
16
|
it 'should be true for disabled buttons if disabled: true' do
|
|
@@ -39,6 +41,30 @@ Capybara::SpecHelper.spec '#has_button?' do
|
|
|
39
41
|
expect(@session).to have_button('awe123', type: 'submit')
|
|
40
42
|
expect(@session).not_to have_button('awe123', type: 'reset')
|
|
41
43
|
end
|
|
44
|
+
|
|
45
|
+
it 'should be true for role=button when enable_aria_role: true' do
|
|
46
|
+
expect(@session).to have_button('ARIA button', enable_aria_role: true)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'should be false for a role=button within a label when enable_aria_role: true' do
|
|
50
|
+
expect(@session).not_to have_button('role=button within label', enable_aria_role: true)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'should be false for role=button when enable_aria_role: false' do
|
|
54
|
+
expect(@session).not_to have_button('ARIA button', enable_aria_role: false)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should be false for a role=button within a label when enable_aria_role: false' do
|
|
58
|
+
expect(@session).not_to have_button('role=button within label', enable_aria_role: false)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'should not affect other selectors when enable_aria_role: true' do
|
|
62
|
+
expect(@session).to have_button('Click me!', enable_aria_role: true)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should not affect other selectors when enable_aria_role: false' do
|
|
66
|
+
expect(@session).to have_button('Click me!', enable_aria_role: false)
|
|
67
|
+
end
|
|
42
68
|
end
|
|
43
69
|
|
|
44
70
|
Capybara::SpecHelper.spec '#has_no_button?' do
|
|
@@ -66,4 +92,29 @@ Capybara::SpecHelper.spec '#has_no_button?' do
|
|
|
66
92
|
it 'should be false for disabled buttons if disabled: false' do
|
|
67
93
|
expect(@session).to have_no_button('Disabled button', disabled: false)
|
|
68
94
|
end
|
|
95
|
+
|
|
96
|
+
it 'should be true for role=button when enable_aria_role: false' do
|
|
97
|
+
expect(@session).to have_no_button('ARIA button', enable_aria_role: false)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'should be true for role=button within a label when enable_aria_role: false' do
|
|
101
|
+
expect(@session).to have_no_button('role=button within label', enable_aria_role: false)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'should be false for role=button when enable_aria_role: true' do
|
|
105
|
+
expect(@session).not_to have_no_button('ARIA button', enable_aria_role: true)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'should be true for a role=button within a label when enable_aria_role: true' do
|
|
109
|
+
# label element does not associate with aria button
|
|
110
|
+
expect(@session).to have_no_button('role=button within label', enable_aria_role: true)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should not affect other selectors when enable_aria_role: true' do
|
|
114
|
+
expect(@session).to have_no_button('Junk button that does not exist', enable_aria_role: true)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it 'should not affect other selectors when enable_aria_role: false' do
|
|
118
|
+
expect(@session).to have_no_button('Junk button that does not exist', enable_aria_role: false)
|
|
119
|
+
end
|
|
69
120
|
end
|
|
@@ -14,8 +14,9 @@ Capybara::SpecHelper.spec '#has_css?' do
|
|
|
14
14
|
# This was never a specifically accepted format but it has worked for a
|
|
15
15
|
# lot of versions.
|
|
16
16
|
# TODO: Remove in 4.0
|
|
17
|
-
|
|
17
|
+
allow(Capybara::Helpers).to receive(:warn).and_return(nil)
|
|
18
18
|
expect(@session).to have_css(:p)
|
|
19
|
+
expect(Capybara::Helpers).to have_received(:warn)
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
it 'should be false if the given selector is not on the page' do
|
|
@@ -185,10 +186,10 @@ Capybara::SpecHelper.spec '#has_css?' do
|
|
|
185
186
|
end
|
|
186
187
|
|
|
187
188
|
it 'should be false when content occurs more times than given' do
|
|
188
|
-
expect(@session).not_to have_css('h2.head', maximum: 4) # edge case
|
|
189
|
-
expect(@session).not_to have_css('h2', maximum: 3)
|
|
189
|
+
# expect(@session).not_to have_css('h2.head', maximum: 4) # edge case
|
|
190
|
+
# expect(@session).not_to have_css('h2', maximum: 3)
|
|
190
191
|
expect(@session).not_to have_css('h2').at_most(3).times
|
|
191
|
-
expect(@session).not_to have_css('p', maximum: 1)
|
|
192
|
+
# expect(@session).not_to have_css('p', maximum: 1)
|
|
192
193
|
end
|
|
193
194
|
|
|
194
195
|
it 'should coerce maximum to an integer' do
|
|
@@ -234,18 +235,21 @@ Capybara::SpecHelper.spec '#has_css?' do
|
|
|
234
235
|
context 'with spatial requirements', requires: [:spatial] do
|
|
235
236
|
before do
|
|
236
237
|
@session.visit('/spatial')
|
|
237
|
-
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
let :center do
|
|
241
|
+
@session.find(:css, '.center')
|
|
238
242
|
end
|
|
239
243
|
|
|
240
244
|
it 'accepts spatial options' do
|
|
241
|
-
expect(@session).to have_css('div', above:
|
|
242
|
-
expect(@session).to have_css('div', above:
|
|
245
|
+
expect(@session).to have_css('div', above: center).thrice
|
|
246
|
+
expect(@session).to have_css('div', above: center, right_of: center).once
|
|
243
247
|
end
|
|
244
248
|
|
|
245
249
|
it 'supports spatial sugar' do
|
|
246
|
-
expect(@session).to have_css('div').left_of(
|
|
247
|
-
expect(@session).to have_css('div').below(
|
|
248
|
-
expect(@session).to have_css('div').near(
|
|
250
|
+
expect(@session).to have_css('div').left_of(center).thrice
|
|
251
|
+
expect(@session).to have_css('div').below(center).right_of(center).once
|
|
252
|
+
expect(@session).to have_css('div').near(center).exactly(8).times
|
|
249
253
|
end
|
|
250
254
|
end
|
|
251
255
|
|
|
@@ -94,6 +94,13 @@ Capybara::SpecHelper.spec '#has_current_path?' do
|
|
|
94
94
|
expect(@session).to have_current_path(nil, ignore_query: true)
|
|
95
95
|
end.not_to raise_exception
|
|
96
96
|
end
|
|
97
|
+
|
|
98
|
+
it 'should accept a filter block that receives Addressable::URL' do
|
|
99
|
+
@session.visit('/with_js?a=3&b=defgh')
|
|
100
|
+
expect(@session).to have_current_path('/with_js', ignore_query: true) { |url|
|
|
101
|
+
url.query_values.keys == %w[a b]
|
|
102
|
+
}
|
|
103
|
+
end
|
|
97
104
|
end
|
|
98
105
|
|
|
99
106
|
Capybara::SpecHelper.spec '#has_no_current_path?' do
|
|
@@ -128,11 +135,17 @@ Capybara::SpecHelper.spec '#has_no_current_path?' do
|
|
|
128
135
|
# Without ignore_query option
|
|
129
136
|
expect do
|
|
130
137
|
expect(@session).not_to have_current_path('/with_js')
|
|
131
|
-
end.
|
|
138
|
+
end.not_to raise_exception
|
|
132
139
|
|
|
133
140
|
# With ignore_query option
|
|
134
141
|
expect do
|
|
135
142
|
expect(@session).not_to have_current_path('/with_js', ignore_query: true)
|
|
136
|
-
end.
|
|
143
|
+
end.not_to raise_exception
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it 'should accept a filter block that receives Addressable::URL' do
|
|
147
|
+
expect(@session).to have_no_current_path('/with_js', ignore_query: true) { |url|
|
|
148
|
+
!url.query.nil?
|
|
149
|
+
}
|
|
137
150
|
end
|
|
138
151
|
end
|