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
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ Capybara::SpecHelper.spec "#evaluate_async_script", requires: [:js] do
3
+ it "should evaluate the given script and return whatever it produces" do
4
+ @session.visit('/with_js')
5
+ expect(@session.evaluate_async_script("arguments[0](4)")).to eq(4)
6
+ end
7
+
8
+ it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
9
+ @session.visit('/with_js')
10
+ el = @session.find(:css, '#drag p')
11
+ result = @session.evaluate_async_script("arguments[2]([arguments[0].innerText, arguments[1]])", el, "Doodle Funk")
12
+ expect(result).to eq ["This is a draggable element.", "Doodle Funk"]
13
+ end
14
+
15
+ it "should support returning elements after asynchronous operation", requires: [:js, :es_args] do
16
+ @session.visit('/with_js')
17
+ @session.find(:css, '#change') # ensure page has loaded and element is available
18
+ el = @session.evaluate_async_script("var cb = arguments[0]; setTimeout(function(){ cb(document.getElementById('change')) }, 100)")
19
+ expect(el).to be_instance_of(Capybara::Node::Element)
20
+ expect(el).to eq(@session.find(:css, '#change'))
21
+ end
22
+ end
@@ -1,6 +1,28 @@
1
- Capybara::SpecHelper.spec "#evaluate_script", :requires => [:js] do
1
+ # frozen_string_literal: true
2
+ Capybara::SpecHelper.spec "#evaluate_script", requires: [:js] do
2
3
  it "should evaluate the given script and return whatever it produces" do
3
4
  @session.visit('/with_js')
4
5
  expect(@session.evaluate_script("1+3")).to eq(4)
5
6
  end
7
+
8
+ it "should pass arguments to the script", requires: [:js, :es_args] do
9
+ @session.visit('/with_js')
10
+ @session.evaluate_script("document.getElementById('change').textContent = arguments[0]", "Doodle Funk")
11
+ expect(@session).to have_css('#change', text: 'Doodle Funk')
12
+ end
13
+
14
+ it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
15
+ @session.visit('/with_js')
16
+ el = @session.find(:css, '#change')
17
+ @session.evaluate_script("arguments[0].textContent = arguments[1]", el, "Doodle Funk")
18
+ expect(@session).to have_css('#change', text: 'Doodle Funk')
19
+ end
20
+
21
+ it "should support returning elements", requires: [:js, :es_args] do
22
+ @session.visit('/with_js')
23
+ @session.find(:css, '#change') # ensure page has loaded and element is available
24
+ el = @session.evaluate_script("document.getElementById('change')")
25
+ expect(el).to be_instance_of(Capybara::Node::Element)
26
+ expect(el).to eq(@session.find(:css, '#change'))
27
+ end
6
28
  end
@@ -1,7 +1,26 @@
1
- Capybara::SpecHelper.spec "#execute_script", :requires => [:js] do
1
+ # frozen_string_literal: true
2
+ Capybara::SpecHelper.spec "#execute_script", requires: [:js] do
2
3
  it "should execute the given script and return nothing" do
3
4
  @session.visit('/with_js')
4
- expect(@session.execute_script("$('#change').text('Funky Doodle')")).to be_nil
5
- expect(@session).to have_css('#change', :text => 'Funky Doodle')
5
+ expect(@session.execute_script("document.getElementById('change').textContent = 'Funky Doodle'")).to be_nil
6
+ expect(@session).to have_css('#change', text: 'Funky Doodle')
7
+ end
8
+
9
+ it "should be able to call functions defined in the page" do
10
+ @session.visit('/with_js')
11
+ expect{ @session.execute_script("$('#change').text('Funky Doodle')") }.not_to raise_error
12
+ end
13
+
14
+ it "should pass arguments to the script", requires: [:js, :es_args] do
15
+ @session.visit('/with_js')
16
+ @session.execute_script("document.getElementById('change').textContent = arguments[0]", "Doodle Funk")
17
+ expect(@session).to have_css('#change', text: 'Doodle Funk')
18
+ end
19
+
20
+ it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
21
+ @session.visit('/with_js')
22
+ el = @session.find(:css, '#change')
23
+ @session.execute_script("arguments[1].textContent = arguments[0]", "Doodle Funk", el)
24
+ expect(@session).to have_css('#change', text: 'Doodle Funk')
6
25
  end
7
26
  end
