capybara 3.32.2

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 (313) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/History.md +1813 -0
  4. data/License.txt +22 -0
  5. data/README.md +1099 -0
  6. data/lib/capybara.rb +511 -0
  7. data/lib/capybara/config.rb +94 -0
  8. data/lib/capybara/cucumber.rb +27 -0
  9. data/lib/capybara/driver/base.rb +170 -0
  10. data/lib/capybara/driver/node.rb +139 -0
  11. data/lib/capybara/dsl.rb +65 -0
  12. data/lib/capybara/helpers.rb +108 -0
  13. data/lib/capybara/minitest.rb +386 -0
  14. data/lib/capybara/minitest/spec.rb +264 -0
  15. data/lib/capybara/node/actions.rb +420 -0
  16. data/lib/capybara/node/base.rb +143 -0
  17. data/lib/capybara/node/document.rb +48 -0
  18. data/lib/capybara/node/document_matchers.rb +67 -0
  19. data/lib/capybara/node/element.rb +606 -0
  20. data/lib/capybara/node/finders.rb +325 -0
  21. data/lib/capybara/node/matchers.rb +883 -0
  22. data/lib/capybara/node/simple.rb +208 -0
  23. data/lib/capybara/queries/ancestor_query.rb +27 -0
  24. data/lib/capybara/queries/base_query.rb +106 -0
  25. data/lib/capybara/queries/current_path_query.rb +51 -0
  26. data/lib/capybara/queries/match_query.rb +26 -0
  27. data/lib/capybara/queries/selector_query.rb +710 -0
  28. data/lib/capybara/queries/sibling_query.rb +26 -0
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +110 -0
  31. data/lib/capybara/queries/title_query.rb +39 -0
  32. data/lib/capybara/rack_test/browser.rb +140 -0
  33. data/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/lib/capybara/rack_test/driver.rb +109 -0
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +127 -0
  37. data/lib/capybara/rack_test/node.rb +325 -0
  38. data/lib/capybara/rails.rb +16 -0
  39. data/lib/capybara/registrations/drivers.rb +36 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
  41. data/lib/capybara/registrations/servers.rb +44 -0
  42. data/lib/capybara/result.rb +190 -0
  43. data/lib/capybara/rspec.rb +29 -0
  44. data/lib/capybara/rspec/features.rb +23 -0
  45. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/lib/capybara/rspec/matchers.rb +201 -0
  47. data/lib/capybara/rspec/matchers/base.rb +111 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +38 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/selector.rb +233 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
  63. data/lib/capybara/selector/css.rb +102 -0
  64. data/lib/capybara/selector/definition.rb +276 -0
  65. data/lib/capybara/selector/definition/button.rb +51 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +27 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +46 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/filter.rb +5 -0
  87. data/lib/capybara/selector/filter_set.rb +124 -0
  88. data/lib/capybara/selector/filters/base.rb +77 -0
  89. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  93. data/lib/capybara/selector/selector.rb +147 -0
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +496 -0
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +78 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +34 -0
  111. data/lib/capybara/selenium/node.rb +610 -0
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +131 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +47 -0
  121. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  122. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  123. data/lib/capybara/server.rb +126 -0
  124. data/lib/capybara/server/animation_disabler.rb +58 -0
  125. data/lib/capybara/server/checker.rb +44 -0
  126. data/lib/capybara/server/middleware.rb +69 -0
  127. data/lib/capybara/session.rb +942 -0
  128. data/lib/capybara/session/config.rb +124 -0
  129. data/lib/capybara/session/matchers.rb +87 -0
  130. data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  131. data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  132. data/lib/capybara/spec/fixtures/no_extension +1 -0
  133. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  134. data/lib/capybara/spec/public/jquery-ui.js +13 -0
  135. data/lib/capybara/spec/public/jquery.js +5 -0
  136. data/lib/capybara/spec/public/offset.js +6 -0
  137. data/lib/capybara/spec/public/test.js +268 -0
  138. data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  139. data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  140. data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  141. data/lib/capybara/spec/session/all_spec.rb +278 -0
  142. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
  150. data/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/lib/capybara/spec/session/check_spec.rb +235 -0
  152. data/lib/capybara/spec/session/choose_spec.rb +121 -0
  153. data/lib/capybara/spec/session/click_button_spec.rb +506 -0
  154. data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
  155. data/lib/capybara/spec/session/click_link_spec.rb +229 -0
  156. data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/lib/capybara/spec/session/current_url_spec.rb +115 -0
  158. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
  168. data/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/lib/capybara/spec/session/find_link_spec.rb +70 -0
  172. data/lib/capybara/spec/session/find_spec.rb +531 -0
  173. data/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  178. data/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  183. data/lib/capybara/spec/session/has_button_spec.rb +69 -0
  184. data/lib/capybara/spec/session/has_css_spec.rb +374 -0
  185. data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
  186. data/lib/capybara/spec/session/has_field_spec.rb +349 -0
  187. data/lib/capybara/spec/session/has_link_spec.rb +39 -0
  188. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  189. data/lib/capybara/spec/session/has_select_spec.rb +310 -0
  190. data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
  191. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  192. data/lib/capybara/spec/session/has_table_spec.rb +198 -0
  193. data/lib/capybara/spec/session/has_text_spec.rb +394 -0
  194. data/lib/capybara/spec/session/has_title_spec.rb +71 -0
  195. data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  196. data/lib/capybara/spec/session/headers_spec.rb +8 -0
  197. data/lib/capybara/spec/session/html_spec.rb +47 -0
  198. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  199. data/lib/capybara/spec/session/node_spec.rb +1292 -0
  200. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  201. data/lib/capybara/spec/session/refresh_spec.rb +33 -0
  202. data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
  203. data/lib/capybara/spec/session/response_code_spec.rb +8 -0
  204. data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  205. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  206. data/lib/capybara/spec/session/save_page_spec.rb +110 -0
  207. data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  208. data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  209. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  210. data/lib/capybara/spec/session/select_spec.rb +229 -0
  211. data/lib/capybara/spec/session/selectors_spec.rb +98 -0
  212. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  213. data/lib/capybara/spec/session/source_spec.rb +0 -0
  214. data/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/lib/capybara/spec/session/visit_spec.rb +204 -0
  219. data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/lib/capybara/spec/session/within_spec.rb +199 -0
  228. data/lib/capybara/spec/spec_helper.rb +134 -0
  229. data/lib/capybara/spec/test_app.rb +226 -0
  230. data/lib/capybara/spec/views/animated.erb +49 -0
  231. data/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/lib/capybara/spec/views/form.erb +685 -0
  234. data/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  241. data/lib/capybara/spec/views/obscured.erb +47 -0
  242. data/lib/capybara/spec/views/offset.erb +32 -0
  243. data/lib/capybara/spec/views/path.erb +13 -0
  244. data/lib/capybara/spec/views/popup_one.erb +9 -0
  245. data/lib/capybara/spec/views/popup_two.erb +9 -0
  246. data/lib/capybara/spec/views/postback.erb +14 -0
  247. data/lib/capybara/spec/views/react.erb +45 -0
  248. data/lib/capybara/spec/views/scroll.erb +20 -0
  249. data/lib/capybara/spec/views/spatial.erb +31 -0
  250. data/lib/capybara/spec/views/tables.erb +130 -0
  251. data/lib/capybara/spec/views/with_animation.erb +74 -0
  252. data/lib/capybara/spec/views/with_base_tag.erb +11 -0
  253. data/lib/capybara/spec/views/with_count.erb +8 -0
  254. data/lib/capybara/spec/views/with_dragula.erb +22 -0
  255. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  256. data/lib/capybara/spec/views/with_hover.erb +24 -0
  257. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  258. data/lib/capybara/spec/views/with_html.erb +208 -0
  259. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  260. data/lib/capybara/spec/views/with_html_entities.erb +2 -0
  261. data/lib/capybara/spec/views/with_js.erb +160 -0
  262. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  263. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  264. data/lib/capybara/spec/views/with_scope.erb +42 -0
  265. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  266. data/lib/capybara/spec/views/with_simple_html.erb +2 -0
  267. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  268. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  269. data/lib/capybara/spec/views/with_title.erb +5 -0
  270. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  271. data/lib/capybara/spec/views/with_windows.erb +54 -0
  272. data/lib/capybara/spec/views/within_frames.erb +15 -0
  273. data/lib/capybara/version.rb +5 -0
  274. data/lib/capybara/window.rb +146 -0
  275. data/spec/basic_node_spec.rb +154 -0
  276. data/spec/capybara_spec.rb +112 -0
  277. data/spec/css_builder_spec.rb +101 -0
  278. data/spec/css_splitter_spec.rb +38 -0
  279. data/spec/dsl_spec.rb +276 -0
  280. data/spec/filter_set_spec.rb +46 -0
  281. data/spec/fixtures/capybara.csv +1 -0
  282. data/spec/fixtures/certificate.pem +25 -0
  283. data/spec/fixtures/key.pem +27 -0
  284. data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  285. data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  286. data/spec/minitest_spec.rb +163 -0
  287. data/spec/minitest_spec_spec.rb +162 -0
  288. data/spec/per_session_config_spec.rb +68 -0
  289. data/spec/rack_test_spec.rb +268 -0
  290. data/spec/regexp_dissassembler_spec.rb +250 -0
  291. data/spec/result_spec.rb +196 -0
  292. data/spec/rspec/features_spec.rb +99 -0
  293. data/spec/rspec/scenarios_spec.rb +19 -0
  294. data/spec/rspec/shared_spec_matchers.rb +947 -0
  295. data/spec/rspec/views_spec.rb +14 -0
  296. data/spec/rspec_matchers_spec.rb +62 -0
  297. data/spec/rspec_spec.rb +145 -0
  298. data/spec/sauce_spec_chrome.rb +43 -0
  299. data/spec/selector_spec.rb +513 -0
  300. data/spec/selenium_spec_chrome.rb +188 -0
  301. data/spec/selenium_spec_chrome_remote.rb +96 -0
  302. data/spec/selenium_spec_edge.rb +47 -0
  303. data/spec/selenium_spec_firefox.rb +208 -0
  304. data/spec/selenium_spec_firefox_remote.rb +80 -0
  305. data/spec/selenium_spec_ie.rb +150 -0
  306. data/spec/selenium_spec_safari.rb +148 -0
  307. data/spec/server_spec.rb +292 -0
  308. data/spec/session_spec.rb +91 -0
  309. data/spec/shared_selenium_node.rb +83 -0
  310. data/spec/shared_selenium_session.rb +476 -0
  311. data/spec/spec_helper.rb +100 -0
  312. data/spec/xpath_builder_spec.rb +93 -0
  313. metadata +753 -0
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#body' do
4
+ it 'should return the unmodified page body' do
5
+ @session.visit('/')
6
+ expect(@session).to have_content('Hello world!') # wait for content to appear if visit is async
7
+ expect(@session.body).to include('Hello world!')
8
+ end
9
+
10
+ context 'encoding of response between ascii and utf8' do
11
+ it 'should be valid with html entities' do
12
+ @session.visit('/with_html_entities')
13
+ expect(@session).to have_content('Encoding') # wait for content to appear if visit is async
14
+ expect { @session.body.encode!('UTF-8') }.not_to raise_error
15
+ end
16
+
17
+ it 'should be valid without html entities' do
18
+ @session.visit('/with_html')
19
+ expect(@session).to have_content('This is a test') # wait for content to appear if visit is async
20
+ expect { @session.body.encode!('UTF-8') }.not_to raise_error
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,235 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#check' do
4
+ before do
5
+ @session.visit('/form')
6
+ end
7
+
8
+ describe "'checked' attribute" do
9
+ it 'should be true if checked' do
10
+ @session.check('Terms of Use')
11
+ expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_truthy
12
+ end
13
+
14
+ it 'should be false if unchecked' do
15
+ expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_falsey
16
+ end
17
+ end
18
+
19
+ it 'should trigger associated events', requires: [:js] do
20
+ @session.visit('/with_js')
21
+ @session.check('checkbox_with_event')
22
+ expect(@session).to have_css('#checkbox_event_triggered')
23
+ end
24
+
25
+ describe 'checking' do
26
+ it 'should not change an already checked checkbox' do
27
+ expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
28
+ @session.check('form_pets_dog')
29
+ expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
30
+ end
31
+
32
+ it 'should check an unchecked checkbox' do
33
+ expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
34
+ @session.check('form_pets_cat')
35
+ expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).to be_checked
36
+ end
37
+ end
38
+
39
+ describe 'unchecking' do
40
+ it 'should not change an already unchecked checkbox' do
41
+ expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
42
+ @session.uncheck('form_pets_cat')
43
+ expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
44
+ end
45
+
46
+ it 'should uncheck a checked checkbox' do
47
+ expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
48
+ @session.uncheck('form_pets_dog')
49
+ expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).not_to be_checked
50
+ end
51
+ end
52
+
53
+ it 'should check a checkbox by id' do
54
+ @session.check('form_pets_cat')
55
+ @session.click_button('awesome')
56
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
57
+ end
58
+
59
+ it 'should check a checkbox by label' do
60
+ @session.check('Cat')
61
+ @session.click_button('awesome')
62
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
63
+ end
64
+
65
+ it 'should work without a locator string' do
66
+ @session.check(id: 'form_pets_cat')
67
+ @session.click_button('awesome')
68
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
69
+ end
70
+
71
+ it 'should be able to check itself if no locator specified' do
72
+ cb = @session.find(:id, 'form_pets_cat')
73
+ cb.check
74
+ @session.click_button('awesome')
75
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
76
+ end
77
+
78
+ it 'casts to string' do
79
+ @session.check(:form_pets_cat)
80
+ @session.click_button('awesome')
81
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
82
+ end
83
+
84
+ context "with a locator that doesn't exist" do
85
+ it 'should raise an error' do
86
+ msg = /Unable to find checkbox "does not exist"/
87
+ expect do
88
+ @session.check('does not exist')
89
+ end.to raise_error(Capybara::ElementNotFound, msg)
90
+ end
91
+ end
92
+
93
+ context 'with a disabled checkbox' do
94
+ it 'should raise an error' do
95
+ msg = 'Unable to find visible checkbox "Disabled Checkbox" that is not disabled'
96
+ expect do
97
+ @session.check('Disabled Checkbox')
98
+ end.to raise_error(Capybara::ElementNotFound, msg)
99
+ end
100
+ end
101
+
102
+ context 'with :exact option' do
103
+ it 'should accept partial matches when false' do
104
+ @session.check('Ham', exact: false)
105
+ @session.click_button('awesome')
106
+ expect(extract_results(@session)['pets']).to include('hamster')
107
+ end
108
+
109
+ it 'should not accept partial matches when true' do
110
+ expect do
111
+ @session.check('Ham', exact: true)
112
+ end.to raise_error(Capybara::ElementNotFound)
113
+ end
114
+ end
115
+
116
+ context 'with `option` option' do
117
+ it 'can check boxes by their value' do
118
+ @session.check('form[pets][]', option: 'cat')
119
+ @session.click_button('awesome')
120
+ expect(extract_results(@session)['pets']).to include('cat')
121
+ end
122
+
123
+ it 'should alias `with`' do
124
+ @session.check('form[pets][]', with: 'cat')
125
+ @session.click_button('awesome')
126
+ expect(extract_results(@session)['pets']).to include('cat')
127
+ end
128
+
129
+ it 'should raise an error if option not found' do
130
+ expect do
131
+ @session.check('form[pets][]', option: 'elephant')
132
+ end.to raise_error(Capybara::ElementNotFound)
133
+ end
134
+ end
135
+
136
+ context 'when checkbox hidden' do
137
+ context 'with Capybara.automatic_label_click == true' do
138
+ around do |spec|
139
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
140
+ spec.run
141
+ Capybara.automatic_label_click = old_click_label
142
+ end
143
+
144
+ it 'should check via clicking the label with :for attribute if possible' do
145
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
146
+ @session.check('form_cars_tesla')
147
+ @session.click_button('awesome')
148
+ expect(extract_results(@session)['cars']).to include('tesla')
149
+ end
150
+
151
+ it 'should check via clicking the wrapping label if possible' do
152
+ expect(@session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)).to be_truthy
153
+ @session.check('form_cars_mclaren')
154
+ @session.click_button('awesome')
155
+ expect(extract_results(@session)['cars']).to include('mclaren')
156
+ end
157
+
158
+ it 'should check via clicking the label with :for attribute if locator nil' do
159
+ cb = @session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)
160
+ cb.check
161
+ @session.click_button('awesome')
162
+ expect(extract_results(@session)['cars']).to include('tesla')
163
+ end
164
+
165
+ it 'should check self via clicking the wrapping label if locator nil' do
166
+ cb = @session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)
167
+ cb.check
168
+ @session.click_button('awesome')
169
+ expect(extract_results(@session)['cars']).to include('mclaren')
170
+ end
171
+
172
+ it 'should not click the label if unneeded' do
173
+ expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
174
+ @session.check('form_cars_jaguar')
175
+ @session.click_button('awesome')
176
+ expect(extract_results(@session)['cars']).to include('jaguar')
177
+ end
178
+
179
+ it 'should raise original error when no label available' do
180
+ expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_ariel"/)
181
+ end
182
+
183
+ it 'should raise error if not allowed to click label' do
184
+ expect { @session.check('form_cars_mclaren', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_mclaren"/)
185
+ end
186
+ end
187
+
188
+ context 'with Capybara.automatic_label_click == false' do
189
+ around do |spec|
190
+ old_label_click, Capybara.automatic_label_click = Capybara.automatic_label_click, false
191
+ spec.run
192
+ Capybara.automatic_label_click = old_label_click
193
+ end
194
+
195
+ it 'should raise error if checkbox not visible' do
196
+ expect { @session.check('form_cars_mclaren') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_mclaren"/)
197
+ end
198
+
199
+ it 'should include node filter in error if verified' do
200
+ expect { @session.check('form_cars_maserati') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_maserati" that is not disabled')
201
+ end
202
+
203
+ context 'with allow_label_click == true' do
204
+ it 'should check via the label if input is hidden' do
205
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
206
+ @session.check('form_cars_tesla', allow_label_click: true)
207
+ @session.click_button('awesome')
208
+ expect(extract_results(@session)['cars']).to include('tesla')
209
+ end
210
+
211
+ it 'should not wait the full time if label can be clicked' do
212
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
213
+ start_time = Time.now
214
+ @session.check('form_cars_tesla', allow_label_click: true, wait: 10)
215
+ end_time = Time.now
216
+ expect(end_time - start_time).to be < 10
217
+ end
218
+
219
+ it 'should check via the label if input is moved off the left edge of the page' do
220
+ expect(@session.find(:checkbox, 'form_cars_pagani', unchecked: true, visible: :all)).to be_truthy
221
+ @session.check('form_cars_pagani', allow_label_click: true)
222
+ @session.click_button('awesome')
223
+ expect(extract_results(@session)['cars']).to include('pagani')
224
+ end
225
+
226
+ it 'should check via the label if input is visible but blocked by another element' do
227
+ expect(@session.find(:checkbox, 'form_cars_bugatti', unchecked: true, visible: :all)).to be_truthy
228
+ @session.check('form_cars_bugatti', allow_label_click: true)
229
+ @session.click_button('awesome')
230
+ expect(extract_results(@session)['cars']).to include('bugatti')
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,121 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#choose' do
4
+ before do
5
+ @session.visit('/form')
6
+ end
7
+
8
+ it 'should choose a radio button by id' do
9
+ @session.choose('gender_male')
10
+ @session.click_button('awesome')
11
+ expect(extract_results(@session)['gender']).to eq('male')
12
+ end
13
+
14
+ it 'should choose a radio button by label' do
15
+ @session.choose('Both')
16
+ @session.click_button('awesome')
17
+ expect(extract_results(@session)['gender']).to eq('both')
18
+ end
19
+
20
+ it 'should work without a locator string' do
21
+ @session.choose(id: 'gender_male')
22
+ @session.click_button('awesome')
23
+ expect(extract_results(@session)['gender']).to eq('male')
24
+ end
25
+
26
+ it 'should be able to choose self when no locator string specified' do
27
+ rb = @session.find(:id, 'gender_male')
28
+ rb.choose
29
+ @session.click_button('awesome')
30
+ expect(extract_results(@session)['gender']).to eq('male')
31
+ end
32
+
33
+ it 'casts to string' do
34
+ @session.choose('Both')
35
+ @session.click_button(:awesome)
36
+ expect(extract_results(@session)['gender']).to eq('both')
37
+ end
38
+
39
+ context "with a locator that doesn't exist" do
40
+ it 'should raise an error' do
41
+ msg = /Unable to find radio button "does not exist"/
42
+ expect do
43
+ @session.choose('does not exist')
44
+ end.to raise_error(Capybara::ElementNotFound, msg)
45
+ end
46
+ end
47
+
48
+ context 'with a disabled radio button' do
49
+ it 'should raise an error' do
50
+ expect do
51
+ @session.choose('Disabled Radio')
52
+ end.to raise_error(Capybara::ElementNotFound)
53
+ end
54
+ end
55
+
56
+ context 'with :exact option' do
57
+ it 'should accept partial matches when false' do
58
+ @session.choose('Mal', exact: false)
59
+ @session.click_button('awesome')
60
+ expect(extract_results(@session)['gender']).to eq('male')
61
+ end
62
+
63
+ it 'should not accept partial matches when true' do
64
+ expect do
65
+ @session.choose('Mal', exact: true)
66
+ end.to raise_error(Capybara::ElementNotFound)
67
+ end
68
+ end
69
+
70
+ context 'with `option` option' do
71
+ it 'can check radio buttons by their value' do
72
+ @session.choose('form[gender]', option: 'male')
73
+ @session.click_button('awesome')
74
+ expect(extract_results(@session)['gender']).to eq('male')
75
+ end
76
+
77
+ it 'should alias `:with` option' do
78
+ @session.choose('form[gender]', with: 'male')
79
+ @session.click_button('awesome')
80
+ expect(extract_results(@session)['gender']).to eq('male')
81
+ end
82
+
83
+ it 'should raise an error if option not found' do
84
+ expect do
85
+ @session.choose('form[gender]', option: 'hermaphrodite')
86
+ end.to raise_error(Capybara::ElementNotFound)
87
+ end
88
+ end
89
+
90
+ context 'with hidden radio buttons' do
91
+ context 'with Capybara.automatic_label_click == true' do
92
+ around do |spec|
93
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
94
+ spec.run
95
+ Capybara.automatic_label_click = old_click_label
96
+ end
97
+
98
+ it 'should select by clicking the label if available' do
99
+ @session.choose('party_democrat')
100
+ @session.click_button('awesome')
101
+ expect(extract_results(@session)['party']).to eq('democrat')
102
+ end
103
+
104
+ it 'should select self by clicking the label if no locator specified' do
105
+ cb = @session.find(:id, 'party_democrat', visible: :hidden)
106
+ cb.choose
107
+ @session.click_button('awesome')
108
+ expect(extract_results(@session)['party']).to eq('democrat')
109
+ end
110
+
111
+ it 'should raise error if not allowed to click label' do
112
+ expect { @session.choose('party_democrat', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible radio button "party_democrat"/)
113
+ end
114
+ end
115
+ end
116
+
117
+ it 'should return the chosen radio button' do
118
+ el = @session.find(:radio_button, 'gender_male')
119
+ expect(@session.choose('gender_male')).to eq el
120
+ end
121
+ end
@@ -0,0 +1,506 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#click_button' do
4
+ before do
5
+ @session.visit('/form')
6
+ end
7
+
8
+ it 'should wait for asynchronous load', requires: [:js] do
9
+ @session.visit('/with_js')
10
+ @session.using_wait_time(1.5) do
11
+ @session.click_link('Click me')
12
+ @session.click_button('New Here')
13
+ end
14
+ end
15
+
16
+ it 'casts to string' do
17
+ @session.click_button(:'Relative Action')
18
+ expect(extract_results(@session)['relative']).to eq('Relative Action')
19
+ expect(@session.current_path).to eq('/relative')
20
+ end
21
+
22
+ context 'with multiple values with the same name' do
23
+ it 'should use the latest given value' do
24
+ @session.check('Terms of Use')
25
+ @session.click_button('awesome')
26
+ expect(extract_results(@session)['terms_of_use']).to eq('1')
27
+ end
28
+ end
29
+
30
+ context 'with a form that has a relative url as an action' do
31
+ it 'should post to the correct url' do
32
+ @session.click_button('Relative Action')
33
+ expect(extract_results(@session)['relative']).to eq('Relative Action')
34
+ expect(@session.current_path).to eq('/relative')
35
+ end
36
+ end
37
+
38
+ context 'with a form that has no action specified' do
39
+ it 'should post to the correct url' do
40
+ @session.click_button('No Action')
41
+ expect(extract_results(@session)['no_action']).to eq('No Action')
42
+ expect(@session.current_path).to eq('/form')
43
+ end
44
+ end
45
+
46
+ context 'with value given on a submit button' do
47
+ context 'on a form with HTML5 fields' do
48
+ let(:results) { extract_results(@session) }
49
+
50
+ before do
51
+ @session.click_button('html5_submit')
52
+ end
53
+
54
+ it 'should serialise and submit search fields' do
55
+ expect(results['html5_search']).to eq('what are you looking for')
56
+ end
57
+
58
+ it 'should serialise and submit email fields' do
59
+ expect(results['html5_email']).to eq('person@email.com')
60
+ end
61
+
62
+ it 'should serialise and submit url fields' do
63
+ expect(results['html5_url']).to eq('http://www.example.com')
64
+ end
65
+
66
+ it 'should serialise and submit tel fields' do
67
+ expect(results['html5_tel']).to eq('911')
68
+ end
69
+
70
+ it 'should serialise and submit color fields' do
71
+ expect(results['html5_color'].upcase).to eq('#FFFFFF')
72
+ end
73
+ end
74
+
75
+ context 'on an HTML4 form' do
76
+ let(:results) { extract_results(@session) }
77
+
78
+ before do
79
+ @session.click_button('awesome')
80
+ end
81
+
82
+ it 'should serialize and submit text fields' do
83
+ expect(results['first_name']).to eq('John')
84
+ end
85
+
86
+ it 'should escape fields when submitting' do
87
+ expect(results['phone']).to eq('+1 555 7021')
88
+ end
89
+
90
+ it 'should serialize and submit password fields' do
91
+ expect(results['password']).to eq('seeekrit')
92
+ end
93
+
94
+ it 'should serialize and submit hidden fields' do
95
+ expect(results['token']).to eq('12345')
96
+ end
97
+
98
+ it 'should not serialize fields from other forms' do
99
+ expect(results['middle_name']).to be_nil
100
+ end
101
+
102
+ it 'should submit the button that was clicked, but not other buttons' do
103
+ expect(results['awesome']).to eq('awesome')
104
+ expect(results['crappy']).to be_nil
105
+ end
106
+
107
+ it 'should serialize radio buttons' do
108
+ expect(results['gender']).to eq('female')
109
+ end
110
+
111
+ it "should default radio value to 'on' if none specified" do
112
+ expect(results['valueless_radio']).to eq('on')
113
+ end
114
+
115
+ it 'should serialize check boxes' do
116
+ expect(results['pets']).to include('dog', 'hamster')
117
+ expect(results['pets']).not_to include('cat')
118
+ end
119
+
120
+ it "should default checkbox value to 'on' if none specififed" do
121
+ expect(results['valueless_checkbox']).to eq('on')
122
+ end
123
+
124
+ it 'should serialize text areas' do
125
+ expect(results['description']).to eq('Descriptive text goes here')
126
+ end
127
+
128
+ it 'should serialize select tag with values' do
129
+ expect(results['locale']).to eq('en')
130
+ end
131
+
132
+ it 'should serialize select tag without values' do
133
+ expect(results['region']).to eq('Norway')
134
+ end
135
+
136
+ it 'should serialize first option for select tag with no selection' do
137
+ expect(results['city']).to eq('London')
138
+ end
139
+
140
+ it 'should not serialize a select tag without options' do
141
+ expect(results['tendency']).to be_nil
142
+ end
143
+
144
+ it 'should convert lf to cr/lf in submitted textareas' do
145
+ expect(results['newline']).to eq("\r\nNew line after and before textarea tag\r\n")
146
+ end
147
+
148
+ it 'should not submit disabled fields' do
149
+ expect(results['disabled_text_field']).to be_nil
150
+ expect(results['disabled_textarea']).to be_nil
151
+ expect(results['disabled_checkbox']).to be_nil
152
+ expect(results['disabled_radio']).to be_nil
153
+ expect(results['disabled_select']).to be_nil
154
+ expect(results['disabled_file']).to be_nil
155
+ end
156
+ end
157
+ end
158
+
159
+ context 'input type=submit button' do
160
+ it 'should submit by button id' do
161
+ @session.click_button('awe123')
162
+ expect(extract_results(@session)['first_name']).to eq('John')
163
+ end
164
+
165
+ it 'should submit by specific button id' do
166
+ @session.click_button(id: 'awe123')
167
+ expect(extract_results(@session)['first_name']).to eq('John')
168
+ end
169
+
170
+ it 'should submit by button title' do
171
+ @session.click_button('What an Awesome Button')
172
+ expect(extract_results(@session)['first_name']).to eq('John')
173
+ end
174
+
175
+ it 'should submit by partial title', :exact_false do
176
+ @session.click_button('What an Awesome')
177
+ expect(extract_results(@session)['first_name']).to eq('John')
178
+ end
179
+
180
+ it 'should submit by button name' do
181
+ @session.click_button('form[awesome]')
182
+ expect(extract_results(@session)['first_name']).to eq('John')
183
+ end
184
+
185
+ it 'should submit by specific button name' do
186
+ @session.click_button(name: 'form[awesome]')
187
+ expect(extract_results(@session)['first_name']).to eq('John')
188
+ end
189
+
190
+ it 'should submit by specific button name regex' do
191
+ @session.click_button(name: /form\[awes.*\]/)
192
+ expect(extract_results(@session)['first_name']).to eq('John')
193
+ end
194
+ end
195
+
196
+ context 'with fields associated with the form using the form attribute', requires: [:form_attribute] do
197
+ let(:results) { extract_results(@session) }
198
+
199
+ before do
200
+ @session.click_button('submit_form1')
201
+ end
202
+
203
+ it 'should serialize and submit text fields' do
204
+ expect(results['outside_input']).to eq('outside_input')
205
+ end
206
+
207
+ it 'should serialize text areas' do
208
+ expect(results['outside_textarea']).to eq('Some text here')
209
+ end
210
+
211
+ it 'should serialize select tags' do
212
+ expect(results['outside_select']).to eq('Ruby')
213
+ end
214
+
215
+ it 'should not serliaze fields associated with a different form' do
216
+ expect(results['for_form2']).to be_nil
217
+ end
218
+ end
219
+
220
+ context 'with submit button outside the form defined by <button> tag', requires: [:form_attribute] do
221
+ let(:results) { extract_results(@session) }
222
+
223
+ before do
224
+ @session.click_button('outside_button')
225
+ end
226
+
227
+ it 'should submit the associated form' do
228
+ expect(results['which_form']).to eq('form2')
229
+ end
230
+
231
+ it 'should submit the button that was clicked, but not other buttons' do
232
+ expect(results['outside_button']).to eq('outside_button')
233
+ expect(results['unused']).to be_nil
234
+ end
235
+ end
236
+
237
+ context "with submit button outside the form defined by <input type='submit'> tag", requires: [:form_attribute] do
238
+ let(:results) { extract_results(@session) }
239
+
240
+ before do
241
+ @session.click_button('outside_submit')
242
+ end
243
+
244
+ it 'should submit the associated form' do
245
+ expect(results['which_form']).to eq('form1')
246
+ end
247
+
248
+ it 'should submit the button that was clicked, but not other buttons' do
249
+ expect(results['outside_submit']).to eq('outside_submit')
250
+ expect(results['submit_form1']).to be_nil
251
+ end
252
+ end
253
+
254
+ context 'with submit button for form1 located within form2', requires: [:form_attribute] do
255
+ it 'should submit the form associated with the button' do
256
+ @session.click_button('other_form_button')
257
+ expect(extract_results(@session)['which_form']).to eq('form1')
258
+ end
259
+ end
260
+
261
+ context 'with submit button not associated with any form' do
262
+ it 'should not error when clicked' do
263
+ expect { @session.click_button('no_form_button') }.not_to raise_error
264
+ end
265
+ end
266
+
267
+ context 'with alt given on an image button' do
268
+ it 'should submit the associated form' do
269
+ @session.click_button('oh hai thar')
270
+ expect(extract_results(@session)['first_name']).to eq('John')
271
+ end
272
+
273
+ it 'should work with partial matches', :exact_false do
274
+ @session.click_button('hai')
275
+ expect(extract_results(@session)['first_name']).to eq('John')
276
+ end
277
+ end
278
+
279
+ context 'with value given on an image button' do
280
+ it 'should submit the associated form' do
281
+ @session.click_button('okay')
282
+ expect(extract_results(@session)['first_name']).to eq('John')
283
+ end
284
+
285
+ it 'should work with partial matches', :exact_false do
286
+ @session.click_button('kay')
287
+ expect(extract_results(@session)['first_name']).to eq('John')
288
+ end
289
+ end
290
+
291
+ context 'with id given on an image button' do
292
+ it 'should submit the associated form' do
293
+ @session.click_button('okay556')
294
+ expect(extract_results(@session)['first_name']).to eq('John')
295
+ end
296
+ end
297
+
298
+ context 'with title given on an image button' do
299
+ it 'should submit the associated form' do
300
+ @session.click_button('Okay 556 Image')
301
+ expect(extract_results(@session)['first_name']).to eq('John')
302
+ end
303
+
304
+ it 'should work with partial matches', :exact_false do
305
+ @session.click_button('Okay 556')
306
+ expect(extract_results(@session)['first_name']).to eq('John')
307
+ end
308
+ end
309
+
310
+ context 'with text given on a button defined by <button> tag' do
311
+ it 'should submit the associated form' do
312
+ @session.click_button('Click me!')
313
+ expect(extract_results(@session)['first_name']).to eq('John')
314
+ end
315
+
316
+ it 'should work with partial matches', :exact_false do
317
+ @session.click_button('Click')
318
+ expect(extract_results(@session)['first_name']).to eq('John')
319
+ end
320
+ end
321
+
322
+ context 'with id given on a button defined by <button> tag' do
323
+ it 'should submit the associated form' do
324
+ @session.click_button('click_me_123')
325
+ expect(extract_results(@session)['first_name']).to eq('John')
326
+ end
327
+
328
+ it 'should serialize and send GET forms' do
329
+ @session.visit('/form')
330
+ @session.click_button('med')
331
+ results = extract_results(@session)
332
+ expect(results['middle_name']).to eq('Darren')
333
+ expect(results['foo']).to be_nil
334
+ end
335
+ end
336
+
337
+ context 'with name given on a button defined by <button> tag' do
338
+ it 'should submit the associated form when name is locator' do
339
+ @session.click_button('form[no_value]')
340
+ expect(extract_results(@session)['first_name']).to eq('John')
341
+ end
342
+
343
+ it 'should submit the associated form when name is specific' do
344
+ @session.click_button(name: 'form[no_value]')
345
+ expect(extract_results(@session)['first_name']).to eq('John')
346
+ end
347
+ end
348
+
349
+ context 'with value given on a button defined by <button> tag' do
350
+ it 'should submit the associated form' do
351
+ @session.click_button('click_me')
352
+ expect(extract_results(@session)['first_name']).to eq('John')
353
+ end
354
+
355
+ it 'should work with partial matches', :exact_false do
356
+ @session.click_button('ck_me')
357
+ expect(extract_results(@session)['first_name']).to eq('John')
358
+ end
359
+ end
360
+
361
+ context 'with title given on a button defined by <button> tag' do
362
+ it 'should submit the associated form' do
363
+ @session.click_button('Click Title button')
364
+ expect(extract_results(@session)['first_name']).to eq('John')
365
+ end
366
+
367
+ it 'should work with partial matches', :exact_false do
368
+ @session.click_button('Click Title')
369
+ expect(extract_results(@session)['first_name']).to eq('John')
370
+ end
371
+ end
372
+
373
+ context 'with descendant image alt given on a button defined by <button> tag' do
374
+ it 'should submit the associated form' do
375
+ @session.click_button('A horse eating hay')
376
+ expect(extract_results(@session)['first_name']).to eq('John')
377
+ end
378
+
379
+ it 'should work with partial matches', :exact_false do
380
+ @session.click_button('se eating h')
381
+ expect(extract_results(@session)['first_name']).to eq('John')
382
+ end
383
+ end
384
+
385
+ context "with a locator that doesn't exist" do
386
+ it 'should raise an error' do
387
+ msg = /Unable to find button "does not exist"/
388
+ expect do
389
+ @session.click_button('does not exist')
390
+ end.to raise_error(Capybara::ElementNotFound, msg)
391
+ end
392
+ end
393
+
394
+ context 'with formaction attribute on button' do
395
+ it 'should submit to the formaction attribute' do
396
+ @session.click_button('Formaction button')
397
+ results = extract_results(@session)
398
+ expect(@session.current_path).to eq '/form'
399
+ expect(results['which_form']).to eq 'formaction form'
400
+ end
401
+ end
402
+
403
+ context 'with formmethod attribute on button' do
404
+ it 'should submit to the formethod attribute' do
405
+ @session.click_button('Formmethod button')
406
+ results = extract_results(@session)
407
+ expect(@session.current_path).to eq '/form/get'
408
+ expect(results['which_form']).to eq 'formaction form'
409
+ end
410
+ end
411
+
412
+ it 'should serialize and send valueless buttons that were clicked' do
413
+ @session.click_button('No Value!')
414
+ results = extract_results(@session)
415
+ expect(results['no_value']).not_to be_nil
416
+ end
417
+
418
+ it 'should send button in document order' do
419
+ @session.click_button('outside_button')
420
+ results = extract_results(@session)
421
+ expect(results.keys).to eq %w[for_form2 outside_button which_form post_count]
422
+ end
423
+
424
+ it 'should not send image buttons that were not clicked' do
425
+ @session.click_button('Click me!')
426
+ results = extract_results(@session)
427
+ expect(results['okay']).to be_nil
428
+ end
429
+
430
+ it 'should serialize and send GET forms' do
431
+ @session.visit('/form')
432
+ @session.click_button('med')
433
+ results = extract_results(@session)
434
+ expect(results['middle_name']).to eq('Darren')
435
+ expect(results['foo']).to be_nil
436
+ end
437
+
438
+ it 'should follow redirects' do
439
+ @session.click_button('Go FAR')
440
+ expect(@session).to have_content('You landed')
441
+ expect(@session.current_url).to match(%r{/landed$})
442
+ end
443
+
444
+ it 'should follow temporary redirects that maintain method' do
445
+ @session.click_button('Go 307')
446
+ expect(@session).to have_content('You post landed: TWTW')
447
+ end
448
+
449
+ it 'should follow permanent redirects that maintain method' do
450
+ @session.click_button('Go 308')
451
+ expect(@session).to have_content('You post landed: TWTW')
452
+ end
453
+
454
+ it 'should post pack to the same URL when no action given' do
455
+ @session.visit('/postback')
456
+ @session.click_button('With no action')
457
+ expect(@session).to have_content('Postback')
458
+ end
459
+
460
+ it 'should post pack to the same URL when blank action given' do
461
+ @session.visit('/postback')
462
+ @session.click_button('With blank action')
463
+ expect(@session).to have_content('Postback')
464
+ end
465
+
466
+ it 'ignores disabled buttons' do
467
+ expect do
468
+ @session.click_button('Disabled button')
469
+ end.to raise_error(Capybara::ElementNotFound)
470
+ end
471
+
472
+ it 'should encode complex field names, like array[][value]' do
473
+ @session.visit('/form')
474
+ @session.fill_in('address1_city', with: 'Paris')
475
+ @session.fill_in('address1_street', with: 'CDG')
476
+
477
+ @session.fill_in('address2_city', with: 'Mikolaiv')
478
+ @session.fill_in('address2_street', with: 'PGS')
479
+
480
+ @session.click_button 'awesome'
481
+
482
+ addresses = extract_results(@session)['addresses']
483
+ expect(addresses.size).to eq(2)
484
+
485
+ expect(addresses[0]['street']).to eq('CDG')
486
+ expect(addresses[0]['city']).to eq('Paris')
487
+ expect(addresses[0]['country']).to eq('France')
488
+
489
+ expect(addresses[1]['street']).to eq('PGS')
490
+ expect(addresses[1]['city']).to eq('Mikolaiv')
491
+ expect(addresses[1]['country']).to eq('Ukraine')
492
+ end
493
+
494
+ context 'with :exact option' do
495
+ it 'should accept partial matches when false' do
496
+ @session.click_button('What an Awesome', exact: false)
497
+ expect(extract_results(@session)['first_name']).to eq('John')
498
+ end
499
+
500
+ it 'should not accept partial matches when true' do
501
+ expect do
502
+ @session.click_button('What an Awesome', exact: true)
503
+ end.to raise_error(Capybara::ElementNotFound)
504
+ end
505
+ end
506
+ end