capybara 2.18.0 → 3.0.0

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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +55 -1
  3. data/README.md +18 -17
  4. data/lib/capybara/config.rb +11 -58
  5. data/lib/capybara/cucumber.rb +2 -3
  6. data/lib/capybara/driver/base.rb +15 -16
  7. data/lib/capybara/driver/node.rb +5 -4
  8. data/lib/capybara/dsl.rb +1 -0
  9. data/lib/capybara/helpers.rb +19 -29
  10. data/lib/capybara/minitest/spec.rb +15 -14
  11. data/lib/capybara/minitest.rb +139 -138
  12. data/lib/capybara/node/actions.rb +60 -81
  13. data/lib/capybara/node/base.rb +11 -18
  14. data/lib/capybara/node/document.rb +2 -2
  15. data/lib/capybara/node/document_matchers.rb +8 -8
  16. data/lib/capybara/node/element.rb +30 -40
  17. data/lib/capybara/node/finders.rb +62 -70
  18. data/lib/capybara/node/matchers.rb +50 -71
  19. data/lib/capybara/node/simple.rb +11 -17
  20. data/lib/capybara/queries/ancestor_query.rb +11 -7
  21. data/lib/capybara/queries/base_query.rb +22 -18
  22. data/lib/capybara/queries/current_path_query.rb +8 -24
  23. data/lib/capybara/queries/match_query.rb +3 -7
  24. data/lib/capybara/queries/selector_query.rb +92 -95
  25. data/lib/capybara/queries/sibling_query.rb +4 -4
  26. data/lib/capybara/queries/text_query.rb +35 -35
  27. data/lib/capybara/queries/title_query.rb +8 -11
  28. data/lib/capybara/rack_test/browser.rb +15 -18
  29. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  30. data/lib/capybara/rack_test/driver.rb +6 -10
  31. data/lib/capybara/rack_test/form.rb +50 -40
  32. data/lib/capybara/rack_test/node.rb +93 -63
  33. data/lib/capybara/rails.rb +2 -6
  34. data/lib/capybara/result.rb +22 -22
  35. data/lib/capybara/rspec/compound.rb +5 -10
  36. data/lib/capybara/rspec/features.rb +17 -48
  37. data/lib/capybara/rspec/matcher_proxies.rb +31 -15
  38. data/lib/capybara/rspec/matchers.rb +70 -61
  39. data/lib/capybara/rspec.rb +5 -10
  40. data/lib/capybara/selector/css.rb +6 -11
  41. data/lib/capybara/selector/filter.rb +1 -17
  42. data/lib/capybara/selector/filter_set.rb +18 -15
  43. data/lib/capybara/selector/filters/base.rb +7 -6
  44. data/lib/capybara/selector/filters/expression_filter.rb +6 -23
  45. data/lib/capybara/selector/filters/node_filter.rb +2 -12
  46. data/lib/capybara/selector/selector.rb +28 -34
  47. data/lib/capybara/selector.rb +129 -117
  48. data/lib/capybara/selenium/driver.rb +131 -125
  49. data/lib/capybara/selenium/node.rb +197 -115
  50. data/lib/capybara/server.rb +3 -2
  51. data/lib/capybara/session/config.rb +47 -67
  52. data/lib/capybara/session/matchers.rb +8 -7
  53. data/lib/capybara/session.rb +138 -224
  54. data/lib/capybara/spec/public/test.js +25 -4
  55. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
  56. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
  57. data/lib/capybara/spec/session/accept_prompt_spec.rb +1 -0
  58. data/lib/capybara/spec/session/all_spec.rb +31 -18
  59. data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
  60. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
  61. data/lib/capybara/spec/session/assert_current_path.rb +12 -11
  62. data/lib/capybara/spec/session/assert_selector.rb +1 -0
  63. data/lib/capybara/spec/session/assert_text.rb +23 -23
  64. data/lib/capybara/spec/session/assert_title.rb +13 -3
  65. data/lib/capybara/spec/session/attach_file_spec.rb +51 -30
  66. data/lib/capybara/spec/session/body_spec.rb +1 -0
  67. data/lib/capybara/spec/session/check_spec.rb +7 -6
  68. data/lib/capybara/spec/session/choose_spec.rb +5 -4
  69. data/lib/capybara/spec/session/click_button_spec.rb +24 -32
  70. data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
  71. data/lib/capybara/spec/session/click_link_spec.rb +8 -7
  72. data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
  73. data/lib/capybara/spec/session/current_url_spec.rb +17 -6
  74. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
  75. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
  76. data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
  77. data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
  78. data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
  79. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +3 -2
  80. data/lib/capybara/spec/session/evaluate_script_spec.rb +4 -3
  81. data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
  82. data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
  83. data/lib/capybara/spec/session/find_button_spec.rb +4 -3
  84. data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
  85. data/lib/capybara/spec/session/find_field_spec.rb +9 -15
  86. data/lib/capybara/spec/session/find_link_spec.rb +6 -5
  87. data/lib/capybara/spec/session/find_spec.rb +37 -31
  88. data/lib/capybara/spec/session/first_spec.rb +60 -33
  89. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  90. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  91. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
  92. data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
  93. data/lib/capybara/spec/session/go_back_spec.rb +1 -0
  94. data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
  95. data/lib/capybara/spec/session/has_all_selectors_spec.rb +15 -15
  96. data/lib/capybara/spec/session/has_button_spec.rb +2 -1
  97. data/lib/capybara/spec/session/has_css_spec.rb +3 -2
  98. data/lib/capybara/spec/session/has_current_path_spec.rb +12 -28
  99. data/lib/capybara/spec/session/has_field_spec.rb +4 -3
  100. data/lib/capybara/spec/session/has_link_spec.rb +1 -0
  101. data/lib/capybara/spec/session/has_none_selectors_spec.rb +17 -17
  102. data/lib/capybara/spec/session/has_select_spec.rb +30 -29
  103. data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
  104. data/lib/capybara/spec/session/has_table_spec.rb +2 -1
  105. data/lib/capybara/spec/session/has_text_spec.rb +9 -13
  106. data/lib/capybara/spec/session/has_title_spec.rb +1 -0
  107. data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
  108. data/lib/capybara/spec/session/headers.rb +2 -1
  109. data/lib/capybara/spec/session/html_spec.rb +1 -0
  110. data/lib/capybara/spec/session/node_spec.rb +91 -56
  111. data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
  112. data/lib/capybara/spec/session/refresh_spec.rb +6 -2
  113. data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
  114. data/lib/capybara/spec/session/response_code.rb +1 -0
  115. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  116. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
  117. data/lib/capybara/spec/session/save_page_spec.rb +1 -17
  118. data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
  119. data/lib/capybara/spec/session/select_spec.rb +20 -20
  120. data/lib/capybara/spec/session/selectors_spec.rb +2 -2
  121. data/lib/capybara/spec/session/sibling_spec.rb +1 -1
  122. data/lib/capybara/spec/session/text_spec.rb +17 -3
  123. data/lib/capybara/spec/session/title_spec.rb +11 -1
  124. data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
  125. data/lib/capybara/spec/session/unselect_spec.rb +6 -5
  126. data/lib/capybara/spec/session/visit_spec.rb +9 -3
  127. data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
  128. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  129. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  130. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
  131. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
  132. data/lib/capybara/spec/session/window/window_spec.rb +12 -12
  133. data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
  134. data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
  135. data/lib/capybara/spec/session/within_spec.rb +1 -0
  136. data/lib/capybara/spec/spec_helper.rb +34 -18
  137. data/lib/capybara/spec/test_app.rb +17 -9
  138. data/lib/capybara/spec/views/form.erb +7 -0
  139. data/lib/capybara/spec/views/with_html.erb +23 -1
  140. data/lib/capybara/spec/views/within_frames.erb +4 -1
  141. data/lib/capybara/version.rb +2 -1
  142. data/lib/capybara/window.rb +6 -10
  143. data/lib/capybara.rb +28 -25
  144. data/spec/basic_node_spec.rb +1 -0
  145. data/spec/capybara_spec.rb +11 -50
  146. data/spec/dsl_spec.rb +5 -13
  147. data/spec/filter_set_spec.rb +5 -4
  148. data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
  149. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
  150. data/spec/minitest_spec.rb +4 -3
  151. data/spec/minitest_spec_spec.rb +3 -2
  152. data/spec/per_session_config_spec.rb +9 -8
  153. data/spec/rack_test_spec.rb +21 -20
  154. data/spec/result_spec.rb +17 -16
  155. data/spec/rspec/features_spec.rb +17 -14
  156. data/spec/rspec/scenarios_spec.rb +5 -7
  157. data/spec/rspec/shared_spec_matchers.rb +96 -99
  158. data/spec/rspec/views_spec.rb +2 -1
  159. data/spec/rspec_matchers_spec.rb +18 -2
  160. data/spec/rspec_spec.rb +11 -15
  161. data/spec/selector_spec.rb +5 -6
  162. data/spec/selenium_spec_chrome.rb +9 -4
  163. data/spec/selenium_spec_edge.rb +27 -0
  164. data/spec/selenium_spec_ie.rb +31 -0
  165. data/spec/selenium_spec_marionette.rb +28 -12
  166. data/spec/server_spec.rb +33 -33
  167. data/spec/session_spec.rb +2 -1
  168. data/spec/shared_selenium_session.rb +36 -22
  169. data/spec/spec_helper.rb +3 -6
  170. metadata +68 -85
  171. data/lib/capybara/query.rb +0 -7
  172. data/spec/selenium_spec_firefox.rb +0 -68
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#body' do
3
4
  it "should return the unmodified page body" do