@@ -1,141 +1,154 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec "#fill_in" do
2
3
  before do
3
4
  @session.visit('/form')
4
5
  end
5
6
 
6
7
  it "should fill in a text field by id" do
7
- @session.fill_in('form_first_name', :with => 'Harry')
8
+ @session.fill_in('form_first_name', with: 'Harry')
8
9
  @session.click_button('awesome')
9
10
  expect(extract_results(@session)['first_name']).to eq('Harry')
10
11
  end
11
12
 
12
13
  it "should fill in a text field by name" do
13
- @session.fill_in('form[last_name]', :with => 'Green')
14
+ @session.fill_in('form[last_name]', with: 'Green')
14
15
  @session.click_button('awesome')
15
16
  expect(extract_results(@session)['last_name']).to eq('Green')
16
17
  end
17
18
 
18
19
  it "should fill in a text field by label without for" do
19
- @session.fill_in('First Name', :with => 'Harry')
20
+ @session.fill_in('First Name', with: 'Harry')
20
21
  @session.click_button('awesome')
21
22
  expect(extract_results(@session)['first_name']).to eq('Harry')
22
23
  end
23
24
 
24
25
  it "should fill in a url field by label without for" do
25
- @session.fill_in('Html5 Url', :with => 'http://www.avenueq.com')
26
+ @session.fill_in('Html5 Url', with: 'http://www.avenueq.com')
26
27
  @session.click_button('html5_submit')
27
28
  expect(extract_results(@session)['html5_url']).to eq('http://www.avenueq.com')
28
29
  end
29
30
 
30
31
  it "should fill in a textarea by id" do
31
- @session.fill_in('form_description', :with => 'Texty text')
32
+ @session.fill_in('form_description', with: 'Texty text')
32
33
  @session.click_button('awesome')
33
34
  expect(extract_results(@session)['description']).to eq('Texty text')
34
35
  end
35
36
 
36
37
  it "should fill in a textarea by label" do
37
- @session.fill_in('Description', :with => 'Texty text')
38
+ @session.fill_in('Description', with: 'Texty text')
38
39
  @session.click_button('awesome')
39
40
  expect(extract_results(@session)['description']).to eq('Texty text')
40
41
  end
41
42
 
42
43
  it "should fill in a textarea by name" do
43
- @session.fill_in('form[description]', :with => 'Texty text')
44
+ @session.fill_in('form[description]', with: 'Texty text')
44
45
  @session.click_button('awesome')
45
46
  expect(extract_results(@session)['description']).to eq('Texty text')
46
47
  end
47
48
 
48
49
  it "should fill in a password field by id" do
49
- @session.fill_in('form_password', :with => 'supasikrit')
50
+ @session.fill_in('form_password', with: 'supasikrit')
50
51
  @session.click_button('awesome')
51
52
  expect(extract_results(@session)['password']).to eq('supasikrit')
52
53
  end
53
54
 
54
55
  it "should handle HTML in a textarea" do
55
- @session.fill_in('form_description', :with => 'is <strong>very</strong> secret!')
56
+ @session.fill_in('form_description', with: 'is <strong>very</strong> secret!')
56
57
  @session.click_button('awesome')
57
58
  expect(extract_results(@session)['description']).to eq('is <strong>very</strong> secret!')
58
59
  end
59
60
 
60
61
  it "should handle newlines in a textarea" do
61
- @session.fill_in('form_description', :with => "\nSome text\n")
62
+ @session.fill_in('form_description', with: "\nSome text\n")
62
63
  @session.click_button('awesome')
63
64
  expect(extract_results(@session)['description']).to eq("\r\nSome text\r\n")
64
65
  end
65
66
 
66
67
  it "should fill in a field with a custom type" do
67
- @session.fill_in('Schmooo', :with => 'Schmooo is the game')
68
+ @session.fill_in('Schmooo', with: 'Schmooo is the game')
68
69
  @session.click_button('awesome')
69
70
  expect(extract_results(@session)['schmooo']).to eq('Schmooo is the game')
70
71
  end
71
72
 
72
73
  it "should fill in a field without a type" do
73
- @session.fill_in('Phone', :with => '+1 555 7022')
74
+ @session.fill_in('Phone', with: '+1 555 7022')
74
75
  @session.click_button('awesome')
75
76
  expect(extract_results(@session)['phone']).to eq('+1 555 7022')
76
77
  end
77
78
 
