capybara 2.5.0 → 2.18.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 (205) hide show
  1. checksums.yaml +5 -5
  2. data/.yard/templates_custom/default/class/html/selectors.erb +38 -0
  3. data/.yard/templates_custom/default/class/html/setup.rb +17 -0
  4. data/.yard/yard_extensions.rb +78 -0
  5. data/.yardopts +1 -0
  6. data/History.md +413 -10
  7. data/License.txt +1 -1
  8. data/README.md +237 -130
  9. data/lib/capybara/config.rb +132 -0
  10. data/lib/capybara/cucumber.rb +3 -1
  11. data/lib/capybara/driver/base.rb +27 -6
  12. data/lib/capybara/driver/node.rb +14 -5
  13. data/lib/capybara/dsl.rb +2 -3
  14. data/lib/capybara/helpers.rb +13 -65
  15. data/lib/capybara/minitest/spec.rb +177 -0
  16. data/lib/capybara/minitest.rb +278 -0
  17. data/lib/capybara/node/actions.rb +180 -24
  18. data/lib/capybara/node/base.rb +17 -5
  19. data/lib/capybara/node/document.rb +5 -0
  20. data/lib/capybara/node/document_matchers.rb +15 -14
  21. data/lib/capybara/node/element.rb +55 -7
  22. data/lib/capybara/node/finders.rb +179 -67
  23. data/lib/capybara/node/matchers.rb +301 -105
  24. data/lib/capybara/node/simple.rb +15 -4
  25. data/lib/capybara/queries/ancestor_query.rb +25 -0
  26. data/lib/capybara/queries/base_query.rb +69 -3
  27. data/lib/capybara/queries/current_path_query.rb +17 -8
  28. data/lib/capybara/queries/match_query.rb +19 -0
  29. data/lib/capybara/queries/selector_query.rb +251 -0
  30. data/lib/capybara/queries/sibling_query.rb +25 -0
  31. data/lib/capybara/queries/text_query.rb +67 -16
  32. data/lib/capybara/queries/title_query.rb +4 -2
  33. data/lib/capybara/query.rb +3 -131
  34. data/lib/capybara/rack_test/browser.rb +14 -5
  35. data/lib/capybara/rack_test/css_handlers.rb +1 -0
  36. data/lib/capybara/rack_test/driver.rb +15 -8
  37. data/lib/capybara/rack_test/form.rb +34 -12
  38. data/lib/capybara/rack_test/node.rb +29 -12
  39. data/lib/capybara/rails.rb +3 -3
  40. data/lib/capybara/result.rb +104 -9
  41. data/lib/capybara/rspec/compound.rb +95 -0
  42. data/lib/capybara/rspec/features.rb +17 -6
  43. data/lib/capybara/rspec/matcher_proxies.rb +45 -0
  44. data/lib/capybara/rspec/matchers.rb +199 -80
  45. data/lib/capybara/rspec.rb +4 -2
  46. data/lib/capybara/selector/css.rb +30 -0
  47. data/lib/capybara/selector/filter.rb +20 -0
  48. data/lib/capybara/selector/filter_set.rb +74 -0
  49. data/lib/capybara/selector/filters/base.rb +33 -0
  50. data/lib/capybara/selector/filters/expression_filter.rb +40 -0
  51. data/lib/capybara/selector/filters/node_filter.rb +27 -0
  52. data/lib/capybara/selector/selector.rb +276 -0
  53. data/lib/capybara/selector.rb +452 -157
  54. data/lib/capybara/selenium/driver.rb +282 -81
  55. data/lib/capybara/selenium/node.rb +144 -46
  56. data/lib/capybara/server.rb +59 -16
  57. data/lib/capybara/session/config.rb +114 -0
  58. data/lib/capybara/session/matchers.rb +29 -19
  59. data/lib/capybara/session.rb +378 -143
  60. data/lib/capybara/spec/fixtures/no_extension +1 -0
  61. data/lib/capybara/spec/public/jquery-ui.js +13 -791
  62. data/lib/capybara/spec/public/jquery.js +4 -9045
  63. data/lib/capybara/spec/public/test.js +45 -11
  64. data/lib/capybara/spec/session/accept_alert_spec.rb +30 -7
  65. data/lib/capybara/spec/session/accept_confirm_spec.rb +14 -2
  66. data/lib/capybara/spec/session/accept_prompt_spec.rb +35 -6
  67. data/lib/capybara/spec/session/all_spec.rb +45 -32
  68. data/lib/capybara/spec/session/ancestor_spec.rb +85 -0
  69. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +110 -0
  70. data/lib/capybara/spec/session/assert_current_path.rb +15 -2
  71. data/lib/capybara/spec/session/assert_selector.rb +29 -28
  72. data/lib/capybara/spec/session/assert_text.rb +59 -20
  73. data/lib/capybara/spec/session/assert_title.rb +25 -11
  74. data/lib/capybara/spec/session/attach_file_spec.rb +42 -4
  75. data/lib/capybara/spec/session/body_spec.rb +1 -0
  76. data/lib/capybara/spec/session/check_spec.rb +90 -14
  77. data/lib/capybara/spec/session/choose_spec.rb +31 -5
  78. data/lib/capybara/spec/session/click_button_spec.rb +20 -9
  79. data/lib/capybara/spec/session/click_link_or_button_spec.rb +15 -9
  80. data/lib/capybara/spec/session/click_link_spec.rb +39 -15
  81. data/lib/capybara/spec/session/current_scope_spec.rb +2 -1
  82. data/lib/capybara/spec/session/current_url_spec.rb +12 -3
  83. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +6 -5
  84. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +4 -3
  85. data/lib/capybara/spec/session/element/assert_match_selector.rb +36 -0
  86. data/lib/capybara/spec/session/element/match_css_spec.rb +23 -0
  87. data/lib/capybara/spec/session/element/match_xpath_spec.rb +23 -0
  88. data/lib/capybara/spec/session/element/matches_selector_spec.rb +106 -0
  89. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +22 -0
  90. data/lib/capybara/spec/session/evaluate_script_spec.rb +23 -1
  91. data/lib/capybara/spec/session/execute_script_spec.rb +22 -3
  92. data/lib/capybara/spec/session/fill_in_spec.rb +50 -32
  93. data/lib/capybara/spec/session/find_button_spec.rb +43 -2
  94. data/lib/capybara/spec/session/find_by_id_spec.rb +3 -2
  95. data/lib/capybara/spec/session/find_field_spec.rb +42 -6
  96. data/lib/capybara/spec/session/find_link_spec.rb +22 -3
  97. data/lib/capybara/spec/session/find_spec.rb +103 -57
  98. data/lib/capybara/spec/session/first_spec.rb +34 -18
  99. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +103 -0
  100. data/lib/capybara/spec/session/{within_frame_spec.rb → frame/within_frame_spec.rb} +44 -2
  101. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  102. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  103. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  104. data/lib/capybara/spec/session/has_button_spec.rb +17 -8
  105. data/lib/capybara/spec/session/has_css_spec.rb +85 -73
  106. data/lib/capybara/spec/session/has_current_path_spec.rb +91 -7
  107. data/lib/capybara/spec/session/has_field_spec.rb +93 -58
  108. data/lib/capybara/spec/session/has_link_spec.rb +9 -8
  109. data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
  110. data/lib/capybara/spec/session/has_select_spec.rb +159 -59
  111. data/lib/capybara/spec/session/has_selector_spec.rb +64 -28
  112. data/lib/capybara/spec/session/has_table_spec.rb +1 -0
  113. data/lib/capybara/spec/session/has_text_spec.rb +27 -12
  114. data/lib/capybara/spec/session/has_title_spec.rb +22 -4
  115. data/lib/capybara/spec/session/has_xpath_spec.rb +32 -29
  116. data/lib/capybara/spec/session/headers.rb +2 -1
  117. data/lib/capybara/spec/session/html_spec.rb +4 -3
  118. data/lib/capybara/spec/session/node_spec.rb +198 -38
  119. data/lib/capybara/spec/session/refresh_spec.rb +28 -0
  120. data/lib/capybara/spec/session/reset_session_spec.rb +46 -5
  121. data/lib/capybara/spec/session/response_code.rb +2 -1
  122. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  123. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -5
  124. data/lib/capybara/spec/session/save_page_spec.rb +34 -2
  125. data/lib/capybara/spec/session/save_screenshot_spec.rb +31 -1
  126. data/lib/capybara/spec/session/screenshot_spec.rb +4 -2
  127. data/lib/capybara/spec/session/select_spec.rb +34 -32
  128. data/lib/capybara/spec/session/selectors_spec.rb +65 -0
  129. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  130. data/lib/capybara/spec/session/text_spec.rb +4 -4
  131. data/lib/capybara/spec/session/title_spec.rb +2 -1
  132. data/lib/capybara/spec/session/uncheck_spec.rb +42 -2
  133. data/lib/capybara/spec/session/unselect_spec.rb +17 -16
  134. data/lib/capybara/spec/session/visit_spec.rb +77 -2
  135. data/lib/capybara/spec/session/window/become_closed_spec.rb +12 -11
  136. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  137. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  138. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +16 -11
  139. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +7 -4
  140. data/lib/capybara/spec/session/window/window_spec.rb +36 -29
  141. data/lib/capybara/spec/session/window/windows_spec.rb +1 -0
  142. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -7
  143. data/lib/capybara/spec/session/within_spec.rb +14 -6
  144. data/lib/capybara/spec/spec_helper.rb +37 -4
  145. data/lib/capybara/spec/test_app.rb +15 -3
  146. data/lib/capybara/spec/views/buttons.erb +1 -0
  147. data/lib/capybara/spec/views/fieldsets.erb +2 -1
  148. data/lib/capybara/spec/views/form.erb +169 -9
  149. data/lib/capybara/spec/views/frame_child.erb +10 -2
  150. data/lib/capybara/spec/views/frame_one.erb +2 -1
  151. data/lib/capybara/spec/views/frame_parent.erb +3 -2
  152. data/lib/capybara/spec/views/frame_two.erb +2 -1
  153. data/lib/capybara/spec/views/header_links.erb +1 -0
  154. data/lib/capybara/spec/views/host_links.erb +1 -0
  155. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  156. data/lib/capybara/spec/views/path.erb +1 -0
  157. data/lib/capybara/spec/views/popup_one.erb +1 -0
  158. data/lib/capybara/spec/views/popup_two.erb +1 -0
  159. data/lib/capybara/spec/views/postback.erb +2 -1
  160. data/lib/capybara/spec/views/tables.erb +1 -0
  161. data/lib/capybara/spec/views/with_base_tag.erb +1 -0
  162. data/lib/capybara/spec/views/with_count.erb +2 -1
  163. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  164. data/lib/capybara/spec/views/with_hover.erb +7 -1
  165. data/lib/capybara/spec/views/with_html.erb +40 -2
  166. data/lib/capybara/spec/views/with_html_entities.erb +1 -0
  167. data/lib/capybara/spec/views/with_js.erb +32 -1
  168. data/lib/capybara/spec/views/with_scope.erb +1 -0
  169. data/lib/capybara/spec/views/with_simple_html.erb +2 -1
  170. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  171. data/lib/capybara/spec/views/with_title.erb +2 -1
  172. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  173. data/lib/capybara/spec/views/with_windows.erb +7 -0
  174. data/lib/capybara/spec/views/within_frames.erb +3 -2
  175. data/lib/capybara/version.rb +2 -1
  176. data/lib/capybara/window.rb +20 -3
  177. data/lib/capybara.rb +189 -93
  178. data/spec/basic_node_spec.rb +7 -6
  179. data/spec/capybara_spec.rb +90 -4
  180. data/spec/dsl_spec.rb +3 -1
  181. data/spec/filter_set_spec.rb +28 -0
  182. data/spec/fixtures/capybara.csv +1 -0
  183. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -1
  184. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -1
  185. data/spec/minitest_spec.rb +130 -0
  186. data/spec/minitest_spec_spec.rb +135 -0
  187. data/spec/per_session_config_spec.rb +67 -0
  188. data/spec/rack_test_spec.rb +50 -7
  189. data/spec/result_spec.rb +76 -0
  190. data/spec/rspec/features_spec.rb +21 -8
  191. data/spec/rspec/scenarios_spec.rb +21 -0
  192. data/spec/rspec/{matchers_spec.rb → shared_spec_matchers.rb} +160 -54
  193. data/spec/rspec/views_spec.rb +5 -0
  194. data/spec/rspec_matchers_spec.rb +46 -0
  195. data/spec/rspec_spec.rb +79 -1
  196. data/spec/selector_spec.rb +199 -0
  197. data/spec/selenium_spec_chrome.rb +54 -9
  198. data/spec/selenium_spec_firefox.rb +68 -0
  199. data/spec/selenium_spec_marionette.rb +127 -0
  200. data/spec/server_spec.rb +102 -14
  201. data/spec/session_spec.rb +54 -0
  202. data/spec/shared_selenium_session.rb +215 -0
  203. data/spec/spec_helper.rb +7 -0
  204. metadata +140 -15
  205. data/spec/selenium_spec.rb +0 -128
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec "#choose" do
2
3
  before do