4
5
  @session.visit('/')
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#check" do
3
4
  before do
4
5
  @session.visit('/form')
@@ -18,7 +19,7 @@ Capybara::SpecHelper.spec "#check" do
18
19
  it "should trigger associated events", requires: [:js] do
19
20
  @session.visit('/with_js')
20
21
  @session.check('checkbox_with_event')
21
- expect(@session).to have_css('#checkbox_event_triggered');
22
+ expect(@session).to have_css('#checkbox_event_triggered')
22
23
  end
23
24
 
24
25
  describe "checking" do
@@ -62,7 +63,7 @@ Capybara::SpecHelper.spec "#check" do
62
63
  end
63
64
 
64
65
  it "casts to string" do
65
- @session.check(:"form_pets_cat")
66
+ @session.check(:form_pets_cat)
66
67
  @session.click_button('awesome')
67
68
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
68
69
  end
@@ -86,14 +87,14 @@ Capybara::SpecHelper.spec "#check" do
86
87
 
87
88
  context "with :exact option" do
88
89
  it "should accept partial matches when false" do
89
- @session.check('Ham', exact: false)
90
+ @session.check('Ham', exact: false)
90
91
  @session.click_button('awesome')
91
92
  expect(extract_results(@session)['pets']).to include('hamster')
92
93
  end
