capybara 2.7.0 → 3.35.3

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 (318) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/History.md +1147 -11
  4. data/License.txt +1 -1
  5. data/README.md +252 -131
  6. data/lib/capybara/config.rb +92 -0
  7. data/lib/capybara/cucumber.rb +3 -3
  8. data/lib/capybara/driver/base.rb +52 -21
  9. data/lib/capybara/driver/node.rb +48 -14
  10. data/lib/capybara/dsl.rb +16 -9
  11. data/lib/capybara/helpers.rb +72 -81
  12. data/lib/capybara/minitest/spec.rb +267 -0
  13. data/lib/capybara/minitest.rb +385 -0
  14. data/lib/capybara/node/actions.rb +337 -89
  15. data/lib/capybara/node/base.rb +50 -32
  16. data/lib/capybara/node/document.rb +19 -3
  17. data/lib/capybara/node/document_matchers.rb +22 -24
  18. data/lib/capybara/node/element.rb +388 -125
  19. data/lib/capybara/node/finders.rb +231 -121
  20. data/lib/capybara/node/matchers.rb +503 -217
  21. data/lib/capybara/node/simple.rb +64 -27
  22. data/lib/capybara/queries/ancestor_query.rb +27 -0
  23. data/lib/capybara/queries/base_query.rb +87 -11
  24. data/lib/capybara/queries/current_path_query.rb +24 -24
  25. data/lib/capybara/queries/match_query.rb +15 -10
  26. data/lib/capybara/queries/selector_query.rb +675 -81
  27. data/lib/capybara/queries/sibling_query.rb +26 -0
  28. data/lib/capybara/queries/style_query.rb +45 -0
  29. data/lib/capybara/queries/text_query.rb +88 -20
  30. data/lib/capybara/queries/title_query.rb +9 -11
  31. data/lib/capybara/rack_test/browser.rb +63 -39
  32. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  33. data/lib/capybara/rack_test/driver.rb +26 -16
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +73 -58
  36. data/lib/capybara/rack_test/node.rb +187 -67
  37. data/lib/capybara/rails.rb +4 -8
  38. data/lib/capybara/registration_container.rb +44 -0
  39. data/lib/capybara/registrations/drivers.rb +42 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  41. data/lib/capybara/registrations/servers.rb +45 -0
  42. data/lib/capybara/result.rb +142 -14
  43. data/lib/capybara/rspec/features.rb +17 -42
  44. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  45. data/lib/capybara/rspec/matchers/base.rb +111 -0
  46. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  47. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  48. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  49. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  50. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  51. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  52. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  53. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  54. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  55. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  56. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  57. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  58. data/lib/capybara/rspec/matchers.rb +143 -244
  59. data/lib/capybara/rspec.rb +10 -12
  60. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  61. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  62. data/lib/capybara/selector/css.rb +102 -0
  63. data/lib/capybara/selector/definition/button.rb +63 -0
  64. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  65. data/lib/capybara/selector/definition/css.rb +10 -0
  66. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  67. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  68. data/lib/capybara/selector/definition/element.rb +28 -0
  69. data/lib/capybara/selector/definition/field.rb +40 -0
  70. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  71. data/lib/capybara/selector/definition/file_field.rb +13 -0
  72. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  73. data/lib/capybara/selector/definition/frame.rb +17 -0
  74. data/lib/capybara/selector/definition/id.rb +6 -0
  75. data/lib/capybara/selector/definition/label.rb +62 -0
  76. data/lib/capybara/selector/definition/link.rb +54 -0
  77. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  78. data/lib/capybara/selector/definition/option.rb +27 -0
  79. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  80. data/lib/capybara/selector/definition/select.rb +81 -0
  81. data/lib/capybara/selector/definition/table.rb +109 -0
  82. data/lib/capybara/selector/definition/table_row.rb +21 -0
  83. data/lib/capybara/selector/definition/xpath.rb +5 -0
  84. data/lib/capybara/selector/definition.rb +278 -0
  85. data/lib/capybara/selector/filter.rb +3 -46
  86. data/lib/capybara/selector/filter_set.rb +124 -0
  87. data/lib/capybara/selector/filters/base.rb +77 -0
  88. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +155 -0
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +232 -369
  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 +380 -142
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -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 +76 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  111. data/lib/capybara/selenium/node.rb +528 -97
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -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 +45 -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/animation_disabler.rb +63 -0
  124. data/lib/capybara/server/checker.rb +44 -0
  125. data/lib/capybara/server/middleware.rb +71 -0
  126. data/lib/capybara/server.rb +74 -71
  127. data/lib/capybara/session/config.rb +126 -0
  128. data/lib/capybara/session/matchers.rb +44 -27
  129. data/lib/capybara/session.rb +500 -297
  130. data/lib/capybara/spec/fixtures/no_extension +1 -0
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +168 -14
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
  137. data/lib/capybara/spec/session/all_spec.rb +179 -59
  138. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  140. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  141. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  142. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  143. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  144. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  145. data/lib/capybara/spec/session/attach_file_spec.rb +154 -48
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +168 -41
  148. data/lib/capybara/spec/session/choose_spec.rb +75 -23
  149. data/lib/capybara/spec/session/click_button_spec.rb +243 -175
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
  151. data/lib/capybara/spec/session/click_link_spec.rb +100 -53
  152. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  153. data/lib/capybara/spec/session/current_url_spec.rb +61 -35
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
  162. data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
  163. data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
  164. data/lib/capybara/spec/session/find_button_spec.rb +37 -18
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +57 -34
  167. data/lib/capybara/spec/session/find_link_spec.rb +47 -10
  168. data/lib/capybara/spec/session/find_spec.rb +290 -144
  169. data/lib/capybara/spec/session/first_spec.rb +91 -48
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  174. data/lib/capybara/spec/session/go_back_spec.rb +3 -2
  175. data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +76 -19
  180. data/lib/capybara/spec/session/has_css_spec.rb +277 -131
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
  182. data/lib/capybara/spec/session/has_field_spec.rb +177 -107
  183. data/lib/capybara/spec/session/has_link_spec.rb +13 -12
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  185. data/lib/capybara/spec/session/has_select_spec.rb +191 -95
  186. data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  189. data/lib/capybara/spec/session/has_text_spec.rb +126 -60
  190. data/lib/capybara/spec/session/has_title_spec.rb +35 -12
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  193. data/lib/capybara/spec/session/html_spec.rb +14 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +1028 -131
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  197. data/lib/capybara/spec/session/refresh_spec.rb +34 -0
  198. data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
  202. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  206. data/lib/capybara/spec/session/select_spec.rb +112 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +71 -8
  208. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  209. data/lib/capybara/spec/session/text_spec.rb +38 -23
  210. data/lib/capybara/spec/session/title_spec.rb +17 -5
  211. data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
  212. data/lib/capybara/spec/session/unselect_spec.rb +44 -43
  213. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
  219. data/lib/capybara/spec/session/window/window_spec.rb +121 -73
  220. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
  222. data/lib/capybara/spec/session/within_spec.rb +76 -43
  223. data/lib/capybara/spec/spec_helper.rb +67 -33
  224. data/lib/capybara/spec/test_app.rb +85 -36
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/buttons.erb +1 -1
  227. data/lib/capybara/spec/views/fieldsets.erb +1 -1
  228. data/lib/capybara/spec/views/form.erb +227 -20
  229. data/lib/capybara/spec/views/frame_child.erb +10 -2
  230. data/lib/capybara/spec/views/frame_one.erb +2 -1
  231. data/lib/capybara/spec/views/frame_parent.erb +2 -2
  232. data/lib/capybara/spec/views/frame_two.erb +1 -1
  233. data/lib/capybara/spec/views/header_links.erb +1 -1
  234. data/lib/capybara/spec/views/host_links.erb +1 -1
  235. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  236. data/lib/capybara/spec/views/obscured.erb +47 -0
  237. data/lib/capybara/spec/views/offset.erb +32 -0
  238. data/lib/capybara/spec/views/path.erb +1 -1
  239. data/lib/capybara/spec/views/popup_one.erb +1 -1
  240. data/lib/capybara/spec/views/popup_two.erb +1 -1
  241. data/lib/capybara/spec/views/postback.erb +1 -1
  242. data/lib/capybara/spec/views/react.erb +45 -0
  243. data/lib/capybara/spec/views/scroll.erb +20 -0
  244. data/lib/capybara/spec/views/spatial.erb +31 -0
  245. data/lib/capybara/spec/views/tables.erb +69 -2
  246. data/lib/capybara/spec/views/with_animation.erb +82 -0
  247. data/lib/capybara/spec/views/with_base_tag.erb +1 -1
  248. data/lib/capybara/spec/views/with_count.erb +1 -1
  249. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  250. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  251. data/lib/capybara/spec/views/with_hover.erb +7 -1
  252. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  253. data/lib/capybara/spec/views/with_html.erb +100 -10
  254. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  255. data/lib/capybara/spec/views/with_html_entities.erb +1 -1
  256. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  257. data/lib/capybara/spec/views/with_js.erb +49 -3
  258. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  259. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  260. data/lib/capybara/spec/views/with_scope.erb +1 -1
  261. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  262. data/lib/capybara/spec/views/with_simple_html.erb +1 -1
  263. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  264. data/lib/capybara/spec/views/with_title.erb +1 -1
  265. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  266. data/lib/capybara/spec/views/with_windows.erb +7 -1
  267. data/lib/capybara/spec/views/within_frames.erb +6 -3
  268. data/lib/capybara/version.rb +2 -1
  269. data/lib/capybara/window.rb +39 -21
  270. data/lib/capybara.rb +208 -186
  271. data/spec/basic_node_spec.rb +52 -39
  272. data/spec/capybara_spec.rb +72 -50
  273. data/spec/css_builder_spec.rb +101 -0
  274. data/spec/css_splitter_spec.rb +38 -0
  275. data/spec/dsl_spec.rb +81 -61
  276. data/spec/filter_set_spec.rb +46 -0
  277. data/spec/fixtures/capybara.csv +1 -0
  278. data/spec/fixtures/certificate.pem +25 -0
  279. data/spec/fixtures/key.pem +27 -0
  280. data/spec/fixtures/selenium_driver_rspec_failure.rb +7 -3
  281. data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
  282. data/spec/minitest_spec.rb +164 -0
  283. data/spec/minitest_spec_spec.rb +162 -0
  284. data/spec/per_session_config_spec.rb +68 -0
  285. data/spec/rack_test_spec.rb +189 -96
  286. data/spec/regexp_dissassembler_spec.rb +250 -0
  287. data/spec/result_spec.rb +143 -13
  288. data/spec/rspec/features_spec.rb +38 -32
  289. data/spec/rspec/scenarios_spec.rb +9 -7
  290. data/spec/rspec/shared_spec_matchers.rb +959 -0
  291. data/spec/rspec/views_spec.rb +9 -3
  292. data/spec/rspec_matchers_spec.rb +62 -0
  293. data/spec/rspec_spec.rb +127 -30
  294. data/spec/sauce_spec_chrome.rb +43 -0
  295. data/spec/selector_spec.rb +458 -37
  296. data/spec/selenium_spec_chrome.rb +196 -9
  297. data/spec/selenium_spec_chrome_remote.rb +100 -0
  298. data/spec/selenium_spec_edge.rb +47 -0
  299. data/spec/selenium_spec_firefox.rb +210 -0
  300. data/spec/selenium_spec_firefox_remote.rb +80 -0
  301. data/spec/selenium_spec_ie.rb +150 -0
  302. data/spec/selenium_spec_safari.rb +148 -0
  303. data/spec/server_spec.rb +200 -101
  304. data/spec/session_spec.rb +91 -0
  305. data/spec/shared_selenium_node.rb +83 -0
  306. data/spec/shared_selenium_session.rb +558 -0
  307. data/spec/spec_helper.rb +94 -2
  308. data/spec/xpath_builder_spec.rb +93 -0
  309. metadata +420 -60
  310. data/lib/capybara/query.rb +0 -7
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -60
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -196
  314. data/lib/capybara/spec/session/assert_title.rb +0 -70
  315. data/lib/capybara/spec/session/source_spec.rb +0 -0
  316. data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
  317. data/spec/rspec/matchers_spec.rb +0 -827
  318. data/spec/selenium_spec.rb +0 -151
