capybara 2.18.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +945 -12
  4. data/License.txt +1 -1
  5. data/README.md +264 -90
  6. data/lib/capybara/config.rb +29 -57
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +35 -18
  9. data/lib/capybara/driver/node.rb +40 -10
  10. data/lib/capybara/dsl.rb +10 -7
  11. data/lib/capybara/helpers.rb +70 -31
  12. data/lib/capybara/minitest/spec.rb +185 -83
  13. data/lib/capybara/minitest.rb +232 -112
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +42 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +362 -135
  19. data/lib/capybara/node/finders.rb +151 -137
  20. data/lib/capybara/node/matchers.rb +394 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +12 -9
  25. data/lib/capybara/queries/base_query.rb +39 -28
  26. data/lib/capybara/queries/current_path_query.rb +21 -27
  27. data/lib/capybara/queries/match_query.rb +14 -7
  28. data/lib/capybara/queries/selector_query.rb +659 -149
  29. data/lib/capybara/queries/sibling_query.rb +11 -9
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +56 -38
  32. data/lib/capybara/queries/title_query.rb +8 -11
  33. data/lib/capybara/rack_test/browser.rb +114 -42
  34. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  35. data/lib/capybara/rack_test/driver.rb +22 -17
  36. data/lib/capybara/rack_test/errors.rb +6 -0
  37. data/lib/capybara/rack_test/form.rb +93 -58
  38. data/lib/capybara/rack_test/node.rb +184 -81
  39. data/lib/capybara/rails.rb +3 -7
  40. data/lib/capybara/registration_container.rb +41 -0
  41. data/lib/capybara/registrations/drivers.rb +42 -0
  42. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  43. data/lib/capybara/registrations/servers.rb +66 -0
  44. data/lib/capybara/result.rb +97 -63
  45. data/lib/capybara/rspec/features.rb +17 -50
  46. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  47. data/lib/capybara/rspec/matchers/base.rb +113 -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 +69 -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 +43 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/rspec/matchers.rb +146 -310
  61. data/lib/capybara/rspec.rb +7 -11
  62. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  63. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  64. data/lib/capybara/selector/css.rb +85 -13
  65. data/lib/capybara/selector/definition/button.rb +68 -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 +28 -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 +55 -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/definition.rb +280 -0
  87. data/lib/capybara/selector/filter.rb +2 -17
  88. data/lib/capybara/selector/filter_set.rb +80 -33
  89. data/lib/capybara/selector/filters/base.rb +50 -6
  90. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  91. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  92. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  93. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  94. data/lib/capybara/selector/selector.rb +93 -210
  95. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  96. data/lib/capybara/selector.rb +475 -523
  97. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  99. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  100. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  101. data/lib/capybara/selenium/driver.rb +298 -267
  102. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  103. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  104. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  105. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  106. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  107. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  108. data/lib/capybara/selenium/extensions/find.rb +110 -0
  109. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  110. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  111. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  112. data/lib/capybara/selenium/node.rb +517 -145
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -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 +80 -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 +59 -67
  127. data/lib/capybara/session/config.rb +81 -67
  128. data/lib/capybara/session/matchers.rb +28 -20
  129. data/lib/capybara/session.rb +337 -365
  130. data/lib/capybara/spec/public/jquery.js +5 -5
  131. data/lib/capybara/spec/public/offset.js +6 -0
  132. data/lib/capybara/spec/public/test.js +151 -12
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +161 -57
  138. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  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.rb → assert_title_spec.rb} +22 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +117 -55
  148. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  149. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  151. data/lib/capybara/spec/session/click_link_spec.rb +93 -58
  152. data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
  153. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  163. data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
  164. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  167. data/lib/capybara/spec/session/find_link_spec.rb +46 -17
  168. data/lib/capybara/spec/session/find_spec.rb +260 -145
  169. data/lib/capybara/spec/session/first_spec.rb +80 -52
  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 +33 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
  174. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +100 -13
  180. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
  182. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +47 -6
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
  186. data/lib/capybara/spec/session/has_select_spec.rb +107 -72
  187. data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +183 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +106 -62
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  196. data/lib/capybara/spec/session/node_spec.rb +1024 -153
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -81
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +85 -53
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +83 -44
  224. data/lib/capybara/spec/spec_helper.rb +54 -44
  225. data/lib/capybara/spec/test_app.rb +158 -43
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +163 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  247. data/lib/capybara/spec/views/with_hover.erb +3 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +69 -12
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +30 -5
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope.erb +2 -2
  256. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  257. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  258. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  259. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  260. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  261. data/lib/capybara/spec/views/with_windows.erb +1 -1
  262. data/lib/capybara/spec/views/within_frames.erb +5 -2
  263. data/lib/capybara/version.rb +2 -1
  264. data/lib/capybara/window.rb +36 -34
  265. data/lib/capybara.rb +134 -107
  266. data/spec/basic_node_spec.rb +60 -34
  267. data/spec/capybara_spec.rb +63 -88
  268. data/spec/counter_spec.rb +35 -0
  269. data/spec/css_builder_spec.rb +101 -0
  270. data/spec/css_splitter_spec.rb +38 -0
  271. data/spec/dsl_spec.rb +85 -64
  272. data/spec/filter_set_spec.rb +27 -9
  273. data/spec/fixtures/certificate.pem +25 -0
  274. data/spec/fixtures/key.pem +27 -0
  275. data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
  276. data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
  277. data/spec/minitest_spec.rb +52 -7
  278. data/spec/minitest_spec_spec.rb +94 -63
  279. data/spec/per_session_config_spec.rb +14 -13
  280. data/spec/rack_test_spec.rb +194 -125
  281. data/spec/regexp_dissassembler_spec.rb +250 -0
  282. data/spec/result_spec.rb +111 -50
  283. data/spec/rspec/features_spec.rb +37 -31
  284. data/spec/rspec/scenarios_spec.rb +10 -8
  285. data/spec/rspec/shared_spec_matchers.rb +473 -422
  286. data/spec/rspec/views_spec.rb +5 -3
  287. data/spec/rspec_matchers_spec.rb +52 -11
  288. data/spec/rspec_spec.rb +109 -89
  289. data/spec/sauce_spec_chrome.rb +43 -0
  290. data/spec/selector_spec.rb +397 -68
  291. data/spec/selenium_spec_chrome.rb +187 -40
  292. data/spec/selenium_spec_chrome_remote.rb +96 -0
  293. data/spec/selenium_spec_edge.rb +60 -0
  294. data/spec/selenium_spec_firefox.rb +201 -41
  295. data/spec/selenium_spec_firefox_remote.rb +94 -0
  296. data/spec/selenium_spec_ie.rb +149 -0
  297. data/spec/selenium_spec_safari.rb +162 -0
  298. data/spec/server_spec.rb +213 -102
  299. data/spec/session_spec.rb +53 -16
  300. data/spec/shared_selenium_node.rb +79 -0
  301. data/spec/shared_selenium_session.rb +473 -122
  302. data/spec/spec_helper.rb +126 -7
  303. data/spec/whitespace_normalizer_spec.rb +54 -0
  304. data/spec/xpath_builder_spec.rb +93 -0
  305. metadata +355 -73
  306. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  307. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  308. data/.yard/yard_extensions.rb +0 -78
  309. data/lib/capybara/query.rb +0 -7
  310. data/lib/capybara/rspec/compound.rb +0 -95
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -234
  314. data/lib/capybara/spec/session/source_spec.rb +0 -0
  315. data/lib/capybara/spec/views/with_title.erb +0 -5
  316. data/spec/selenium_spec_marionette.rb +0 -127