3
4
  @session.visit('/form')
@@ -23,7 +24,7 @@ Capybara::SpecHelper.spec "#choose" do
23
24
 
24
25
  context "with a locator that doesn't exist" do
25
26
  it "should raise an error" do
26
- msg = "Unable to find radio button \"does not exist\""
27
+ msg = "Unable to find visible radio button \"does not exist\" that is not disabled"
27
28
  expect do
28
29
  @session.choose('does not exist')
29
30
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -40,29 +41,54 @@ Capybara::SpecHelper.spec "#choose" do
40
41
 
41
42
  context "with :exact option" do
42
43
  it "should accept partial matches when false" do
43
- @session.choose("Mal", :exact => false)
44
+ @session.choose("Mal", exact: false)
44
45
  @session.click_button('awesome')
45
46
  expect(extract_results(@session)['gender']).to eq('male')
46
47
  end
47
48
 
48
49
  it "should not accept partial matches when true" do
49
50
  expect do
50
- @session.choose("Mal", :exact => true)
51
+ @session.choose("Mal", exact: true)
51
52
  end.to raise_error(Capybara::ElementNotFound)
52
53
  end
53
54
  end
54
55
 
55
56
  context "with `option` option" do
56
57
  it "can check radio buttons by their value" do
57
- @session.choose('form[gender]', :option => "male")
58
+ @session.choose('form[gender]', option: "male")
58
59
  @session.click_button('awesome')