@@ -1,113 +1,138 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#click_link_or_button' do
3
- it "should click on a link" do
4
+ it 'should click on a link' do
4
5
  @session.visit('/with_html')
5
6
  @session.click_link_or_button('labore')
6
7
  expect(@session).to have_content('Bar')
7
8
  end
8
9
 
9
- it "should click on a button" do
10
+ it 'should click on a button' do
10
11
  @session.visit('/form')
11
12
  @session.click_link_or_button('awe123')
12
13
  expect(extract_results(@session)['first_name']).to eq('John')
13
14
  end
14
15
 
15
- it "should click on a button with no type attribute" do
16
+ it 'should click on a button with no type attribute' do
16
17
  @session.visit('/form')
17
18
  @session.click_link_or_button('no_type')
18
19
  expect(extract_results(@session)['first_name']).to eq('John')
19
20
  end
20
21
 
21
- it "should be aliased as click_on" do
22
+ it 'should be aliased as click_on' do
22
23
  @session.visit('/form')
23
24
  @session.click_on('awe123')
24
25
  expect(extract_results(@session)['first_name']).to eq('John')
25
26
  end
26
27
 
27
- it "should wait for asynchronous load", :requires => [:js] do
28
+ it 'should wait for asynchronous load', requires: [:js] do
29
+ Capybara.default_max_wait_time = 2
28
30
  @session.visit('/with_js')