78
79
  it "should fill in a text field respecting its maxlength attribute" do
79
- @session.fill_in('Zipcode', :with => '52071350')
80
+ @session.fill_in('Zipcode', with: '52071350')
80
81
  @session.click_button('awesome')
81
82
  expect(extract_results(@session)['zipcode']).to eq('52071')
82
83
  end
83
84
 
84
85
  it "should fill in a password field by name" do
85
- @session.fill_in('form[password]', :with => 'supasikrit')
86
+ @session.fill_in('form[password]', with: 'supasikrit')
86
87
  @session.click_button('awesome')
87
88
  expect(extract_results(@session)['password']).to eq('supasikrit')
88
89
  end
89
90
 
90
91
  it "should fill in a password field by label" do
91
- @session.fill_in('Password', :with => 'supasikrit')
92
+ @session.fill_in('Password', with: 'supasikrit')
92
93
  @session.click_button('awesome')
93
94
  expect(extract_results(@session)['password']).to eq('supasikrit')
94
95
  end
95
96
 
96
97
  it "should fill in a password field by name" do
97
- @session.fill_in('form[password]', :with => 'supasikrit')
98
+ @session.fill_in('form[password]', with: 'supasikrit')
98
99
  @session.click_button('awesome')
99
100
  expect(extract_results(@session)['password']).to eq('supasikrit')
100
101
  end
101
102
 
103
+ it "should fill in a field based on current value" do
104
+ @session.fill_in(currently_with: 'John', with: 'Thomas')
105
+ @session.click_button('awesome')
106
+ expect(extract_results(@session)['first_name']).to eq('Thomas')
107
+ end
108
+
109
+ it "should fill in a field based on type" do
110
+ @session.fill_in(type: 'schmooo', with: 'Schmooo for all')
111
+ @session.click_button('awesome')
112
+ expect(extract_results(@session)['schmooo']).to eq('Schmooo for all')
113
+ end
114
+
102
115
  it "should throw an exception if a hash containing 'with' is not provided" do
103
116
  expect {@session.fill_in 'Name', 'ignu'}.to raise_error(RuntimeError, /with/)
104
117
  end
105
118
 
106
- it "should wait for asynchronous load", :requires => [:js] do
119
+ it "should wait for asynchronous load", requires: [:js] do
107
120
  @session.visit('/with_js')
108
121
  @session.click_link('Click me')
109
- @session.fill_in('new_field', :with => 'Testing...')
122
+ @session.fill_in('new_field', with: 'Testing...')
110
123
  end
111
124
 
112
125
  it "casts to string" do
113
- @session.fill_in(:'form_first_name', :with => :'Harry')
126
+ @session.fill_in(:'form_first_name', with: :'Harry')
114
127
  @session.click_button('awesome')
115
128
  expect(extract_results(@session)['first_name']).to eq('Harry')
116
129
  end
117
130
 
118
131
  it "casts to string if field has maxlength" do
119
- @session.fill_in(:'form_zipcode', :with => 1234567)
132
+ @session.fill_in(:'form_zipcode', with: 1234567)
120
133
  @session.click_button('awesome')
121
134
  expect(extract_results(@session)['zipcode']).to eq('12345')
122
135
  end
123
136
 
124
- context 'on a pre-populated textfield with a reformatting onchange', :requires => [:js] do
137
+ context 'on a pre-populated textfield with a reformatting onchange', requires: [:js] do
125
138
  it 'should only trigger onchange once' do
126
139
  @session.visit('/with_js')
127
- @session.fill_in('with_change_event', :with => 'some value')
140
+ @session.fill_in('with_change_event', with: 'some value')
128
141
  # click outside the field to trigger the change event
129
142
  @session.find(:css, 'body').click
130
- expect(@session.find(:css, '.change_event_triggered', :match => :one)).to have_text 'some value'
143
+ expect(@session.find(:css, '.change_event_triggered', match: :one)).to have_text 'some value'
131
144
  end
132
145
 
133
146
  it 'should trigger change when clearing field' do
134
147
  @session.visit('/with_js')
135
- @session.fill_in('with_change_event', :with => '')
148
+ @session.fill_in('with_change_event', with: '')
136
149
  # click outside the field to trigger the change event
137
150
  @session.find(:css, 'body').click
138
- expect(@session).to have_selector(:css, '.change_event_triggered', :match => :one)
151
+ expect(@session).to have_selector(:css, '.change_event_triggered', match: :one)
139
152
  end