59
60
  expect(extract_results(@session)['gender']).to eq("male")
60
61
  end
61
62
 
62
63
  it "should raise an error if option not found" do
63
64
  expect do
64
- @session.choose('form[gender]', :option => "hermaphrodite")
65
+ @session.choose('form[gender]', option: "hermaphrodite")
65
66
  end.to raise_error(Capybara::ElementNotFound)
66
67
  end
67
68
  end
69
+
70
+ context "with hidden radio buttons" do
71
+ context "with Capybara.automatic_label_click == true" do
72
+ around do |spec|
73
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
74
+ spec.run
75
+ Capybara.automatic_label_click = old_click_label
76
+ end
77
+
78
+ it "should select by clicking the link if available" do
79
+ @session.choose("party_democrat")
80
+ @session.click_button('awesome')
81
+ expect(extract_results(@session)['party']).to eq('democrat')
82
+ end
83
+
84
+ 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
+ end
87
+ end
88
+ end
89
+
90
+ it "should return the chosen radio button" do
91
+ el = @session.find(:radio_button, 'gender_male')
92
+ expect(@session.choose("gender_male")).to eq el
93
+ end
68
94
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#click_button' do
2
3
  before do
3
4
  @session.visit('/form')
4
5
  end
5
6
 
6
- it "should wait for asynchronous load", :requires => [:js] do
7
+ it "should wait for asynchronous load", requires: [:js] do
7
8
  @session.visit('/with_js')