29
31
  @session.click_link('Click me')
30
32
  @session.click_link_or_button('Has been clicked')
31
33
  end
32
34
 
33
- it "casts to string" do
35
+ it 'casts to string' do
34
36
  @session.visit('/form')
35
- @session.click_link_or_button(:'awe123')
37
+ @session.click_link_or_button(:awe123)
36
38
  expect(extract_results(@session)['first_name']).to eq('John')
37
39
  end
38
40
 
39
- context "with :exact option" do
40
- context "when `true`" do
41
- it "clicks on approximately matching link" do
41
+ context 'with test_id' do
42
+ it 'should click on a button' do
43
+ Capybara.test_id = 'data-test-id'
44
+ @session.visit('/form')
45
+ @session.click_link_or_button('test_id_button')
46
+ expect(extract_results(@session)['first_name']).to eq('John')
47
+ end
48
+ end
49
+
50
+ context 'with :exact option' do
51
+ context 'when `false`' do
52
+ it 'clicks on approximately matching link' do
42
53
  @session.visit('/with_html')
43
- @session.click_link_or_button('abore', :exact => false)
54
+ @session.click_link_or_button('abore', exact: false)
44
55
  expect(@session).to have_content('Bar')
45
56
  end
46
57
 
47
- it "clicks on approximately matching button" do
58
+ it 'clicks on approximately matching button' do
48
59
  @session.visit('/form')