140
153
  end
141
154
 
@@ -143,18 +156,18 @@ Capybara::SpecHelper.spec "#fill_in" do
143
156
  before { Capybara.ignore_hidden_elements = true }
144
157
  after { Capybara.ignore_hidden_elements = false }
145
158
  it "should not find a hidden field" do
146
- msg = "Unable to find field \"Super Secret\""
159
+ msg = "Unable to find visible field \"Super Secret\" that is not disabled"
147
160
  expect do
148
- @session.fill_in('Super Secret', :with => '777')
161
+ @session.fill_in('Super Secret', with: '777')
149
162
  end.to raise_error(Capybara::ElementNotFound, msg)
150
163
  end
151
164
  end
152
165
 
153
166
  context "with a locator that doesn't exist" do
154
167
  it "should raise an error" do
155
- msg = "Unable to find field \"does not exist\""
168
+ msg = "Unable to find visible field \"does not exist\" that is not disabled"
156
169
  expect do
157
- @session.fill_in('does not exist', :with => 'Blah blah')
170
+ @session.fill_in('does not exist', with: 'Blah blah')
158
171
  end.to raise_error(Capybara::ElementNotFound, msg)
159
172
  end
160
173
  end
@@ -162,22 +175,27 @@ Capybara::SpecHelper.spec "#fill_in" do
162
175
  context "on a disabled field" do
163
176
  it "should raise an error" do
164
177
  expect do
165
- @session.fill_in('Disabled Text Field', :with => 'Blah blah')
178
+ @session.fill_in('Disabled Text Field', with: 'Blah blah')
166
179
  end.to raise_error(Capybara::ElementNotFound)
167
180
  end
168
181
  end
169
182
 
170
183
  context "with :exact option" do
171
184
  it "should accept partial matches when false" do
172
- @session.fill_in("Explanation", :with => "Dude", :exact => false)
185
+ @session.fill_in("Explanation", with: "Dude", exact: false)
173
186
  @session.click_button("awesome")
174
187
  expect(extract_results(@session)["name_explanation"]).to eq("Dude")
175
188
  end
176
189
 
177
190
  it "should not accept partial matches when true" do
178
191
  expect do
179
- @session.fill_in("Explanation", :with => "Dude", :exact => true)
192
+ @session.fill_in("Explanation", with: "Dude", exact: true)
180
193
  end.to raise_error(Capybara::ElementNotFound)
181
194
  end
182
195
  end
196
+
197
+ it "should return the element filled in" do
198
+ el = @session.find(:fillable_field, 'form_first_name')
199
+ expect(@session.fill_in('form_first_name', with: 'Harry')).to eq el
200
+ end
183
201
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#find_button' do
2
3
  before do
3
4
  @session.visit('/form')
@@ -8,6 +9,18 @@ Capybara::SpecHelper.spec '#find_button' do
8
9
  expect(@session.find_button('crap321').value).to eq("crappy")
9
10
  end
10
11
 
12
+ context "aria_label attribute with Capybara.enable_aria_label" do
13
+ it "should find when true" do
14
+ Capybara.enable_aria_label = true
15
+ expect(@session.find_button('Mediocre Button')[:id]).to eq("mediocre")
16
+ end
17
+
18
+ it "should not find when false" do
19
+ Capybara.enable_aria_label = false
20
+ expect { @session.find_button('Mediocre Button') }.to raise_error(Capybara::ElementNotFound)
21
+ end
22
+ end
23
+
11
24
  it "casts to string" do
12
25
  expect(@session.find_button(:'med')[:id]).to eq("mediocre")
13
26
  end
@@ -20,13 +33,41 @@ Capybara::SpecHelper.spec '#find_button' do
20
33
 
21
34
  context "with :exact option" do
22
35
  it "should accept partial matches when false" do
23
- expect(@session.find_button('What an Awesome', :exact => false)[:value]).to eq("awesome")
36
+ expect(@session.find_button('What an Awesome', exact: false).value).to eq("awesome")
24
37
  end
25
38
 
26
39
  it "should not accept partial matches when true" do
27
40
  expect do
28
- @session.find_button('What an Awesome', :exact => true)
41
+ @session.find_button('What an Awesome', exact: true)
29
42
  end.to raise_error(Capybara::ElementNotFound)
30
43
  end
31
44
  end