8
9
  @session.click_link('Click me')
9
10
  @session.click_button('New Here')
@@ -337,9 +338,22 @@ Capybara::SpecHelper.spec '#click_button' do
337
338
  expect(extract_results(@session)['first_name']).to eq('John')
338
339
  end
339
340
  end
341
+
342
+ context "with descendant image alt given on a button defined by <button> tag" do
343
+ it "should submit the associated form" do
344
+ @session.click_button('A horse eating hay')
345
+ expect(extract_results(@session)['first_name']).to eq('John')
346
+ end
347
+
348
+ it "should work with partial matches" do
349
+ @session.click_button('se eating h')
350
+ expect(extract_results(@session)['first_name']).to eq('John')
351
+ end
352
+ end
353
+
340
354
  context "with a locator that doesn't exist" do
341
355
  it "should raise an error" do
342
- msg = "Unable to find button \"does not exist\""
356
+ msg = "Unable to find visible button \"does not exist\""
343
357
  expect do
344
358
  @session.click_button('does not exist')
345
359
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -412,12 +426,9 @@ Capybara::SpecHelper.spec '#click_button' do
412
426
  @session.visit('/form')
413
427
  @session.fill_in('address1_city', :with =>'Paris')
414
428
  @session.fill_in('address1_street', :with =>'CDG')
415
- @session.fill_in('address1_street', :with =>'CDG')
416
- @session.select("France", :from => 'address1_country')
417
429
 
418
- @session.fill_in('address2_city', :with => 'Mikolaiv')
419
- @session.fill_in('address2_street', :with => 'PGS')
420
- @session.select("Ukraine", :from => 'address2_country')
430
+ @session.fill_in('address2_city', with: 'Mikolaiv')
431
+ @session.fill_in('address2_street', with: 'PGS')
421
432
 
422
433
  @session.click_button "awesome"
423
434
 
@@ -435,13 +446,13 @@ Capybara::SpecHelper.spec '#click_button' do
435
446
 
436
447
  context "with :exact option" do
437
448
  it "should accept partial matches when false" do
438
- @session.click_button('What an Awesome', :exact => false)
449
+ @session.click_button('What an Awesome', exact: false)
439
450
  expect(extract_results(@session)['first_name']).to eq('John')
440
451
  end
441
452
 
442
453
  it "should not accept partial matches when true" do
443
454
  expect do
444
- @session.click_button('What an Awesome', :exact => true)
455
+ @session.click_button('What an Awesome', exact: true)
445
456
  end.to raise_error(Capybara::ElementNotFound)
446
457
  end
447
458
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#click_link_or_button' do
2
3
  it "should click on a link" do
3
4
  @session.visit('/with_html')
@@ -23,7 +24,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
23
24
  expect(extract_results(@session)['first_name']).to eq('John')
24
25
  end
25
26
 
26
- it "should wait for asynchronous load", :requires => [:js] do
27
+ it "should wait for asynchronous load", requires: [:js] do
27
28
  @session.visit('/with_js')
28
29
  @session.click_link('Click me')
29
30
  @session.click_link_or_button('Has been clicked')
@@ -39,7 +40,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
39
40
  context "when `true`" do
40
41
  it "clicks on approximately matching link" do
41
42
  @session.visit('/with_html')
42
- @session.click_link_or_button('abore', :exact => false)
43
+ @session.click_link_or_button('abore', exact: false)
43
44
  expect(@session).to have_content('Bar')
44
45
  end
45
46
 
@@ -53,18 +54,18 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
53
54
  context "when `false`" do
54
55
  it "does not click on link which matches approximately" do
55
56
  @session.visit('/with_html')
56
- msg = "Unable to find link or button \"abore\""
57
+ msg = "Unable to find visible link or button \"abore\""
57
58
  expect do
58
- @session.click_link_or_button('abore', :exact => true)
59
+ @session.click_link_or_button('abore', exact: true)
59
60
  end.to raise_error(Capybara::ElementNotFound, msg)
60
61
  end
61
62
 
62
63
  it "does not click on approximately matching button" do
63
64
  @session.visit('/form')