49
- @session.click_link_or_button('awe')
60
+ @session.click_link_or_button('awe', exact: false)
50
61
  expect(extract_results(@session)['first_name']).to eq('John')
51
62
  end
52
63
  end
53
64
 
54
- context "when `false`" do
55
- it "does not click on link which matches approximately" do
65
+ context 'when `true`' do
66
+ it 'does not click on link which matches approximately' do
56
67
  @session.visit('/with_html')
57
- msg = "Unable to find link or button \"abore\""
68
+ msg = 'Unable to find link or button "abore"'
58
69
  expect do
59
- @session.click_link_or_button('abore', :exact => true)
70
+ @session.click_link_or_button('abore', exact: true)
60
71
  end.to raise_error(Capybara::ElementNotFound, msg)
61
72
  end
62
73
 
63
- it "does not click on approximately matching button" do
74
+ it 'does not click on approximately matching button' do
64
75
  @session.visit('/form')
65
- msg = "Unable to find link or button \"awe\""
76
+ msg = 'Unable to find link or button "awe"'
66
77
 
67
78
  expect do
68
- @session.click_link_or_button('awe', :exact => true)
79
+ @session.click_link_or_button('awe', exact: true)
69
80
  end.to raise_error(Capybara::ElementNotFound, msg)
70
81
  end
71
82
  end
72
83
  end
73
84
 
74
85
  context "with a locator that doesn't exist" do
75
- it "should raise an error" do
86
+ it 'should raise an error' do
76
87
  @session.visit('/with_html')
77
- msg = "Unable to find link or button \"does not exist\""
88
+ msg = 'Unable to find link or button "does not exist"'
78
89
  expect do
79
90
  @session.click_link_or_button('does not exist')
80
91
  end.to raise_error(Capybara::ElementNotFound, msg)
81
92
  end
82
93
  end
83
94
 
84
- context "with :disabled option" do
85
- it "ignores disabled buttons when false" do
95
+ context 'with :disabled option' do
96
+ it 'ignores disabled buttons when false' do
86
97
  @session.visit('/form')
87
98
  expect do
88
- @session.click_link_or_button('Disabled button', :disabled => false)
99
+ @session.click_link_or_button('Disabled button', disabled: false)
89
100
  end.to raise_error(Capybara::ElementNotFound)