93
94
 
94
95
  it "should not accept partial matches when true" do
95
96
  expect do
96
- @session.check('Ham', exact: true)
97
+ @session.check('Ham', exact: true)
97
98
  end.to raise_error(Capybara::ElementNotFound)
98
99
  end
99
100
  end
@@ -146,7 +147,7 @@ Capybara::SpecHelper.spec "#check" do
146
147
  end
147
148
 
148
149
  it "should raise error if not allowed to click label" do
149
- expect{@session.check('form_cars_mclaren', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
150
+ expect { @session.check('form_cars_mclaren', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
150
151
  end
151
152
  end
152
153
 
@@ -158,7 +159,7 @@ Capybara::SpecHelper.spec "#check" do
158
159
  end
159
160
 
160
161
  it "should raise error if checkbox not visible" do
161
- expect{@session.check('form_cars_mclaren')}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
162
+ expect { @session.check('form_cars_mclaren') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
162
163
  end
163
164
 
164
165
  context "with allow_label_click == true" do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#choose" do
3
4
  before do
4
5
  @session.visit('/form')
@@ -18,7 +19,7 @@ Capybara::SpecHelper.spec "#choose" do
18
19
 
19
20
  it "casts to string" do
20
21
  @session.choose("Both")
21
- @session.click_button(:'awesome')
22
+ @session.click_button(:awesome)
22
23
  expect(extract_results(@session)['gender']).to eq('both')
23
24
  end
24
25
 
@@ -41,14 +42,14 @@ Capybara::SpecHelper.spec "#choose" do
41
42
 
42
43
  context "with :exact option" do
43
44
  it "should accept partial matches when false" do
44
- @session.choose("Mal", exact: false)
45
+ @session.choose("Mal", exact: false)
45
46
  @session.click_button('awesome')
46
47
  expect(extract_results(@session)['gender']).to eq('male')
47
48
  end
48
49
 
49
50
  it "should not accept partial matches when true" do
50
51
  expect do
51
- @session.choose("Mal", exact: true)
52
+ @session.choose("Mal", exact: true)
52
53
  end.to raise_error(Capybara::ElementNotFound)
53
54
  end
54
55
  end
@@ -82,7 +83,7 @@ Capybara::SpecHelper.spec "#choose" do
82
83
  end
83
84
 
84
85
  it "should raise error if not allowed to click label" do
85
- expect{@session.choose("party_democrat", allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible radio button "party_democrat" that is not disabled')
86
+ expect { @session.choose("party_democrat", allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible radio button "party_democrat" that is not disabled')
86
87
  end
87
88
  end
88
89
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#click_button' do
3
4
  before do
4
5
  @session.visit('/form')
@@ -151,31 +152,24 @@ Capybara::SpecHelper.spec '#click_button' do
151
152
  end
152
153
  end
153
154
 
154
- context "with id given on a submit button" do
155
- it "should submit the associated form" do
155
+ context "input type=submit button" do
156
+ it "should submit by button id" do
156
157
  @session.click_button('awe123')
157
158
  expect(extract_results(@session)['first_name']).to eq('John')
158
159
  end
159
160
 
160
- it "should work with partial matches" do
161
- @session.click_button('Go')
162
- expect(@session).to have_content('You landed')
163
- end
164
- end
165
-
166
- context "with title given on a submit button" do
167
- it "should submit the associated form" do
161
+ it "should submit by button title" do
168
162
  @session.click_button('What an Awesome Button')
169
163
  expect(extract_results(@session)['first_name']).to eq('John')
170
164
  end
171
165
 
172
- it "should work with partial matches" do
166
+ it "should submit by partial title", :exact_false do
173
167
  @session.click_button('What an Awesome')
174
168
  expect(extract_results(@session)['first_name']).to eq('John')
175
169
  end
176
170
  end
177
171
 
178
- context "with fields associated with the form using the form attribute" do
172
+ context "with fields associated with the form using the form attribute", requires: [:form_attribute] do
179
173
  before do
180
174
  @session.click_button('submit_form1')
181
175
  @results = extract_results(@session)
@@ -198,8 +192,7 @@ Capybara::SpecHelper.spec '#click_button' do
198
192
  end
199
193
  end
200
194
 
201
-
202
- context "with submit button outside the form defined by <button> tag" do
195
+ context "with submit button outside the form defined by <button> tag", requires: [:form_attribute] do
203
196
  before do
204
197
  @session.click_button('outside_button')
205
198
  @results = extract_results(@session)
@@ -215,7 +208,7 @@ Capybara::SpecHelper.spec '#click_button' do
215
208
  end
216
209
  end
217
210
 
218
- context "with submit button outside the form defined by <input type='submit'> tag" do
211
+ context "with submit button outside the form defined by <input type='submit'> tag", requires: [:form_attribute] do
219
212
  before do
220
213
  @session.click_button('outside_submit')
221
214
  @results = extract_results(@session)
@@ -231,7 +224,7 @@ Capybara::SpecHelper.spec '#click_button' do
231
224
  end
232
225
  end
233
226
 
234
- context "with submit button for form1 located within form2" do
227
+ context "with submit button for form1 located within form2", requires: [:form_attribute] do
235
228
  it "should submit the form associated with the button" do
236
229
  @session.click_button('other_form_button')
237
230
  expect(extract_results(@session)['which_form']).to eq("form1")
@@ -250,20 +243,19 @@ Capybara::SpecHelper.spec '#click_button' do
250
243
  expect(extract_results(@session)['first_name']).to eq('John')
251
244
  end
252
245
 
253
- it "should work with partial matches" do
246
+ it "should work with partial matches", :exact_false do
254
247
  @session.click_button('hai')
255
248
  expect(extract_results(@session)['first_name']).to eq('John')
256
249
  end
257
250
  end
258
251
 
259
-
260
252
  context "with value given on an image button" do
261
253
  it "should submit the associated form" do
262
254
  @session.click_button('okay')
263
255
  expect(extract_results(@session)['first_name']).to eq('John')
264
256
  end
265
257
 
266
- it "should work with partial matches" do
258
+ it "should work with partial matches", :exact_false do
267
259
  @session.click_button('kay')
268
260
  expect(extract_results(@session)['first_name']).to eq('John')
269
261
  end
@@ -282,7 +274,7 @@ Capybara::SpecHelper.spec '#click_button' do
282
274
  expect(extract_results(@session)['first_name']).to eq('John')
283
275
  end
284
276
 
285
- it "should work with partial matches" do
277
+ it "should work with partial matches", :exact_false do
286
278
  @session.click_button('Okay 556')
287
279
  expect(extract_results(@session)['first_name']).to eq('John')
288
280
  end
@@ -290,17 +282,17 @@ Capybara::SpecHelper.spec '#click_button' do
290
282
 
291
283
  context "with text given on a button defined by <button> tag" do
292
284
  it "should submit the associated form" do
293
- @session.click_button('Click me')
285
+ @session.click_button('Click me!')
294
286
  expect(extract_results(@session)['first_name']).to eq('John')
295
287
  end
296
288
 
297
- it "should work with partial matches" do
289
+ it "should work with partial matches", :exact_false do
298
290
  @session.click_button('Click')
299
291
  expect(extract_results(@session)['first_name']).to eq('John')
300
292
  end
301
293
  end
302
294
 
303
- context "with id given on a button defined by <button> tag" do
295
+ context "with id given on a button defined by <button> tag" do
304
296
  it "should submit the associated form" do
305
297
  @session.click_button('click_me_123')
306
298
  expect(extract_results(@session)['first_name']).to eq('John')
@@ -315,13 +307,13 @@ Capybara::SpecHelper.spec '#click_button' do
315
307
  end
316
308
  end
317
309
 
318
- context "with value given on a button defined by <button> tag" do
310
+ context "with value given on a button defined by <button> tag" do
319
311
  it "should submit the associated form" do
320
312
  @session.click_button('click_me')
321
313
  expect(extract_results(@session)['first_name']).to eq('John')
322
314
  end
323
315
 
324
- it "should work with partial matches" do
316
+ it "should work with partial matches", :exact_false do
325
317
  @session.click_button('ck_me')
326
318
  expect(extract_results(@session)['first_name']).to eq('John')
327
319
  end
@@ -333,7 +325,7 @@ Capybara::SpecHelper.spec '#click_button' do
333
325
  expect(extract_results(@session)['first_name']).to eq('John')
334
326
  end
335
327
 
336
- it "should work with partial matches" do
328
+ it "should work with partial matches", :exact_false do
337
329
  @session.click_button('Click Title')
338
330
  expect(extract_results(@session)['first_name']).to eq('John')
339
331
  end
@@ -345,7 +337,7 @@ Capybara::SpecHelper.spec '#click_button' do
345
337
  expect(extract_results(@session)['first_name']).to eq('John')
346
338
  end
347
339
 
348
- it "should work with partial matches" do
340
+ it "should work with partial matches", :exact_false do
349
341
  @session.click_button('se eating h')
350
342
  expect(extract_results(@session)['first_name']).to eq('John')
351
343
  end
@@ -424,15 +416,15 @@ Capybara::SpecHelper.spec '#click_button' do
424
416
 
425
417
  it "should encode complex field names, like array[][value]" do
426
418
  @session.visit('/form')
427
- @session.fill_in('address1_city', :with =>'Paris')
428
- @session.fill_in('address1_street', :with =>'CDG')
419
+ @session.fill_in('address1_city', with: 'Paris')
420
+ @session.fill_in('address1_street', with: 'CDG')
429
421
 
430
422
  @session.fill_in('address2_city', with: 'Mikolaiv')
431
423
  @session.fill_in('address2_street', with: 'PGS')
432
424
 
433
425
  @session.click_button "awesome"
434
426
 
435
- addresses=extract_results(@session)["addresses"]
427
+ addresses = extract_results(@session)["addresses"]
436
428
  expect(addresses.size).to eq(2)
437
429
 
438
430
  expect(addresses[0]["street"]).to eq('CDG')
@@ -446,13 +438,13 @@ Capybara::SpecHelper.spec '#click_button' do
446
438
 
447
439
  context "with :exact option" do
448
440
  it "should accept partial matches when false" do
449
- @session.click_button('What an Awesome', exact: false)
441
+ @session.click_button('What an Awesome', exact: false)
450
442
  expect(extract_results(@session)['first_name']).to eq('John')
451
443
  end
452
444
 
453
445
  it "should not accept partial matches when true" do
454
446
  expect do
455
- @session.click_button('What an Awesome', exact: true)
447
+ @session.click_button('What an Awesome', exact: true)
456
448
  end.to raise_error(Capybara::ElementNotFound)
457
449
  end
458
450
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#click_link_or_button' do
3
4
  it "should click on a link" do
4
5
  @session.visit('/with_html')
@@ -32,31 +33,31 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
32
33
 
33
34
  it "casts to string" do
34
35
  @session.visit('/form')
35
- @session.click_link_or_button(:'awe123')
36
+ @session.click_link_or_button(:awe123)
36
37
  expect(extract_results(@session)['first_name']).to eq('John')
37
38
  end
38
39
 
39
40
  context "with :exact option" do
40
- context "when `true`" do
41
+ context "when `false`" do
41
42
  it "clicks on approximately matching link" do
42
43
  @session.visit('/with_html')
43
- @session.click_link_or_button('abore', exact: false)
44
+ @session.click_link_or_button('abore', exact: false)
44
45
  expect(@session).to have_content('Bar')
45
46
  end
46
47
 
47
48
  it "clicks on approximately matching button" do
48
49
  @session.visit('/form')
49
- @session.click_link_or_button('awe')
50
+ @session.click_link_or_button('awe', exact: false)
50
51
  expect(extract_results(@session)['first_name']).to eq('John')
51
52
  end
52
53
  end
53
54
 
54
- context "when `false`" do
55
+ context "when `true`" do
55
56
  it "does not click on link which matches approximately" do
56
57
  @session.visit('/with_html')
57
58
  msg = "Unable to find visible link or button \"abore\""
58
59
  expect do
59
- @session.click_link_or_button('abore', exact: true)
60
+ @session.click_link_or_button('abore', exact: true)
60
61
  end.to raise_error(Capybara::ElementNotFound, msg)
61
62
  end
62
63
 
@@ -65,7 +66,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
65
66
  msg = "Unable to find visible link or button \"awe\""
66
67
 
67
68
  expect do
68
- @session.click_link_or_button('awe', exact: true)
69
+ @session.click_link_or_button('awe', exact: true)
69
70
  end.to raise_error(Capybara::ElementNotFound, msg)
70
71
  end
71
72
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#click_link' do
3
4
  before do
4
5
  @session.visit('/with_html')
@@ -11,7 +12,7 @@ Capybara::SpecHelper.spec '#click_link' do
11
12
  end
12
13
 
13
14
  it "casts to string" do
14
- @session.click_link(:'foo')
15
+ @session.click_link(:foo)
15
16
  expect(@session).to have_content('Another World')
16
17
  end
17
18
 
@@ -35,7 +36,7 @@ Capybara::SpecHelper.spec '#click_link' do
35
36
  expect(@session).to have_content('Bar')
36
37
  end
37
38
 
38
- it "should accept partial matches" do
39
+ it "should accept partial matches", :exact_false do
39
40
  @session.click_link('abo')
40
41
  expect(@session).to have_content('Bar')
41
42
  end
@@ -47,7 +48,7 @@ Capybara::SpecHelper.spec '#click_link' do
47
48
  expect(@session).to have_content('Bar')
48
49
  end
49
50
 
50
- it "should accept partial matches" do
51
+ it "should accept partial matches", :exact_false do
51
52
  @session.click_link('some titl')
52
53
  expect(@session).to have_content('Bar')
53
54
  end
@@ -59,7 +60,7 @@ Capybara::SpecHelper.spec '#click_link' do
59
60
  expect(@session).to have_content('Bar')
60
61
  end
61
62
 
62
- it "should accept partial matches" do
63
+ it "should accept partial matches", :exact_false do
63
64
  @session.click_link('some imag')
64
65
  expect(@session).to have_content('Bar')
65
66
  end
@@ -85,7 +86,7 @@ Capybara::SpecHelper.spec '#click_link' do
85
86
  end
86
87
  end
87
88
 
88
- context "with a regex :href option given" do
89
+ context "with a regex :href option given" do
89
90
  it "should find a link matching an all-matching regex pattern" do
90
91
  @session.click_link('labore', href: /.+/)
91
92
  expect(@session).to have_content('Bar')
@@ -180,13 +181,13 @@ Capybara::SpecHelper.spec '#click_link' do
180
181
 
181
182
  context "with :exact option" do
182
183
  it "should accept partial matches when false" do
183
- @session.click_link('abo', exact: false)
184
+ @session.click_link('abo', exact: false)
184
185
  expect(@session).to have_content('Bar')
185
186
  end
186
187
 
187
188
  it "should not accept partial matches when true" do
188
189
  expect do
189
- @session.click_link('abo', exact: true)
190
+ @session.click_link('abo', exact: true)
190
191
  end.to raise_error(Capybara::ElementNotFound)
191
192
  end
192
193
  end
@@ -1,15 +1,16 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#current_scope' do
3
4
  before do
4
5
  @session.visit('/with_scope')
5
6
  end
6
-
7
+
7
8
  context "when not in a #within block" do
8
9
  it "should return the document" do
9
10
  expect(@session.current_scope).to be_kind_of Capybara::Node::Document
10
11
  end
11
12
  end
12
-
13
+
13
14
  context "when in a #within block" do
14
15
  it "should return the element in scope" do
15
16
  @session.within(:css, "#simple_first_name") do
@@ -17,7 +18,7 @@ Capybara::SpecHelper.spec '#current_scope' do
17
18
  end
18
19
  end
19
20
  end
20
-
21
+
21
22
  context "when in a nested #within block" do
22
23
  it "should return the element in scope" do
23
24
  @session.within("//div[@id='for_bar']") do
@@ -1,24 +1,25 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "capybara/spec/test_app"
3
4
 
4
5
  Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
5
6
  before :all do
6
- @servers = 2.times.map { Capybara::Server.new(TestApp.new).boot }
7
+ @servers = Array.new(2) { Capybara::Server.new(TestApp.new).boot }
7
8
  # sanity check
8
9
  expect(@servers[0].port).not_to eq(@servers[1].port)
9
- expect(@servers.map { |s| s.port }).not_to include 80
10
+ expect(@servers.map(&:port)).not_to include 80
10
11
  end
11
12
 
12
13
  def bases
13
14
  @servers.map { |s| "http://#{s.host}:#{s.port}" }
14
15
  end
15
16
 
16
- def should_be_on server_index, path="/host", scheme="http"
17
- #This delay is to give fully async drivers (selenium w/chromedriver) time for the browser
18
- #to get to its destination - should be removed when we have a waiting current_url matcher
19
- sleep 0.1 # remove and adjust tests when a waiting current_url/path matcher is implemented
17
+ def should_be_on(server_index, path = "/host", scheme = "http")
20
18
  # Check that we are on /host on the given server
21
19
  s = @servers[server_index]
20
+
21
+ expect(@session).to have_current_path("#{scheme}://#{s.host}:#{s.port}#{path}", url: true)
22
+
22
23
  expect(@session.current_url.chomp('?')).to eq("#{scheme}://#{s.host}:#{s.port}#{path}")
23
24
  expect(@session.current_host).to eq("#{scheme}://#{s.host}") # no port
24
25
  expect(@session.current_path).to eq(path)
@@ -104,4 +105,14 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
104
105
  expect { @session.current_url }.not_to raise_exception
105
106
  expect { @session.current_path }.not_to raise_exception
106
107
  end
108
+
109
+ context "within iframe", requires: [:frames] do
110
+ it "should get the url of the top level browsing context" do
111
+ @session.visit('/within_frames')
112
+ expect(@session.current_url).to match(/within_frames\z/)
113
+ @session.within_frame('frameOne') do
114
+ expect(@session.current_url).to match(/within_frames\z/)
115
+ end
116
+ end
117
+ end
107
118
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
@@ -26,7 +27,6 @@ Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
26
27
  end.to raise_error(Capybara::ModalNotFound)
27
28
  end
28
29
 
29
-
30
30
  it "should return the message presented" do
31
31
  message = @session.dismiss_confirm do
32
32
  @session.click_link('Open confirm')
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#dismiss_prompt', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
@@ -31,6 +31,6 @@ Capybara::SpecHelper.spec '#assert_matches_selector' do
31
31
 
32
32
  it "should accept a filter block" do
33
33
  @element.assert_matches_selector(:css, 'span') { |el| el[:class] == "number" }
34
- @element.assert_not_matches_selector(:css,'span') { |el| el[:class] == "not_number" }
34
+ @element.assert_not_matches_selector(:css, 'span') { |el| el[:class] == "not_number" }
35
35
  end
36
36
  end
@@ -20,4 +20,4 @@ Capybara::SpecHelper.spec '#match_xpath?' do
20
20
  expect(@element).not_to have_xpath("//span[@class='not_a_number']")
21
21
  expect(@element).not_to have_xpath("//div[@class='number']")
22
22
  end
23
- end
23
+ end
@@ -52,10 +52,10 @@ Capybara::SpecHelper.spec '#match_selector?' do
52
52
  it 'should accept a custom filter block' do
53
53
  @session.visit('/form')
54
54
  cbox = @session.find(:css, '#form_pets_dog')
55
- expect(cbox).to match_selector(:checkbox){ |node| node[:id] == "form_pets_dog"}
56
- expect(cbox).not_to match_selector(:checkbox){ |node| node[:id] != "form_pets_dog"}
57
- expect(cbox.matches_selector?(:checkbox){ |node| node[:id] == "form_pets_dog"}).to be true
58
- expect(cbox.matches_selector?(:checkbox){ |node| node[:id] != "form_pets_dog"}).to be false
55
+ expect(cbox).to match_selector(:checkbox) { |node| node[:id] == "form_pets_dog" }
56
+ expect(cbox).not_to match_selector(:checkbox) { |node| node[:id] != "form_pets_dog" }
57
+ expect(cbox.matches_selector?(:checkbox) { |node| node[:id] == "form_pets_dog" }).to be true
58
+ expect(cbox.matches_selector?(:checkbox) { |node| node[:id] != "form_pets_dog" }).to be false
59
59
  end
60
60
  end
61
61
 
@@ -103,4 +103,4 @@ Capybara::SpecHelper.spec '#not_matches_selector?' do
103
103
  expect(@element.not_matches_xpath?("//span", text: "42")).to be false
104
104
  expect(@element.not_matches_xpath?("//span", text: "Doesnotexist")).to be true
105
105
  end
106
- end if Gem::Version.new(RSpec::Expectations::Version::STRING) >= Gem::Version.new('3.1')
106
+ end
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#evaluate_async_script", requires: [:js] do
3
4
  it "should evaluate the given script and return whatever it produces" do
4
5
  @session.visit('/with_js')
5
6
  expect(@session.evaluate_async_script("arguments[0](4)")).to eq(4)
6
7
  end
7
8
 
8
- it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
9
+ it "should support passing elements as arguments to the script", requires: %i[js es_args] do
9
10
  @session.visit('/with_js')
10
11
  el = @session.find(:css, '#drag p')
11
12
  result = @session.evaluate_async_script("arguments[2]([arguments[0].innerText, arguments[1]])", el, "Doodle Funk")
12
13
  expect(result).to eq ["This is a draggable element.", "Doodle Funk"]
13
14
  end
14
15
 
15
- it "should support returning elements after asynchronous operation", requires: [:js, :es_args] do
16
+ it "should support returning elements after asynchronous operation", requires: %i[js es_args] do
16
17
  @session.visit('/with_js')
17
18
  @session.find(:css, '#change') # ensure page has loaded and element is available
18
19
  el = @session.evaluate_async_script("var cb = arguments[0]; setTimeout(function(){ cb(document.getElementById('change')) }, 100)")
@@ -1,24 +1,25 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#evaluate_script", requires: [:js] do
3
4
  it "should evaluate the given script and return whatever it produces" do
4
5
  @session.visit('/with_js')
5
6
  expect(@session.evaluate_script("1+3")).to eq(4)
6
7
  end
7
8
 
8
- it "should pass arguments to the script", requires: [:js, :es_args] do
9
+ it "should pass arguments to the script", requires: %i[js es_args] do
9
10
  @session.visit('/with_js')
10
11
  @session.evaluate_script("document.getElementById('change').textContent = arguments[0]", "Doodle Funk")
11
12
  expect(@session).to have_css('#change', text: 'Doodle Funk')
12
13
  end
13
14
 
14
- it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
15
+ it "should support passing elements as arguments to the script", requires: %i[js es_args] do
15
16
  @session.visit('/with_js')
16
17
  el = @session.find(:css, '#change')
17
18
  @session.evaluate_script("arguments[0].textContent = arguments[1]", el, "Doodle Funk")
18
19
  expect(@session).to have_css('#change', text: 'Doodle Funk')
19
20
  end
20
21
 
21
- it "should support returning elements", requires: [:js, :es_args] do
22
+ it "should support returning elements", requires: %i[js es_args] do
22
23
  @session.visit('/with_js')
23
24
  @session.find(:css, '#change') # ensure page has loaded and element is available
24
25
  el = @session.evaluate_script("document.getElementById('change')")
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#execute_script", requires: [:js] do
3
4
  it "should execute the given script and return nothing" do
4
5
  @session.visit('/with_js')
@@ -8,16 +9,16 @@ Capybara::SpecHelper.spec "#execute_script", requires: [:js] do
8
9
 
9
10
  it "should be able to call functions defined in the page" do
10
11
  @session.visit('/with_js')
11
- expect{ @session.execute_script("$('#change').text('Funky Doodle')") }.not_to raise_error
12
+ expect { @session.execute_script("$('#change').text('Funky Doodle')") }.not_to raise_error
12
13
  end
13
14
 
14
- it "should pass arguments to the script", requires: [:js, :es_args] do
15
+ it "should pass arguments to the script", requires: %i[js es_args] do
15
16
  @session.visit('/with_js')
16
17
  @session.execute_script("document.getElementById('change').textContent = arguments[0]", "Doodle Funk")
17
18
  expect(@session).to have_css('#change', text: 'Doodle Funk')
18
19
  end
19
20
 
20
- it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
21
+ it "should support passing elements as arguments to the script", requires: %i[js es_args] do
21
22
  @session.visit('/with_js')
22
23
  el = @session.find(:css, '#change')
23
24
  @session.execute_script("arguments[1].textContent = arguments[0]", "Doodle Funk", el)