45
+
46
+ context "with :disabled option" do
47
+ it "should find disabled buttons when true" do
48
+ expect(@session.find_button('Disabled button', disabled: true).value).to eq("Disabled button")
49
+ end
50
+
51
+ it "should not find disabled buttons when false" do
52
+ expect do
53
+ @session.find_button('Disabled button', disabled: false)
54
+ end.to raise_error(Capybara::ElementNotFound)
55
+ end
56
+
57
+ it "should default to not finding disabled buttons" do
58
+ expect do
59
+ @session.find_button('Disabled button')
60
+ end.to raise_error(Capybara::ElementNotFound)
61
+ end
62
+
63
+ it "should find disabled buttons when :all" do
64
+ expect(@session.find_button('Disabled button', disabled: :all).value).to eq("Disabled button")
65
+ end
66
+ end
67
+
68
+ context "without locator" do
69
+ it "should use options" do
70
+ expect(@session.find_button(disabled: true).value).to eq("Disabled button")
71
+ end
72
+ end
32
73
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#find_by_id' do
2
3
  before do
3
4
  @session.visit('/with_html')
@@ -19,12 +20,12 @@ Capybara::SpecHelper.spec '#find_by_id' do
19
20
 
20
21
  context "with :visible option" do
21
22
  it "finds invisible elements when `false`" do
22
- expect(@session.find_by_id("hidden_via_ancestor", :visible => false).text(:all)).to match(/with hidden ancestor/)
23
+ expect(@session.find_by_id("hidden_via_ancestor", visible: false).text(:all)).to match(/with hidden ancestor/)
23
24
  end
24
25
 
25
26
  it "finds invisible elements when `false`" do
26
27
  expect do
27
- @session.find_by_id("hidden_via_ancestor", :visible => true)
28
+ @session.find_by_id("hidden_via_ancestor", visible: true)
28
29
  end.to raise_error(Capybara::ElementNotFound)
29
30
  end
30
31
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#find_field' do
2
3
  before do
3
4
  @session.visit('/form')
@@ -7,6 +8,21 @@ Capybara::SpecHelper.spec '#find_field' do
7
8
  expect(@session.find_field('Dog').value).to eq('dog')
8
9
  expect(@session.find_field('form_description').text).to eq('Descriptive text goes here')
9
10
  expect(@session.find_field('Region')[:name]).to eq('form[region]')
11
+ expect(@session.find_field('With Asterisk*')).to be
12
+ end
13
+
14
+ context "aria_label attribute with Capybara.enable_aria_label" do
15
+ it "should find when true" do
16
+ Capybara.enable_aria_label = true
17
+ expect(@session.find_field('Unlabelled Input')[:name]).to eq('form[which_form]')
18
+ # expect(@session.find_field('Emergency Number')[:id]).to eq('html5_tel')
19
+ end
20
+
21
+ it "should not find when false" do
22
+ Capybara.enable_aria_label = false
23
+ expect { @session.find_field('Unlabelled Input') }.to raise_error(Capybara::ElementNotFound)
24
+ # expect { @session.find_field('Emergency Number') }.to raise_error(Capybara::ElementNotFound)
25
+ end
10
26
  end
11
27
 
12
28
  it "casts to string" do
@@ -21,7 +37,7 @@ Capybara::SpecHelper.spec '#find_field' do
21
37
 
22
38
  it "should warn if filter option is invalid" do
23
39
  expect_any_instance_of(Kernel).to receive(:warn).
24
- with('Invalid value nil passed to filter disabled')
40
+ with('Invalid value nil passed to filter disabled - defaulting to false')
25
41
  @session.find_field('Dog', disabled: nil)
26
42
  end
27
43
 
@@ -34,24 +50,26 @@ Capybara::SpecHelper.spec '#find_field' do
34
50
 
35
51
  context "with :exact option" do
36
52
  it "should accept partial matches when false" do
37
- expect(@session.find_field("Explanation", :exact => false)[:name]).to eq("form[name_explanation]")
53
+ expect(@session.find_field("Explanation", exact: false)[:name]).to eq("form[name_explanation]")
38
54
  end
39
55
 
40
56
  it "should not accept partial matches when true" do
41
57
  expect do
42
- @session.find_field("Explanation", :exact => true)
58
+ @session.find_field("Explanation", exact: true)
43
59
  end.to raise_error(Capybara::ElementNotFound)
44
60
  end
45
61
  end
46
62
 