90
101
  end
91
102
 
92
- it "ignores disabled buttons by default" do
103
+ it 'ignores disabled buttons by default' do
93
104
  @session.visit('/form')
94
105
  expect do
95
106
  @session.click_link_or_button('Disabled button')
96
107
  end.to raise_error(Capybara::ElementNotFound)
97
108
  end
98
109
 
99
- it "happily clicks on links which incorrectly have the disabled attribute" do
110
+ it 'happily clicks on links which incorrectly have the disabled attribute' do
100
111
  @session.visit('/with_html')
101
112
  @session.click_link_or_button('Disabled link')
102
- expect(@session).to have_content("Bar")
113
+ expect(@session).to have_content('Bar')
103
114
  end
115
+ end
104
116
 
105
- it "does nothing when button is disabled" do
106
- @session.visit('/form')
117
+ it 'should return the element clicked' do
118
+ @session.visit('/with_html')
119
+ link = @session.find(:link, 'Blank Anchor')
120
+ expect(@session.click_link_or_button('Blank Anchor')).to eq link
121
+ end
122
+
123
+ context 'with enable_aria_label' do
124
+ it 'should click on link' do
125
+ @session.visit('/with_html')
107
126
  expect do
108
- @session.click_link_or_button('Disabled button', :disabled => false)
109
- end.to raise_error(Capybara::ElementNotFound)
127
+ @session.click_link_or_button('Go to simple', enable_aria_label: true)
128
+ end.not_to raise_error
110
129
  end
111
130
 
131
+ it 'should click on button' do
132
+ @session.visit('/form')
133
+ expect do
134
+ @session.click_link_or_button('Aria button', enable_aria_label: true)
135
+ end.not_to raise_error
136
+ end
112
137
  end
113
138
  end
@@ -1,182 +1,229 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#click_link' do
3
4
  before do
4
5
  @session.visit('/with_html')
5
6
  end
6
7
 
7
- it "should wait for asynchronous load", :requires => [:js] do
8
+ it 'should wait for asynchronous load', requires: [:js] do
9
+ Capybara.default_max_wait_time = 2
8
10
  @session.visit('/with_js')
9
11
  @session.click_link('Click me')
10
12
  @session.click_link('Has been clicked')
11
13
  end
12
14
 
13
- it "casts to string" do
14
- @session.click_link(:'foo')
15
+ it 'casts to string' do
16
+ @session.click_link(:foo)
15
17
  expect(@session).to have_content('Another World')
16
18
  end
17
19
 
18
- it "raises any errors caught inside the server", :requires => [:server] do
19
- quietly { @session.visit("/error") }
20
+ it 'raises any errors caught inside the server', requires: [:server] do
21
+ quietly { @session.visit('/error') }
20
22
  expect do
21
23
  @session.click_link('foo')
22
24
  end.to raise_error(TestApp::TestAppError)
23
25
  end
24
26
 
25
- context "with id given" do
26
- it "should take user to the linked page" do
27
+ context 'with id given' do
28
+ it 'should take user to the linked page' do
27
29
  @session.click_link('foo')
28
30
  expect(@session).to have_content('Another World')
29
31
  end
30
32
  end
31
33
 
32
- context "with text given" do
33
- it "should take user to the linked page" do
34
+ context 'with text given' do
35
+ it 'should take user to the linked page' do
34
36
  @session.click_link('labore')
35
37
  expect(@session).to have_content('Bar')
36
38
  end
37
39
 
38
- it "should accept partial matches" do
40
+ it 'should accept partial matches', :exact_false do
39
41
  @session.click_link('abo')
40
42
  expect(@session).to have_content('Bar')
41
43
  end
42
44
  end
43
45
 
44
- context "with title given" do
45
- it "should take user to the linked page" do
46
+ context 'with title given' do
47
+ it 'should take user to the linked page' do
46
48
  @session.click_link('awesome title')
47
49
  expect(@session).to have_content('Bar')
48
50
  end
49
51
 
50
- it "should accept partial matches" do
52
+ it 'should accept partial matches', :exact_false do
51
53
  @session.click_link('some titl')
52
54
  expect(@session).to have_content('Bar')
53
55
  end
54
56
  end
55
57
 
56
- context "with alternative text given to a contained image" do
57
- it "should take user to the linked page" do
58
+ context 'with alternative text given to a contained image' do
59
+ it 'should take user to the linked page' do
58
60
  @session.click_link('awesome image')
