capybara 2.5.0 → 2.18.0

Sign up to get free protection for your applications and to get access to all the features.
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')