64
- msg = "Unable to find link or button \"awe\""
65
+ msg = "Unable to find visible link or button \"awe\""
65
66
 
66
67
  expect do
67
- @session.click_link_or_button('awe', :exact => true)
68
+ @session.click_link_or_button('awe', exact: true)
68
69
  end.to raise_error(Capybara::ElementNotFound, msg)
69
70
  end
70
71
  end
@@ -73,7 +74,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
73
74
  context "with a locator that doesn't exist" do
74
75
  it "should raise an error" do
75
76
  @session.visit('/with_html')
76
- msg = "Unable to find link or button \"does not exist\""
77
+ msg = "Unable to find visible link or button \"does not exist\""
77
78
  expect do
78
79
  @session.click_link_or_button('does not exist')
79
80
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -84,7 +85,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
84
85
  it "ignores disabled buttons when false" do
85
86
  @session.visit('/form')
86
87
  expect do
87
- @session.click_link_or_button('Disabled button', :disabled => false)
88
+ @session.click_link_or_button('Disabled button', disabled: false)
88
89
  end.to raise_error(Capybara::ElementNotFound)
89
90
  end
90
91
 
@@ -104,9 +105,14 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
104
105
  it "does nothing when button is disabled" do
105
106
  @session.visit('/form')
106
107
  expect do
107
- @session.click_link_or_button('Disabled button', :disabled => false)
108
+ @session.click_link_or_button('Disabled button', disabled: false)
108
109
  end.to raise_error(Capybara::ElementNotFound)
109
110
  end
111
+ end
110
112
 
113
+ it "should return the element clicked" do
114
+ @session.visit('/with_html')
115
+ link = @session.find(:link, 'Blank Anchor')
116
+ expect(@session.click_link_or_button('Blank Anchor')).to eq link
111
117
  end
112
118
  end
@@ -1,9 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#click_link' do
2
3
  before do
3
4
  @session.visit('/with_html')
4
5
  end
5
6
 
6
- it "should wait for asynchronous load", :requires => [:js] do
7
+ it "should wait for asynchronous load", requires: [:js] do
7
8
  @session.visit('/with_js')
8
9
  @session.click_link('Click me')
9
10
  @session.click_link('Has been clicked')
@@ -14,7 +15,7 @@ Capybara::SpecHelper.spec '#click_link' do
14
15
  expect(@session).to have_content('Another World')
15
16
  end
16
17
 
17
- it "raises any errors caught inside the server", :requires => [:server] do
18
+ it "raises any errors caught inside the server", requires: [:server] do
18
19
  quietly { @session.visit("/error") }
19
20
  expect do
20
21
  @session.click_link('foo')
@@ -66,7 +67,7 @@ Capybara::SpecHelper.spec '#click_link' do
66
67
 
67
68
  context "with a locator that doesn't exist" do
68
69
  it "should raise an error" do
69
- msg = "Unable to find link \"does not exist\""
70
+ msg = "Unable to find visible link \"does not exist\""
70
71
  expect do
71
72
  @session.click_link('does not exist')
72
73
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -75,34 +76,45 @@ Capybara::SpecHelper.spec '#click_link' do
75
76
 
76
77
  context "with :href option given" do
77
78
  it "should find links with valid href" do
78
- @session.click_link('labore', :href => '/with_simple_html')
79
+ @session.click_link('labore', href: '/with_simple_html')
79
80
  expect(@session).to have_content('Bar')
80
81
  end
81
82
 
82
83
  it "should raise error if link wasn't found" do
83
- expect { @session.click_link('labore', :href => 'invalid_href') }.to raise_error(Capybara::ElementNotFound)
84
+ expect { @session.click_link('labore', href: 'invalid_href') }.to raise_error(Capybara::ElementNotFound)
84
85
  end
85
86
  end
86
87
 
87
88
  context "with a regex :href option given" do
88
89
  it "should find a link matching an all-matching regex pattern" do
89
- @session.click_link('labore', :href => /.+/)
90
+ @session.click_link('labore', href: /.+/)
90
91
  expect(@session).to have_content('Bar')
91
92
  end
92
93
 
93
94
  it "should find a link matching an exact regex pattern" do
94
- @session.click_link('labore', :href => /\/with_simple_html/)
95
+ @session.click_link('labore', href: /\/with_simple_html/)
95
96
  expect(@session).to have_content('Bar')
96
97
  end
97
98
 
98
99
  it "should find a link matching a partial regex pattern" do
99
- @session.click_link('labore', :href => /\/with_simple/)
100
+ @session.click_link('labore', href: /\/with_simple/)
100
101
  expect(@session).to have_content('Bar')
101
102
  end
102
103
 
103
104
  it "should raise an error if no link's href matched the pattern" do
104
- expect { @session.click_link('labore', :href => /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound)
105
- expect { @session.click_link('labore', :href => /.+d+/) }.to raise_error(Capybara::ElementNotFound)
105
+ expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound)
106
+ expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound)
107
+ end
108
+
109
+ context 'href: nil' do
110
+ it "should not raise an error on links with no href attribute" do
111
+ expect { @session.click_link('No Href', href: nil) }.not_to raise_error
112
+ end
113
+
114
+ it "should raise an error if href attribute exists" do
115
+ expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound)
116
+ expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound)
117
+ end
106
118
  end