59
61
  expect(@session).to have_content('Bar')
60
62
  end
61
63
 
62
- it "should accept partial matches" do
64
+ it 'should accept partial matches', :exact_false do
63
65
  @session.click_link('some imag')
64
66
  expect(@session).to have_content('Bar')
65
67
  end
66
68
  end
67
69
 
68
70
  context "with a locator that doesn't exist" do
69
- it "should raise an error" do
70
- msg = "Unable to find link \"does not exist\""
71
+ it 'should raise an error' do
72
+ msg = 'Unable to find link "does not exist"'
71
73
  expect do
72
74
  @session.click_link('does not exist')
73
75
  end.to raise_error(Capybara::ElementNotFound, msg)
74
76
  end
75
77
  end
76
78
 
77
- context "with :href option given" do
78
- it "should find links with valid href" do
79
- @session.click_link('labore', :href => '/with_simple_html')
79
+ context 'with :href option given' do
80
+ it 'should find links with valid href' do
81
+ @session.click_link('labore', href: '/with_simple_html')
80
82
  expect(@session).to have_content('Bar')
81
83
  end
82
84
 
83
85
  it "should raise error if link wasn't found" do
84
- expect { @session.click_link('labore', :href => 'invalid_href') }.to raise_error(Capybara::ElementNotFound)
86
+ expect { @session.click_link('labore', href: 'invalid_href') }.to raise_error(Capybara::ElementNotFound, /with href "invalid_href/)
85
87
  end
86
88
  end
87
89
 
88
- context "with a regex :href option given" do
89
- it "should find a link matching an all-matching regex pattern" do
90
- @session.click_link('labore', :href => /.+/)
90
+ context 'with a regex :href option given' do
91
+ it 'should find a link matching an all-matching regex pattern' do
92
+ @session.click_link('labore', href: /.+/)
91
93
  expect(@session).to have_content('Bar')
92
94
  end
93
95
 
94
- it "should find a link matching an exact regex pattern" do
95
- @session.click_link('labore', :href => /\/with_simple_html/)
96
+ it 'should find a link matching an exact regex pattern' do
97
+ @session.click_link('labore', href: %r{/with_simple_html})
96
98
  expect(@session).to have_content('Bar')
97
99
  end
98
100
 
99
- it "should find a link matching a partial regex pattern" do
100
- @session.click_link('labore', :href => /\/with_simple/)
101
+ it 'should find a link matching a partial regex pattern' do
102
+ @session.click_link('labore', href: %r{/with_simple})
101
103
  expect(@session).to have_content('Bar')
102
104
  end
103
105
 
104
106
  it "should raise an error if no link's href matched the pattern" do
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
+ expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound, %r{with href matching /invalid_pattern/})
108
+ expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound, /#{Regexp.quote "with href matching /.+d+/"}/)
109
+ end
110
+
111
+ context 'href: nil' do
112
+ it 'should not raise an error on links with no href attribute' do
113
+ expect { @session.click_link('No Href', href: nil) }.not_to raise_error
114
+ end
115
+
116
+ it 'should raise an error if href attribute exists' do
117
+ expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound, /with no href attribute/)
118
+ expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound, /with no href attribute/)
119
+ end
120
+ end
121
+
122
+ context 'href: false' do
123
+ it 'should not raise an error on links with no href attribute' do
124
+ expect { @session.click_link('No Href', href: false) }.not_to raise_error
125
+ end
126
+
127
+ it 'should not raise an error if href attribute exists' do
128
+ expect { @session.click_link('Blank Href', href: false) }.not_to raise_error
129
+ expect { @session.click_link('Normal Anchor', href: false) }.not_to raise_error
130
+ end
107
131
  end
108
132
  end
109
133
 
110
- it "should follow relative links" do
134
+ it 'should follow relative links' do
111
135
  @session.visit('/')
112
136
  @session.click_link('Relative')
113
137
  expect(@session).to have_content('This is a test')
114
138
  end
115
139
 
116
- it "should follow protocol relative links" do
140
+ it 'should follow protocol relative links' do
117
141
  @session.click_link('Protocol')
118
142
  expect(@session).to have_content('Another World')
119
143
  end
120
144
 
121
- it "should follow redirects" do
145
+ it 'should follow redirects' do
122
146
  @session.click_link('Redirect')
123
147
  expect(@session).to have_content('You landed')