@@ -1,118 +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 visible 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 visible 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 visible 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
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")
103
- end
104
-
105
- it "does nothing when button is disabled" do
106
- @session.visit('/form')
107
- expect do
108
- @session.click_link_or_button('Disabled button', disabled: false)
109
- end.to raise_error(Capybara::ElementNotFound)
113
+ expect(@session).to have_content('Bar')
110
114
  end
111
115
  end
112
116
 
113
- it "should return the element clicked" do
117
+ it 'should return the element clicked' do
114
118
  @session.visit('/with_html')
115
119
  link = @session.find(:link, 'Blank Anchor')
116
120
  expect(@session.click_link_or_button('Blank Anchor')).to eq link
117
121
  end
122
+
123
+ context 'with enable_aria_label' do
124
+ it 'should click on link' do
125
+ @session.visit('/with_html')
126
+ expect do
127
+ @session.click_link_or_button('Go to simple', enable_aria_label: true)
128
+ end.not_to raise_error
129
+ end
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
137
+ end
118
138
  end
@@ -1,205 +1,240 @@
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 visible 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
+ context 'with :href option given' do
80
+ it 'should find links with valid href' do
79
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
+ context 'with a regex :href option given' do
91
+ it 'should find a link matching an all-matching regex pattern' do
90
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+/'}/)
107
109
  end