107
119
  end
108
120
 
@@ -134,7 +146,7 @@ Capybara::SpecHelper.spec '#click_link' do
134
146
  end
135
147
 
136
148
  it "should do nothing on anchor links" do
137
- @session.fill_in("test_field", :with => 'blah')
149
+ @session.fill_in("test_field", with: 'blah')
138
150
  @session.click_link('Normal Anchor')
139
151
  expect(@session.find_field("test_field").value).to eq('blah')
140
152
  @session.click_link('Blank Anchor')
@@ -144,7 +156,7 @@ Capybara::SpecHelper.spec '#click_link' do
144
156
  end
145
157
 
146
158
  it "should do nothing on URL+anchor links for the same page" do
147
- @session.fill_in("test_field", :with => 'blah')
159
+ @session.fill_in("test_field", with: 'blah')
148
160
  @session.click_link('Anchor on same page')
149
161
  expect(@session.find_field("test_field").value).to eq('blah')
150
162
  end
@@ -160,7 +172,7 @@ Capybara::SpecHelper.spec '#click_link' do
160
172
  expect(@session).to have_content('Bar')
161
173
  end
162
174
 
163
- it "raise an error with links with no href" do
175
+ it "should raise an error with links with no href" do
164
176
  expect do
165
177
  @session.click_link('No Href')
166
178
  end.to raise_error(Capybara::ElementNotFound)
@@ -168,14 +180,26 @@ Capybara::SpecHelper.spec '#click_link' do
168
180
 
169
181
  context "with :exact option" do
170
182
  it "should accept partial matches when false" do
171
- @session.click_link('abo', :exact => false)
183
+ @session.click_link('abo', exact: false)
172
184
  expect(@session).to have_content('Bar')
173
185
  end
174
186
 
175
187
  it "should not accept partial matches when true" do
176
188
  expect do
177
- @session.click_link('abo', :exact => true)
189
+ @session.click_link('abo', exact: true)
178
190
  end.to raise_error(Capybara::ElementNotFound)
179
191
  end
180
192
  end
193
+
194
+ context "without locator" do
195
+ it "uses options" do
196
+ @session.click_link(href: '/foo')
197
+ expect(@session).to have_content('Another World')
198
+ end
199
+ end
200
+
201
+ it "should return element clicked" do
202
+ el = @session.find(:link, 'Normal Anchor')
203
+ expect(@session.click_link('Normal Anchor')).to eq el
204
+ end
181
205
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#current_scope' do
2
3
  before do
3
4
  @session.visit('/with_scope')
@@ -26,4 +27,4 @@ Capybara::SpecHelper.spec '#current_scope' do
26
27
  end
27
28
  end
28
29
  end
29
- end
30
+ end
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  require "capybara/spec/test_app"
2
3
 
3
4
  Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
4
5
  before :all do
5
- @servers = 2.times.map { Capybara::Server.new(TestApp.clone).boot }
6
+ @servers = 2.times.map { Capybara::Server.new(TestApp.new).boot }
6
7
  # sanity check
7
8
  expect(@servers[0].port).not_to eq(@servers[1].port)
8
9
  expect(@servers.map { |s| s.port }).not_to include 80
@@ -84,15 +85,23 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
84
85
  should_be_on 0, "/landed"
85
86
  end
86
87
 
87
- it "is affected by pushState", :requires => [:js] do
88
+ it "is affected by pushState", requires: [:js] do
88
89
  @session.visit("/with_js")
89
90
  @session.execute_script("window.history.pushState({}, '', '/pushed')")
90
91
  expect(@session.current_path).to eq("/pushed")
91
92
  end
92
93
 
93
- it "is affected by replaceState", :requires => [:js] do
94
+ it "is affected by replaceState", requires: [:js] do
94
95
  @session.visit("/with_js")
95
96
  @session.execute_script("window.history.replaceState({}, '', '/replaced')")
96
97
  expect(@session.current_path).to eq("/replaced")
97
98
  end
99
+
100
+ it "doesn't raise exception on a nil current_url" do
101
+ skip "Only makes sense when there is a real driver" unless @session.respond_to?(:driver)
102
+ allow(@session.driver).to receive(:current_url) { nil }
103
+ @session.visit("/")
104
+ expect { @session.current_url }.not_to raise_exception
105
+ expect { @session.current_path }.not_to raise_exception
106
+ end
98
107
  end
@@ -1,4 +1,5 @@
1
- Capybara::SpecHelper.spec '#dismiss_confirm', :requires => [:modals] do
1
+ # frozen_string_literal: true
2
+ Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
2
3
  before do
3
4
  @session.visit('/with_js')
4
5
  end
@@ -9,14 +10,14 @@ Capybara::SpecHelper.spec '#dismiss_confirm', :requires => [:modals] do
9
10
  end
10
11
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
11
12
  end