124
148
  end
125
149
 
126
- it "should follow redirects back to itself" do
150
+ it 'should follow redirects back to itself' do
127
151
  @session.click_link('BackToMyself')
128
- expect(@session).to have_css('#referrer', text: /\/with_html$/)
152
+ expect(@session).to have_css('#referrer', text: %r{/with_html$})
129
153
  expect(@session).to have_content('This is a test')
130
154
  end
131
155
 
132
- it "should add query string to current URL with naked query string" do
156
+ it 'should add query string to current URL with naked query string' do
133
157
  @session.click_link('Naked Query String')
134
158
  expect(@session).to have_content('Query String sent')
135
159
  end
136
160
 
137
- it "should do nothing on anchor links" do
138
- @session.fill_in("test_field", :with => 'blah')
161
+ it 'should do nothing on anchor links' do
162
+ @session.fill_in('test_field', with: 'blah')
139
163
  @session.click_link('Normal Anchor')
140
- expect(@session.find_field("test_field").value).to eq('blah')
164
+ expect(@session.find_field('test_field').value).to eq('blah')
141
165
  @session.click_link('Blank Anchor')
142
- expect(@session.find_field("test_field").value).to eq('blah')
166
+ expect(@session.find_field('test_field').value).to eq('blah')
143
167
  @session.click_link('Blank JS Anchor')
144
- expect(@session.find_field("test_field").value).to eq('blah')
168
+ expect(@session.find_field('test_field').value).to eq('blah')
145
169
  end
146
170
 
147
- it "should do nothing on URL+anchor links for the same page" do
148
- @session.fill_in("test_field", :with => 'blah')
171
+ it 'should do nothing on URL+anchor links for the same page' do
172
+ @session.fill_in('test_field', with: 'blah')
149
173
  @session.click_link('Anchor on same page')
150
- expect(@session.find_field("test_field").value).to eq('blah')
174
+ expect(@session.find_field('test_field').value).to eq('blah')
151
175
  end
152
176
 
153
- it "should follow link on URL+anchor links for a different page" do
177
+ it 'should follow link on URL+anchor links for a different page' do
154
178
  @session.click_link('Anchor on different page')
155
179
  expect(@session).to have_content('Bar')
156
180
  end
157
181
 
158
- it "should follow link on anchor if the path has regex special characters" do
182
+ it 'should follow link on anchor if the path has regex special characters' do
159
183
  @session.visit('/with.*html')
160
184
  @session.click_link('Anchor on different page')
161
185
  expect(@session).to have_content('Bar')
162
186
  end
163
187
 
164
- it "raise an error with links with no href" do
188
+ it 'should raise an error with links with no href' do
165
189
  expect do
166
190
  @session.click_link('No Href')
167
191
  end.to raise_error(Capybara::ElementNotFound)
168
192
  end
169
193
 
170
- context "with :exact option" do
171
- it "should accept partial matches when false" do
172
- @session.click_link('abo', :exact => false)
194
+ context 'with :exact option' do
195
+ it 'should accept partial matches when false' do
196
+ @session.click_link('abo', exact: false)
173
197
  expect(@session).to have_content('Bar')
174
198
  end
175
199
 
176
- it "should not accept partial matches when true" do
200
+ it 'should not accept partial matches when true' do
177
201
  expect do
178
- @session.click_link('abo', :exact => true)
202
+ @session.click_link('abo', exact: true)
179
203
  end.to raise_error(Capybara::ElementNotFound)
180
204
  end
181
205
  end
206
+
207
+ context 'without locator' do
208
+ it 'uses options' do
209
+ @session.click_link(href: '/foo')
210
+ expect(@session).to have_content('Another World')
211
+ end
212
+ end
213
+
214
+ it 'should return element clicked' do
215
+ el = @session.find(:link, 'Normal Anchor')
216
+ expect(@session.click_link('Normal Anchor')).to eq el
217
+ end
218
+
219
+ it 'can download a file', requires: [:download] do
220
+ # This requires the driver used for the test to be configured
221
+ # to download documents with the mime type "text/csv"
222
+ download_file = File.join(Capybara.save_path, 'download.csv')
223
+ expect(File).not_to exist(download_file)
224
+ @session.click_link('Download Me')
225
+ sleep 2 # allow time for file to download
226
+ expect(File).to exist(download_file)
227
+ FileUtils.rm_rf download_file
228
+ end
182
229
  end