108
110
 
109
111
  context 'href: nil' do
110
- it "should not raise an error on links with no href attribute" do
112
+ it 'should not raise an error on links with no href attribute' do
111
113
  expect { @session.click_link('No Href', href: nil) }.not_to raise_error
112
114
  end
113
115
 
114
- it "should raise an error if href attribute exists" do
115
- expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound)
116
- expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound)
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
117
130
  end
118
131
  end
119
132
  end
120
133
 
121
- it "should follow relative links" do
134
+ context 'with :target option given' do
135
+ it 'should find links with valid target' do
136
+ @session.click_link('labore', target: '_self')
137
+ expect(@session).to have_content('Bar')
138
+ end
139
+
140
+ it "should raise error if link wasn't found" do
141
+ expect { @session.click_link('labore', target: '_blank') }.to raise_error(Capybara::ElementNotFound, /Unable to find link "labore"/)
142
+ end
143
+ end
144
+
145
+ it 'should follow relative links' do
122
146
  @session.visit('/')
123
147
  @session.click_link('Relative')
124
148
  expect(@session).to have_content('This is a test')
125
149
  end
126
150
 
127
- it "should follow protocol relative links" do
151
+ it 'should follow protocol relative links' do
128
152
  @session.click_link('Protocol')
129
153
  expect(@session).to have_content('Another World')
130
154
  end
131
155
 
132
- it "should follow redirects" do
156
+ it 'should follow redirects' do
133
157
  @session.click_link('Redirect')
134
158
  expect(@session).to have_content('You landed')
135
159
  end
136
160
 
137
- it "should follow redirects back to itself" do
161
+ it 'should follow redirects back to itself' do
138
162
  @session.click_link('BackToMyself')
139
- expect(@session).to have_css('#referrer', text: /\/with_html$/)
163
+ expect(@session).to have_css('#referrer', text: %r{/with_html$})
140
164
  expect(@session).to have_content('This is a test')
141
165
  end
142
166
 
143
- it "should add query string to current URL with naked query string" do
167
+ it 'should add query string to current URL with naked query string' do
144
168
  @session.click_link('Naked Query String')
145
169
  expect(@session).to have_content('Query String sent')
146
170
  end
147
171
 
148
- it "should do nothing on anchor links" do
149
- @session.fill_in("test_field", with: 'blah')
172
+ it 'should do nothing on anchor links' do
173
+ @session.fill_in('test_field', with: 'blah')
150
174
  @session.click_link('Normal Anchor')
151
- expect(@session.find_field("test_field").value).to eq('blah')
175
+ expect(@session.find_field('test_field').value).to eq('blah')
152
176
  @session.click_link('Blank Anchor')
153
- expect(@session.find_field("test_field").value).to eq('blah')
177
+ expect(@session.find_field('test_field').value).to eq('blah')
154
178
  @session.click_link('Blank JS Anchor')
155
- expect(@session.find_field("test_field").value).to eq('blah')
179
+ expect(@session.find_field('test_field').value).to eq('blah')
156
180
  end
157
181
 
158
- it "should do nothing on URL+anchor links for the same page" do
159
- @session.fill_in("test_field", with: 'blah')
182
+ it 'should do nothing on URL+anchor links for the same page' do
183
+ @session.fill_in('test_field', with: 'blah')
160
184
  @session.click_link('Anchor on same page')