12
-
13
+
13
14
  it "should dismiss the confirm if the message matches" do
14
15
  @session.dismiss_confirm 'Confirm opened' do
15
16
  @session.click_link('Open confirm')
16
17
  end
17
18
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
18
19
  end
19
-
20
+
20
21
  it "should not dismiss the confirm if the message doesn't match" do
21
22
  expect do
22
23
  @session.dismiss_confirm 'Incorrect Text' do
@@ -24,7 +25,7 @@ Capybara::SpecHelper.spec '#dismiss_confirm', :requires => [:modals] do
24
25
  end
25
26
  end.to raise_error(Capybara::ModalNotFound)
26
27
  end
27
-
28
+
28
29
 
29
30
  it "should return the message presented" do
30
31
  message = @session.dismiss_confirm do
@@ -32,4 +33,4 @@ Capybara::SpecHelper.spec '#dismiss_confirm', :requires => [:modals] do
32
33
  end
33
34
  expect(message).to eq('Confirm opened')
34
35
  end
35
- end
36
+ end
@@ -1,4 +1,5 @@
1
- Capybara::SpecHelper.spec '#dismiss_prompt', :requires => [:modals] do
1
+ # frozen_string_literal: true
2
+ Capybara::SpecHelper.spec '#dismiss_prompt', requires: [:modals] do
2
3
  before do
3
4
  @session.visit('/with_js')
4
5
  end
@@ -9,11 +10,11 @@ Capybara::SpecHelper.spec '#dismiss_prompt', :requires => [:modals] do
9
10
  end
10
11
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='dismissed']")
11
12
  end
12
-
13
+
13
14
  it "should return the message presented" do
14
15
  message = @session.dismiss_prompt do
15
16
  @session.click_link('Open prompt')
16
17
  end
17
18
  expect(message).to eq('Prompt opened')
18
19
  end