47
63
  context "with :disabled option" do
48
64
  it "should find disabled fields when true" do
49
- expect(@session.find_field("Disabled Checkbox", :disabled => true)[:name]).to eq("form[disabled_checkbox]")
65
+ expect(@session.find_field("Disabled Checkbox", disabled: true)[:name]).to eq("form[disabled_checkbox]")
66
+ expect(@session.find_field("form_disabled_fieldset_child", disabled: true)[:name]).to eq("form[disabled_fieldset_child]")
67
+ expect(@session.find_field("form_disabled_fieldset_descendant", disabled: true)[:name]).to eq("form[disabled_fieldset_descendant]")
50
68
  end
51
69
 
52
70
  it "should not find disabled fields when false" do
53
71
  expect do
54
- @session.find_field("Disabled Checkbox", :disabled => false)
72
+ @session.find_field("Disabled Checkbox", disabled: false)
55
73
  end.to raise_error(Capybara::ElementNotFound)
56
74
  end
57
75
 
@@ -60,8 +78,15 @@ Capybara::SpecHelper.spec '#find_field' do
60
78
  @session.find_field("Disabled Checkbox")
61
79
  end.to raise_error(Capybara::ElementNotFound)
62
80
  end
63
- end
64
81
 
82
+ it "should find disabled fields when :all" do
83
+ expect(@session.find_field("Disabled Checkbox", disabled: :all)[:name]).to eq("form[disabled_checkbox]")
84
+ end
85
+
86
+ it "should find enabled fields when :all" do
87
+ expect(@session.find_field('Dog', disabled: :all).value).to eq('dog')
88
+ end
89
+ end
65
90
 
66
91
  context 'with :readonly option' do
67
92
  it "should find readonly fields when true" do
@@ -78,4 +103,15 @@ Capybara::SpecHelper.spec '#find_field' do
78
103
  end.to raise_error(Capybara::Ambiguous, /found 2 elements/)
79
104
  end
80
105
  end
106
+
107
+ context 'with no locator' do
108
+ it 'should use options to find the field' do
109
+ expect(@session.find_field(with: 'dog')['id']).to eq "form_pets_dog"
110
+ end
111
+ end
112
+
113
+ it "should accept an optional filter block" do
114
+ # this would be better done with the :with option but this is just a test
115
+ expect(@session.find_field('form[pets][]'){ |node| node.value == 'dog' }[:id]).to eq "form_pets_dog"
116
+ end
81
117
  end
@@ -1,13 +1,26 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#find_link' do
2
3
  before do
3
4
  @session.visit('/with_html')
4
5
  end
5
6
 
6
- it "should find any field" do
7
+ it "should find any link" do
7
8
  expect(@session.find_link('foo').text).to eq("ullamco")
8
9
  expect(@session.find_link('labore')[:href]).to match %r(/with_simple_html$)
9
10
  end
10
11
 
12
+ context "aria_label attribute with Capybara.enable_aria_label" do
13
+ it "should find when true" do
14
+ Capybara.enable_aria_label = true
15
+ expect(@session.find_link('Go to simple')[:href]).to match %r(/with_simple_html$)
16
+ end
17
+
18
+ it "should not find when false" do
19
+ Capybara.enable_aria_label = false
20
+ expect { @session.find_link('Go to simple') }.to raise_error(Capybara::ElementNotFound)
21
+ end
22
+ end
23
+
11
24
  it "casts to string" do
12
25
  expect(@session.find_link(:'foo').text).to eq("ullamco")
13
26
  end
@@ -20,13 +33,19 @@ Capybara::SpecHelper.spec '#find_link' do
20
33
 
21
34
  context "with :exact option" do
22
35
  it "should accept partial matches when false" do
23
- expect(@session.find_link('abo', :exact => false).text).to eq("labore")
36
+ expect(@session.find_link('abo', exact: false).text).to eq("labore")
24
37
  end
25
38
 
26
39
  it "should not accept partial matches when true" do
27
40
  expect do
28
- @session.find_link('abo', :exact => true)
41
+ @session.find_link('abo', exact: true)
29
42
  end.to raise_error(Capybara::ElementNotFound)
30
43
  end
31
44
  end
45
+
46
+ context "without locator" do
47
+ it "should use options" do
48
+ expect(@session.find_link(href: '#anchor').text).to eq "Normal Anchor"
49
+ end
50
+ end
32
51
  end