161
- expect(@session.find_field("test_field").value).to eq('blah')
185
+ expect(@session.find_field('test_field').value).to eq('blah')
162
186
  end
163
187
 
164
- it "should follow link on URL+anchor links for a different page" do
188
+ it 'should follow link on URL+anchor links for a different page' do
165
189
  @session.click_link('Anchor on different page')
166
190
  expect(@session).to have_content('Bar')
167
191
  end
168
192
 
169
- it "should follow link on anchor if the path has regex special characters" do
193
+ it 'should follow link on anchor if the path has regex special characters' do
170
194
  @session.visit('/with.*html')
171
195
  @session.click_link('Anchor on different page')
172
196
  expect(@session).to have_content('Bar')
173
197
  end
174
198
 
175
- it "should raise an error with links with no href" do
199
+ it 'should raise an error with links with no href' do
176
200
  expect do
177
201
  @session.click_link('No Href')
178
202
  end.to raise_error(Capybara::ElementNotFound)
179
203
  end
180
204
 
181
- context "with :exact option" do
182
- it "should accept partial matches when false" do
183
- @session.click_link('abo', exact: false)
205
+ context 'with :exact option' do
206
+ it 'should accept partial matches when false' do
207
+ @session.click_link('abo', exact: false)
184
208
  expect(@session).to have_content('Bar')
185
209
  end
186
210
 
187
- it "should not accept partial matches when true" do
211
+ it 'should not accept partial matches when true' do
188
212
  expect do
189
- @session.click_link('abo', exact: true)
213
+ @session.click_link('abo', exact: true)
190
214
  end.to raise_error(Capybara::ElementNotFound)
191
215
  end
192
216
  end
193
217
 
194
- context "without locator" do
195
- it "uses options" do
218
+ context 'without locator' do
219
+ it 'uses options' do
196
220
  @session.click_link(href: '/foo')
197
221
  expect(@session).to have_content('Another World')
198
222
  end
199
223
  end
200
224
 
201
- it "should return element clicked" do
225
+ it 'should return element clicked' do
202
226
  el = @session.find(:link, 'Normal Anchor')
203
227
  expect(@session.click_link('Normal Anchor')).to eq el
204
228
  end
229
+
230
+ it 'can download a file', requires: [:download] do
231
+ # This requires the driver used for the test to be configured
232
+ # to download documents with the mime type "text/csv"
233
+ download_file = File.join(Capybara.save_path, 'download.csv')
234
+ expect(File).not_to exist(download_file)
235
+ @session.click_link('Download Me')
236
+ sleep 2 # allow time for file to download
237
+ expect(File).to exist(download_file)
238
+ FileUtils.rm_rf download_file
239
+ end
205
240
  end
@@ -1,25 +1,26 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#current_scope' do
3
4
  before do
4
5
  @session.visit('/with_scope')
5
6
  end
6
-
7
- context "when not in a #within block" do
8
- it "should return the document" do
9
- expect(@session.current_scope).to be_kind_of Capybara::Node::Document
7
+
8
+ context 'when not in a #within block' do
9
+ it 'should return the document' do
10
+ expect(@session.current_scope).to be_a Capybara::Node::Document
10
11
  end
11
12
  end
12
-
13
- context "when in a #within block" do
14
- it "should return the element in scope" do
15
- @session.within(:css, "#simple_first_name") do
13
+
14
+ context 'when in a #within block' do
15
+ it 'should return the element in scope' do
16
+ @session.within(:css, '#simple_first_name') do
16
17
  expect(@session.current_scope[:name]).to eq 'first_name'
17
18
  end
18
19
  end
19
20
  end
20
-
21
- context "when in a nested #within block" do
22
- it "should return the element in scope" do
21
+
22
+ context 'when in a nested #within block' do
23
+ it 'should return the element in scope' do
23
24
  @session.within("//div[@id='for_bar']") do
24
25
  @session.within(".//input[@value='Peter']") do
25
26
  expect(@session.current_scope[:name]).to eq 'form[first_name]'