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,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
4
+ before do
5
+ @session.visit('/with_js')
6
+ end
7
+
8
+ it 'should accept the alert' do
9
+ @session.accept_alert do
10
+ @session.click_link('Open alert')
11
+ end
12
+ expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
13
+ end
14
+
15
+ it 'should accept the alert if the text matches' do
16
+ @session.accept_alert 'Alert opened' do
17
+ @session.click_link('Open alert')
18
+ end
19
+ expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
20
+ end
21
+
22
+ it 'should accept the alert if text contains "special" Regex characters' do
23
+ @session.accept_alert 'opened [*Yay?*]' do
24
+ @session.click_link('Open alert')
25
+ end
26
+ expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
27
+ end
28
+
29
+ it 'should accept the alert if the text matches a regexp' do
30
+ @session.accept_alert(/op.{2}ed/) do
31
+ @session.click_link('Open alert')
32
+ end
33
+ expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
34
+ end
35
+
36
+ it 'should not accept the alert if the text doesnt match' do
37
+ expect do
38
+ @session.accept_alert 'Incorrect Text' do
39
+ @session.click_link('Open alert')
40
+ end
41
+ end.to raise_error(Capybara::ModalNotFound)
42
+ end
43
+
44
+ it 'should return the message presented' do
45
+ message = @session.accept_alert do
46
+ @session.click_link('Open alert')
47
+ end
48
+ expect(message).to eq('Alert opened [*Yay?*]')
49
+ end
50
+
51
+ it 'should handle the alert if the page changes' do
52
+ @session.accept_alert do
53
+ @session.click_link('Alert page change')
54
+ sleep 1 # ensure page change occurs before the accept_alert block exits
55
+ end
56
+ expect(@session).to have_current_path('/with_html')
57
+ end
58
+
59
+ context 'with an asynchronous alert' do
60
+ it 'should accept the alert' do
61
+ @session.accept_alert do
62
+ @session.click_link('Open delayed alert')
63
+ end
64
+ expect(@session).to have_xpath("//a[@id='open-delayed-alert' and @opened='true']")
65
+ end
66
+
67
+ it 'should return the message presented' do
68
+ message = @session.accept_alert do
69
+ @session.click_link('Open delayed alert')
70
+ end
71
+ expect(message).to eq('Delayed alert opened')
72
+ end
73
+
74
+ it 'should allow to adjust the delay' do
75
+ @session.accept_alert wait: 10 do
76
+ @session.click_link('Open slow alert')
77
+ end
78
+ expect(@session).to have_xpath("//a[@id='open-slow-alert' and @opened='true']")
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#accept_confirm', requires: [:modals] do
4
+ before do
5
+ @session.visit('/with_js')
6
+ end
7
+
8
+ it 'should accept the confirm' do
9
+ @session.accept_confirm do
10
+ @session.click_link('Open confirm')
11
+ end
12
+ expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='true']")
13
+ end
14
+
15
+ it 'should return the message presented' do
16
+ message = @session.accept_confirm do
17
+ @session.click_link('Open confirm')
18
+ end
19
+ expect(message).to eq('Confirm opened')
20
+ end
21
+
22
+ it 'should work with nested modals' do
23
+ expect do
24
+ @session.dismiss_confirm 'Are you really sure?' do
25
+ @session.accept_confirm 'Are you sure?' do
26
+ @session.click_link('Open check twice')
27
+ end
28
+ end
29
+ end.not_to raise_error
30
+ expect(@session).to have_xpath("//a[@id='open-twice' and @confirmed='false']")
31
+ end
32
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
4
+ before do
5
+ @session.visit('/with_js')
6
+ end
7
+
8
+ it 'should accept the prompt with no message' do
9
+ @session.accept_prompt do
10
+ @session.click_link('Open prompt')
11
+ end
12
+ expect(@session).to have_xpath("//a[@id='open-prompt' and @response='']")
13
+ end
14
+
15
+ it 'should accept the prompt with no message when there is a default' do
16
+ @session.accept_prompt do
17
+ @session.click_link('Open defaulted prompt')
18
+ end
19
+ expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='Default value!']")
20
+ end
21
+
22
+ it 'should return the message presented' do
23
+ message = @session.accept_prompt do
24
+ @session.click_link('Open prompt')
25
+ end
26
+ expect(message).to eq('Prompt opened')
27
+ end
28
+
29
+ it 'should accept the prompt with a response' do
30
+ @session.accept_prompt with: 'the response' do
31
+ @session.click_link('Open prompt')
32
+ end
33
+ expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
34
+ end
35
+
36
+ it 'should accept the prompt with a response when there is a default' do
37
+ @session.accept_prompt with: 'the response' do
38
+ @session.click_link('Open defaulted prompt')
39
+ end
40
+ expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='the response']")
41
+ end
42
+
43
+ it 'should accept the prompt with a blank response when there is a default' do
44
+ @session.accept_prompt with: '' do
45
+ @session.click_link('Open defaulted prompt')
46
+ end
47
+ expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
48
+ end
49
+
50
+ it 'should allow special characters in the reponse' do
51
+ @session.accept_prompt with: '\'the\' \b "response"' do
52
+ @session.click_link('Open prompt')
53
+ end
54
+ expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
55
+ end
56
+
57
+ it 'should accept the prompt if the message matches' do
58
+ @session.accept_prompt 'Prompt opened', with: 'matched' do
59
+ @session.click_link('Open prompt')
60
+ end
61
+ expect(@session).to have_xpath("//a[@id='open-prompt' and @response='matched']")
62
+ end
63
+
64
+ it "should not accept the prompt if the message doesn't match" do
65
+ expect do
66
+ @session.accept_prompt 'Incorrect Text', with: 'not matched' do
67
+ @session.click_link('Open prompt')
68
+ end
69
+ end.to raise_error(Capybara::ModalNotFound)
70
+ end
71
+
72
+ it 'should return the message presented' do
73
+ message = @session.accept_prompt with: 'the response' do
74
+ @session.click_link('Open prompt')
75
+ end
76
+ expect(message).to eq('Prompt opened')
77
+ end
78
+ end
@@ -0,0 +1,278 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#all' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should find all elements using the given locator' do
9
+ expect(@session.all('//p').size).to eq(3)
10
+ expect(@session.all('//h1').first.text).to eq('This is a test')
11
+ expect(@session.all("//input[@id='test_field']").first.value).to eq('monkey')
12
+ end
13
+
14
+ it 'should return an empty array when nothing was found' do
15
+ expect(@session.all('//div[@id="nosuchthing"]')).to be_empty
16
+ end
17
+
18
+ it 'should wait for matching elements to appear', requires: [:js] do
19
+ Capybara.default_max_wait_time = 2
20
+ @session.visit('/with_js')
21
+ @session.click_link('Click me')
22
+ expect(@session.all(:css, 'a#has-been-clicked')).not_to be_empty
23
+ end
24
+
25
+ it 'should not wait if `minimum: 0` option is specified', requires: [:js] do
26
+ @session.visit('/with_js')
27
+ @session.click_link('Click me')
28
+ expect(@session.all(:css, 'a#has-been-clicked', minimum: 0)).to be_empty
29
+ end
30
+
31
+ it 'should accept an XPath instance', :exact_false do
32
+ @session.visit('/form')
33
+ @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('Name')
34
+ expect(@xpath).to be_a(::XPath::Union)
35
+ @result = @session.all(@xpath).map(&:value)
36
+ expect(@result).to include('Smith', 'John', 'John Smith')
37
+ end
38
+
39
+ it 'should allow reversing the order' do
40
+ @session.visit('/form')
41
+ fields = @session.all(:fillable_field, 'Name', exact: false).to_a
42
+ reverse_fields = @session.all(:fillable_field, 'Name', order: :reverse, exact: false).to_a
43
+ expect(fields).to eq(reverse_fields.reverse)
44
+ end
45
+
46
+ it 'should raise an error when given invalid options' do
47
+ expect { @session.all('//p', schmoo: 'foo') }.to raise_error(ArgumentError)
48
+ end
49
+
50
+ it 'should not reload by default', requires: [:driver] do
51
+ paras = @session.all(:css, 'p', minimum: 3)
52
+ expect { paras[0].text }.not_to raise_error
53
+ @session.refresh
54
+ expect { paras[0].text }.to raise_error do |err|
55
+ expect(err).to be_an_invalid_element_error(@session)
56
+ end
57
+ end
58
+
59
+ context 'with allow_reload' do
60
+ it 'should reload if true' do
61
+ paras = @session.all(:css, 'p', allow_reload: true, minimum: 3)
62
+ expect { paras[0].text }.not_to raise_error
63
+ @session.refresh
64
+ sleep 1 # Ensure page has started to reload
65
+ expect(paras[0]).to have_text('Lorem ipsum dolor')
66
+ expect(paras[1]).to have_text('Duis aute irure dolor')
67
+ end
68
+
69
+ it 'should not reload if false', requires: [:driver] do
70
+ paras = @session.all(:css, 'p', allow_reload: false, minimum: 3)
71
+ expect { paras[0].text }.not_to raise_error
72
+ @session.refresh
73
+ sleep 1 # Ensure page has started to reload
74
+ expect { paras[0].text }.to raise_error do |err|
75
+ expect(err).to be_an_invalid_element_error(@session)
76
+ end
77
+ expect { paras[2].text }.to raise_error do |err|
78
+ expect(err).to be_an_invalid_element_error(@session)
79
+ end
80
+ end
81
+ end
82
+
83
+ context 'with css selectors' do
84
+ it 'should find all elements using the given selector' do
85
+ expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
86
+ expect(@session.all(:css, "input[id='test_field']").first.value).to eq('monkey')
87
+ end
88
+
89
+ it 'should find all elements when given a list of selectors' do
90
+ expect(@session.all(:css, 'h1, p').size).to eq(4)
91
+ end
92
+ end
93
+
94
+ context 'with xpath selectors' do
95
+ it 'should find the first element using the given locator' do
96
+ expect(@session.all(:xpath, '//h1').first.text).to eq('This is a test')
97
+ expect(@session.all(:xpath, "//input[@id='test_field']").first.value).to eq('monkey')
98
+ end
99
+
100
+ it 'should use alternated regex for :id' do
101
+ expect(@session.all(:xpath, './/h2', id: /h2/).unfiltered_size).to eq 3
102
+ expect(@session.all(:xpath, './/h2', id: /h2(one|two)/).unfiltered_size).to eq 2
103
+ end
104
+ end
105
+
106
+ context 'with css as default selector' do
107
+ before { Capybara.default_selector = :css }
108
+
109
+ it 'should find the first element using the given locator' do
110
+ expect(@session.all('h1').first.text).to eq('This is a test')
111
+ expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
112
+ end
113
+ end
114
+
115
+ context 'with visible filter' do
116
+ it 'should only find visible nodes when true' do
117
+ expect(@session.all(:css, 'a.simple', visible: true).size).to eq(1)
118
+ end
119
+
120
+ it 'should find nodes regardless of whether they are invisible when false' do
121
+ expect(@session.all(:css, 'a.simple', visible: false).size).to eq(2)
122
+ end
123
+
124
+ it 'should default to Capybara.ignore_hidden_elements' do
125
+ Capybara.ignore_hidden_elements = true
126
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
127
+ Capybara.ignore_hidden_elements = false
128
+ expect(@session.all(:css, 'a.simple').size).to eq(2)
129
+ end
130
+
131
+ context 'with per session config', requires: [:psc] do
132
+ it 'should use the sessions ignore_hidden_elements', psc: true do
133
+ Capybara.ignore_hidden_elements = true
134
+ @session.config.ignore_hidden_elements = false
135
+ expect(Capybara.ignore_hidden_elements).to eq(true)
136
+ expect(@session.all(:css, 'a.simple').size).to eq(2)
137
+ @session.config.ignore_hidden_elements = true
138
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
139
+ end
140
+ end
141
+ end
142
+
143
+ context 'with obscured filter', requires: [:css] do
144
+ it 'should only find nodes on top in the viewport when false' do
145
+ expect(@session.all(:css, 'a.simple', obscured: false).size).to eq(1)
146
+ end
147
+
148
+ it 'should not find nodes on top outside the viewport when false' do
149
+ expect(@session.all(:link, 'Download Me', obscured: false).size).to eq(0)
150
+ @session.scroll_to(@session.find_link('Download Me'))
151
+ expect(@session.all(:link, 'Download Me', obscured: false).size).to eq(1)
152
+ end
153
+
154
+ it 'should find top nodes outside the viewport when true' do
155
+ expect(@session.all(:link, 'Download Me', obscured: true).size).to eq(1)
156
+ @session.scroll_to(@session.find_link('Download Me'))
157
+ expect(@session.all(:link, 'Download Me', obscured: true).size).to eq(0)
158
+ end
159
+
160
+ it 'should only find non-top nodes when true' do
161
+ # Also need visible: false so visibility is ignored
162
+ expect(@session.all(:css, 'a.simple', visible: false, obscured: true).size).to eq(1)
163
+ end
164
+ end
165
+
166
+ context 'with element count filters' do
167
+ context ':count' do
168
+ it 'should succeed when the number of elements founds matches the expectation' do
169
+ expect { @session.all(:css, 'h1, p', count: 4) }.not_to raise_error
170
+ end
171
+
172
+ it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
173
+ expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
174
+ end
175
+ end
176
+
177
+ context ':minimum' do
178
+ it 'should succeed when the number of elements founds matches the expectation' do
179
+ expect { @session.all(:css, 'h1, p', minimum: 0) }.not_to raise_error
180
+ end
181
+
182
+ it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
183
+ expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
184
+ end
185
+ end
186
+
187
+ context ':maximum' do
188
+ it 'should succeed when the number of elements founds matches the expectation' do
189
+ expect { @session.all(:css, 'h1, p', maximum: 4) }.not_to raise_error
190
+ end
191
+
192
+ it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
193
+ expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
194
+ end
195
+ end
196
+
197
+ context ':between' do
198
+ it 'should succeed when the number of elements founds matches the expectation' do
199
+ expect { @session.all(:css, 'h1, p', between: 2..7) }.not_to raise_error
200
+ end
201
+
202
+ it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
203
+ expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
204
+ end
205
+
206
+ eval <<~TEST, binding, __FILE__, __LINE__ + 1 if RUBY_VERSION.to_f > 2.5
207
+ it'treats an endless range as minimum' do
208
+ expect { @session.all(:css, 'h1, p', between: 2..) }.not_to raise_error
209
+ expect { @session.all(:css, 'h1, p', between: 5..) }.to raise_error(Capybara::ExpectationNotMet)
210
+ end
211
+ TEST
212
+
213
+ eval <<~TEST, binding, __FILE__, __LINE__ + 1 if RUBY_VERSION.to_f > 2.6
214
+ it'treats a beginless range as maximum' do
215
+ expect { @session.all(:css, 'h1, p', between: ..7) }.not_to raise_error
216
+ expect { @session.all(:css, 'h1, p', between: ..3) }.to raise_error(Capybara::ExpectationNotMet)
217
+ end
218
+ TEST
219
+ end
220
+
221
+ context 'with multiple count filters' do
222
+ it 'ignores other filters when :count is specified' do
223
+ o = { count: 4,
224
+ minimum: 5,
225
+ maximum: 0,
226
+ between: 0..3 }
227
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
228
+ end
229
+
230
+ context 'with no :count expectation' do
231
+ it 'fails if :minimum is not met' do
232
+ o = { minimum: 5,
233
+ maximum: 4,
234
+ between: 2..7 }
235
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
236
+ end
237
+
238
+ it 'fails if :maximum is not met' do
239
+ o = { minimum: 0,
240
+ maximum: 0,
241
+ between: 2..7 }
242
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
243
+ end
244
+
245
+ it 'fails if :between is not met' do
246
+ o = { minimum: 0,
247
+ maximum: 4,
248
+ between: 0..3 }
249
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
250
+ end
251
+
252
+ it 'succeeds if all combineable expectations are met' do
253
+ o = { minimum: 0,
254
+ maximum: 4,
255
+ between: 2..7 }
256
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ context 'within a scope' do
263
+ before do
264
+ @session.visit('/with_scope')
265
+ end
266
+
267
+ it 'should find any element using the given locator' do
268
+ @session.within(:xpath, "//div[@id='for_bar']") do
269
+ expect(@session.all('.//li').size).to eq(2)
270
+ end
271
+ end
272
+ end
273
+
274
+ it 'should have #find_all as an alias' do
275
+ expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
276
+ expect(@session.find_all('//p').size).to eq(3)
277
+ end
278
+ end