19
- end
20
+ end
@@ -0,0 +1,36 @@
1
+ Capybara::SpecHelper.spec '#assert_matches_selector' do
2
+ before do
3
+ @session.visit('/with_html')
4
+ @element = @session.find(:css, 'span', text: '42')
5
+ end
6
+
7
+ it "should be true if the given selector matches the element" do
8
+ expect(@element.assert_matches_selector(:css, '.number')).to be true
9
+ end
10
+
11
+ it "should be false if the given selector does not match the element" do
12
+ expect { @element.assert_matches_selector(:css, '.not_number') }.to raise_error(Capybara::ElementNotFound)
13
+ end
14
+
15
+ it "should not be callable on the session" do
16
+ expect { @session.assert_matches_selector(:css, '.number') }.to raise_error(NoMethodError)
17
+ end
18
+
19
+ it "should wait for match to occur", requires: [:js] do
20
+ @session.visit('/with_js')
21
+ input = @session.find(:css, '#disable-on-click')
22
+
23
+ expect(input.assert_matches_selector(:css, 'input:enabled')).to be true
24
+ input.click
25
+ expect(input.assert_matches_selector(:css, 'input:disabled')).to be true
26
+ end
27
+
28
+ it "should not accept count options" do
29
+ expect { @element.assert_matches_selector(:css, '.number', count: 1) }.to raise_error(ArgumentError)
30
+ end
31
+
32
+ it "should accept a filter block" do
33
+ @element.assert_matches_selector(:css, 'span') { |el| el[:class] == "number" }
34
+ @element.assert_not_matches_selector(:css,'span') { |el| el[:class] == "not_number" }
35
+ end
36
+ end
@@ -0,0 +1,23 @@
1
+ Capybara::SpecHelper.spec '#match_css?' do
2
+ before do
3
+ @session.visit('/with_html')
4
+ @element = @session.find(:css, 'span', text: '42')
5
+ end
6
+
7
+ it "should be true if the given selector matches the element" do
8
+ expect(@element).to match_css("span")
9
+ expect(@element).to match_css("span.number")
10
+ end
11
+
12
+ it "should be false if the given selector does not match" do
13
+ expect(@element).not_to match_css("div")
14
+ expect(@element).not_to match_css("p a#doesnotexist")
15
+ expect(@element).not_to match_css("p.nosuchclass")
16
+ end
17
+
18
+ it "should accept an optional filter block" do
19
+ # This would be better done with
20
+ expect(@element).to match_css('span') { |el| el[:class] == "number" }
21
+ expect(@element).not_to match_css('span') { |el| el[:class] == "not_number" }
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ Capybara::SpecHelper.spec '#match_xpath?' do
2
+ before do
3
+ @session.visit('/with_html')
4
+ @element = @session.find(:css, 'span.number')
5
+ end
6
+
7
+ it "should be true if the given selector is on the page" do
8
+ expect(@element).to match_xpath("//span")
9
+ expect(@element).to match_xpath("//span[@class='number']")
10
+ end
11
+
12
+ it "should be false if the given selector is not on the page" do
13
+ expect(@element).not_to match_xpath("//abbr")
14
+ expect(@element).not_to match_xpath("//div")
15
+ expect(@element).not_to match_xpath("//span[@class='not_a_number']")
16
+ end
17
+
18
+ it "should use xpath even if default selector is CSS" do
19
+ Capybara.default_selector = :css
20
+ expect(@element).not_to have_xpath("//span[@class='not_a_number']")
21
+ expect(@element).not_to have_xpath("//div[@class='number']")
22
+ end
23
+ end
@@ -0,0 +1,106 @@
1
+ Capybara::SpecHelper.spec '#match_selector?' do
2
+ before do
3
+ @session.visit('/with_html')
4
+ @element = @session.find('//span', text: '42')
5
+ end
6
+
7
+ it "should be true if the element matches the given selector" do
8
+ expect(@element).to match_selector(:xpath, "//span")
9
+ expect(@element).to match_selector(:css, 'span.number')
10
+ expect(@element.matches_selector?(:css, 'span.number')).to be true
11
+ end
12
+
13
+ it "should be false if the element does not match the given selector" do
14
+ expect(@element).not_to match_selector(:xpath, "//div")
15
+ expect(@element).not_to match_selector(:css, "span.not_a_number")
16
+ expect(@element.matches_selector?(:css, "span.not_a_number")).to be false
17
+ end
18
+
19
+ it "should use default selector" do
20
+ Capybara.default_selector = :css
21
+ expect(@element).not_to match_selector("span.not_a_number")
22
+ expect(@element).to match_selector("span.number")
23
+ end
24
+
25
+ context "with text" do
26
+ it "should discard all matches where the given string is not contained" do
27
+ expect(@element).to match_selector("//span", text: "42")
28
+ expect(@element).not_to match_selector("//span", text: "Doesnotexist")
29
+ end
30
+ end
31
+
32
+ it "should have css sugar" do
33
+ expect(@element.matches_css?('span.number')).to be true
34
+ expect(@element.matches_css?('span.not_a_number')).to be false
35
+ expect(@element.matches_css?('span.number', text: "42")).to be true
36
+ expect(@element.matches_css?('span.number', text: "Nope")).to be false
37
+ end
38
+
39
+ it "should have xpath sugar" do
40
+ expect(@element.matches_xpath?("//span")).to be true
41
+ expect(@element.matches_xpath?("//div")).to be false
42
+ expect(@element.matches_xpath?("//span", text: '42')).to be true
43
+ expect(@element.matches_xpath?("//span", text: 'Nope')).to be false
44
+ end
45
+
46
+ it 'should accept selector filters' do
47
+ @session.visit('/form')
48
+ cbox = @session.find(:css, '#form_pets_dog')
49
+ expect(cbox.matches_selector?(:checkbox, id: 'form_pets_dog', option: 'dog', name: 'form[pets][]', checked: true)).to be true
50
+ end
51
+
52
+ it 'should accept a custom filter block' do
53
+ @session.visit('/form')
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
59
+ end
60
+ end
61
+
62
+ Capybara::SpecHelper.spec '#not_matches_selector?' do
63
+ before do
64
+ @session.visit('/with_html')
65
+ @element = @session.find(:css, "span", text: 42)
66
+ end
67
+
68
+ it "should be false if the given selector matches the element" do
69
+ expect(@element).not_to not_match_selector(:xpath, "//span")
70
+ expect(@element).not_to not_match_selector(:css, "span.number")
71
+ expect(@element.not_matches_selector?(:css, "span.number")).to be false
72
+ end
73
+
74
+ it "should be true if the given selector does not match the element" do
75
+ expect(@element).to not_match_selector(:xpath, "//abbr")
76
+ expect(@element).to not_match_selector(:css, "p a#doesnotexist")
77
+ expect(@element.not_matches_selector?(:css, "p a#doesnotexist")).to be true
78
+ end
79
+
80
+ it "should use default selector" do
81
+ Capybara.default_selector = :css
82
+ expect(@element).to not_match_selector("p a#doesnotexist")
83
+ expect(@element).not_to not_match_selector("span.number")
84
+ end
85
+
86
+ context "with text" do
87
+ it "should discard all matches where the given string is contained" do
88
+ expect(@element).not_to not_match_selector(:css, "span.number", text: "42")
89
+ expect(@element).to not_match_selector(:css, "span.number", text: "Doesnotexist")
90
+ end
91
+ end
92
+
93
+ it "should have CSS sugar" do
94
+ expect(@element.not_matches_css?("span.number")).to be false
95
+ expect(@element.not_matches_css?("p a#doesnotexist")).to be true
96
+ expect(@element.not_matches_css?("span.number", text: "42")).to be false
97
+ expect(@element.not_matches_css?("span.number", text: "Doesnotexist")).to be true
98
+ end
99
+
100
+ it "should have xpath sugar" do
101
+ expect(@element.not_matches_xpath?("//span")).to be false
102
+ expect(@element.not_matches_xpath?("//div")).to be true
103
+ expect(@element.not_matches_xpath?("//span", text: "42")).to be false
104
+ expect(@element.not_matches_xpath?("//span", text: "Doesnotexist")).to be true
105
+ end
106
+ end if Gem::Version.new(RSpec::Expectations::Version::STRING) >= Gem::Version.new('3.1')