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,157 +1,277 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#all" do
2
+
3
+ Capybara::SpecHelper.spec '#all' do
3
4
  before do
4
5
  @session.visit('/with_html')
5
6
  end
6
7
 
7
- it "should find all elements using the given locator" do
8
+ it 'should find all elements using the given locator' do
8
9
  expect(@session.all('//p').size).to eq(3)
9
10
  expect(@session.all('//h1').first.text).to eq('This is a test')
10
- expect(@session.all("//input[@id='test_field']").first[:value]).to eq('monkey')
11
+ expect(@session.all("//input[@id='test_field']").first.value).to eq('monkey')
11
12
  end
12
13
 
13
- it "should return an empty array when nothing was found" do
14
+ it 'should return an empty array when nothing was found' do
14
15
  expect(@session.all('//div[@id="nosuchthing"]')).to be_empty
15
16
  end
16
17
 
17
- it "should accept an XPath instance" do
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
18
32
  @session.visit('/form')
19
- @xpath = XPath::HTML.fillable_field('Name')
20
- @result = @session.all(@xpath).map { |r| r.value }
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)
21
36
  expect(@result).to include('Smith', 'John', 'John Smith')
22
37
  end
23
38
 
24
- it "should raise an error when given invalid options" do
25
- expect { @session.all('//p', :schmoo => "foo") }.to raise_error(ArgumentError)
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
26
81
  end
27
82
 
28
- context "with css selectors" do
29
- it "should find all elements using the given selector" do
83
+ context 'with css selectors' do
84
+ it 'should find all elements using the given selector' do
30
85
  expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
31
- expect(@session.all(:css, "input[id='test_field']").first[:value]).to eq('monkey')
86
+ expect(@session.all(:css, "input[id='test_field']").first.value).to eq('monkey')
32
87
  end
33
88
 
34
- it "should find all elements when given a list of selectors" do
89
+ it 'should find all elements when given a list of selectors' do
35
90
  expect(@session.all(:css, 'h1, p').size).to eq(4)
36
91
  end
37
92
  end
38
93
 
39
- context "with xpath selectors" do
40
- it "should find the first element using the given locator" do
94
+ context 'with xpath selectors' do
95
+ it 'should find the first element using the given locator' do
41
96
  expect(@session.all(:xpath, '//h1').first.text).to eq('This is a test')
42
- expect(@session.all(:xpath, "//input[@id='test_field']").first[:value]).to eq('monkey')
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
43
103
  end
44
104
  end
45
105
 
46
- context "with css as default selector" do
106
+ context 'with css as default selector' do
47
107
  before { Capybara.default_selector = :css }
48
- it "should find the first element using the given locator" do
108
+
109
+ it 'should find the first element using the given locator' do
49
110
  expect(@session.all('h1').first.text).to eq('This is a test')
50
- expect(@session.all("input[id='test_field']").first[:value]).to eq('monkey')
111
+ expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
51
112
  end
52
113
  end
53
114
 
54
- context "with visible filter" do
55
- it "should only find visible nodes when true" do
56
- expect(@session.all(:css, "a.simple", :visible => true).size).to eq(1)
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)
57
118
  end
58
119
 
59
- it "should find nodes regardless of whether they are invisible when false" do
60
- expect(@session.all(:css, "a.simple", :visible => false).size).to eq(2)
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)
61
122
  end
62
123
 
63
- it "should default to Capybara.ignore_hidden_elements" do
124
+ it 'should default to Capybara.ignore_hidden_elements' do
64
125
  Capybara.ignore_hidden_elements = true
65
- expect(@session.all(:css, "a.simple").size).to eq(1)
126
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
66
127
  Capybara.ignore_hidden_elements = false
67
- expect(@session.all(:css, "a.simple").size).to eq(2)
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)
68
163
  end
69
164
  end
70
165
 
71
166
  context 'with element count filters' do
72
167
  context ':count' do
73
168
  it 'should succeed when the number of elements founds matches the expectation' do
74
- expect { @session.all(:css, 'h1, p', :count => 4) }.to_not raise_error
169
+ expect { @session.all(:css, 'h1, p', count: 4) }.not_to raise_error
75
170
  end
171
+
76
172
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
77
- expect { @session.all(:css, 'h1, p', :count => 5) }.to raise_error(Capybara::ExpectationNotMet)
173
+ expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
78
174
  end
79
175
  end
176
+
80
177
  context ':minimum' do
81
178
  it 'should succeed when the number of elements founds matches the expectation' do
82
- expect { @session.all(:css, 'h1, p', :minimum => 0) }.to_not raise_error
179
+ expect { @session.all(:css, 'h1, p', minimum: 0) }.not_to raise_error
83
180
  end
181
+
84
182
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
85
- expect { @session.all(:css, 'h1, p', :minimum => 5) }.to raise_error(Capybara::ExpectationNotMet)
183
+ expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
86
184
  end
87
185
  end
186
+
88
187
  context ':maximum' do
89
188
  it 'should succeed when the number of elements founds matches the expectation' do
90
- expect { @session.all(:css, 'h1, p', :maximum => 4) }.to_not raise_error
189
+ expect { @session.all(:css, 'h1, p', maximum: 4) }.not_to raise_error
91
190
  end
191
+
92
192
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
93
- expect { @session.all(:css, 'h1, p', :maximum => 0) }.to raise_error(Capybara::ExpectationNotMet)
193
+ expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
94
194
  end
95
195
  end
196
+
96
197
  context ':between' do
97
198
  it 'should succeed when the number of elements founds matches the expectation' do
98
- expect { @session.all(:css, 'h1, p', :between => 2..7) }.to_not raise_error
199
+ expect { @session.all(:css, 'h1, p', between: 2..7) }.not_to raise_error
99
200
  end
201
+
100
202
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
101
- expect { @session.all(:css, 'h1, p', :between => 0..3) }.to raise_error(Capybara::ExpectationNotMet)
203
+ expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
102
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
103
219
  end
104
220
 
105
221
  context 'with multiple count filters' do
106
222
  it 'ignores other filters when :count is specified' do
107
- o = {:count => 4,
108
- :minimum => 5,
109
- :maximum => 0,
110
- :between => 0..3}
111
- expect { @session.all(:css, 'h1, p', o) }.to_not raise_error
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
112
228
  end
229
+
113
230
  context 'with no :count expectation' do
114
231
  it 'fails if :minimum is not met' do
115
- o = {:minimum => 5,
116
- :maximum => 4,
117
- :between => 2..7}
118
- expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
232
+ o = { minimum: 5,
233
+ maximum: 4,
234
+ between: 2..7 }
235
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
119
236
  end
237
+
120
238
  it 'fails if :maximum is not met' do
121
- o = {:minimum => 0,
122
- :maximum => 0,
123
- :between => 2..7}
124
- expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
239
+ o = { minimum: 0,
240
+ maximum: 0,
241
+ between: 2..7 }
242
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
125
243
  end
244
+
126
245
  it 'fails if :between is not met' do
127
- o = {:minimum => 0,
128
- :maximum => 4,
129
- :between => 0..3}
130
- expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
246
+ o = { minimum: 0,
247
+ maximum: 4,
248
+ between: 0..3 }
249
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
131
250
  end
251
+
132
252
  it 'succeeds if all combineable expectations are met' do
133
- o = {:minimum => 0,
134
- :maximum => 4,
135
- :between => 2..7}
136
- expect { @session.all(:css, 'h1, p', o) }.to_not raise_error
253
+ o = { minimum: 0,
254
+ maximum: 4,
255
+ between: 2..7 }
256
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
137
257
  end
138
258
  end
139
259
  end
140
260
  end
141
261
 
142
- context "within a scope" do
262
+ context 'within a scope' do
143
263
  before do
144
264
  @session.visit('/with_scope')
145
265
  end
146
266
 
147
- it "should find any element using the given locator" do
267
+ it 'should find any element using the given locator' do
148
268
  @session.within(:xpath, "//div[@id='for_bar']") do
149
269
  expect(@session.all('.//li').size).to eq(2)
150
270
  end
151
271
  end
152
272
  end
153
273
 
154
- it "should have #find_all as an alias" do
274
+ it 'should have #find_all as an alias' do
155
275
  expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
156
276
  expect(@session.find_all('//p').size).to eq(3)
157
277
  end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#ancestor' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ after do
9
+ Capybara::Selector.remove(:monkey)
10
+ end
11
+
12
+ it 'should find the ancestor element using the given locator' do
13
+ el = @session.find(:css, '#first_image')
14
+ expect(el.ancestor('//p')).to have_text('Lorem ipsum dolor')
15
+ expect(el.ancestor('//a')[:'aria-label']).to eq('Go to simple')
16
+ end
17
+
18
+ it 'should find the ancestor element using the given locator and options' do
19
+ el = @session.find(:css, '#child')
20
+ expect(el.ancestor('//div', text: "Ancestor\nAncestor\nAncestor")[:id]).to eq('ancestor3')
21
+ end
22
+
23
+ it 'should find the closest ancestor' do
24
+ el = @session.find(:css, '#child')
25
+ expect(el.ancestor('.//div', order: :reverse, match: :first)[:id]).to eq('ancestor1')
26
+ end
27
+
28
+ it 'should raise an error if there are multiple matches' do
29
+ el = @session.find(:css, '#child')
30
+ expect { el.ancestor('//div') }.to raise_error(Capybara::Ambiguous)
31
+ expect { el.ancestor('//div', text: 'Ancestor') }.to raise_error(Capybara::Ambiguous)
32
+ end
33
+
34
+ context 'with css selectors' do
35
+ it 'should find the first element using the given locator' do
36
+ el = @session.find(:css, '#first_image')
37
+ expect(el.ancestor(:css, 'p')).to have_text('Lorem ipsum dolor')
38
+ expect(el.ancestor(:css, 'a')[:'aria-label']).to eq('Go to simple')
39
+ end
40
+
41
+ it 'should support pseudo selectors' do
42
+ el = @session.find(:css, '#button_img')
43
+ expect(el.ancestor(:css, 'button:disabled')[:id]).to eq('ancestor_button')
44
+ end
45
+ end
46
+
47
+ context 'with xpath selectors' do
48
+ it 'should find the first element using the given locator' do
49
+ el = @session.find(:css, '#first_image')
50
+ expect(el.ancestor(:xpath, '//p')).to have_text('Lorem ipsum dolor')
51
+ expect(el.ancestor(:xpath, '//a')[:'aria-label']).to eq('Go to simple')
52
+ end
53
+ end
54
+
55
+ context 'with custom selector' do
56
+ it 'should use the custom selector' do
57
+ Capybara.add_selector(:level) do
58
+ xpath { |num| ".//*[@id='ancestor#{num}']" }
59
+ end
60
+ el = @session.find(:css, '#child')
61
+ expect(el.ancestor(:level, 1)[:id]).to eq 'ancestor1'
62
+ expect(el.ancestor(:level, 3)[:id]).to eq 'ancestor3'
63
+ end
64
+ end
65
+
66
+ it 'should raise ElementNotFound with a useful default message if nothing was found' do
67
+ el = @session.find(:css, '#child')
68
+ expect do
69
+ el.ancestor(:xpath, '//div[@id="nosuchthing"]')
70
+ end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is an ancestor of visible css "#child"')
71
+ end
72
+
73
+ context 'within a scope' do
74
+ it 'should limit the ancestors to inside the scope' do
75
+ @session.within(:css, '#ancestor2') do
76
+ el = @session.find(:css, '#child')
77
+ expect(el.ancestor(:css, 'div', text: 'Ancestor')[:id]).to eq('ancestor1')
78
+ end
79
+ end
80
+ end
81
+
82
+ it 'should raise if selector type is unknown' do
83
+ el = @session.find(:css, '#child')
84
+ expect do
85
+ el.ancestor(:unknown, '//h1')
86
+ end.to raise_error(ArgumentError)
87
+ end
88
+ end
@@ -0,0 +1,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_all_of_selectors' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be true if the given selectors are on the page' do
9
+ @session.assert_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
10
+ end
11
+
12
+ it 'should be false if any of the given selectors are not on the page' do
13
+ expect { @session.assert_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one') }.to raise_error(Capybara::ElementNotFound)
14
+ end
15
+
16
+ it 'should use default selector' do
17
+ Capybara.default_selector = :css
18
+ expect { @session.assert_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one') }.to raise_error(Capybara::ElementNotFound)
19
+ @session.assert_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
20
+ end
21
+
22
+ it 'should support filter block' do
23
+ expect { @session.assert_all_of_selectors(:css, 'h2#h2one', 'h2#h2two') { |n| n[:id] == 'h2one' } }.to raise_error(Capybara::ElementNotFound, /custom filter block/)
24
+ end
25
+
26
+ context 'should respect scopes' do
27
+ it 'when used with `within`' do
28
+ @session.within "//p[@id='first']" do
29
+ @session.assert_all_of_selectors(".//a[@id='foo']")
30
+ expect { @session.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
31
+ end
32
+ end
33
+
34
+ it 'when called on elements' do
35
+ el = @session.find "//p[@id='first']"
36
+ el.assert_all_of_selectors(".//a[@id='foo']")
37
+ expect { el.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
38
+ end
39
+ end
40
+
41
+ context 'with options' do
42
+ it 'should apply options to all locators' do
43
+ @session.assert_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
44
+ expect { @session.assert_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea) }.to raise_error(Capybara::ElementNotFound)
45
+ end
46
+ end
47
+
48
+ context 'with wait', requires: [:js] do
49
+ it 'should not raise error if all the elements appear before given wait duration' do
50
+ Capybara.using_wait_time(0.1) do
51
+ @session.visit('/with_js')
52
+ @session.click_link('Click me')
53
+ @session.assert_all_of_selectors(:css, 'a#clickable', 'a#has-been-clicked', '#drag', wait: 1.5)
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ Capybara::SpecHelper.spec '#assert_none_of_selectors' do
60
+ before do
61
+ @session.visit('/with_html')
62
+ end
63
+
64
+ it 'should be false if any of the given locators are on the page' do
65
+ expect { @session.assert_none_of_selectors(:xpath, '//p', '//a') }.to raise_error(Capybara::ElementNotFound)
66
+ expect { @session.assert_none_of_selectors(:xpath, '//abbr', '//a') }.to raise_error(Capybara::ElementNotFound)
67
+ expect { @session.assert_none_of_selectors(:css, 'p a#foo') }.to raise_error(Capybara::ElementNotFound)
68
+ end
69
+
70
+ it 'should be true if none of the given locators are on the page' do
71
+ @session.assert_none_of_selectors(:xpath, '//abbr', '//td')
72
+ @session.assert_none_of_selectors(:css, 'p a#doesnotexist', 'abbr')
73
+ end
74
+
75
+ it 'should use default selector' do
76
+ Capybara.default_selector = :css
77
+ @session.assert_none_of_selectors('p a#doesnotexist', 'abbr')
78
+ expect { @session.assert_none_of_selectors('abbr', 'p a#foo') }.to raise_error(Capybara::ElementNotFound)
79
+ end
80
+
81
+ context 'should respect scopes' do
82
+ it 'when used with `within`' do
83
+ @session.within "//p[@id='first']" do
84
+ expect { @session.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
85
+ @session.assert_none_of_selectors(".//a[@id='red']")
86
+ end
87
+ end
88
+
89
+ it 'when called on an element' do
90
+ el = @session.find "//p[@id='first']"
91
+ expect { el.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
92
+ el.assert_none_of_selectors(".//a[@id='red']")
93
+ end
94
+ end
95
+
96
+ context 'with options' do
97
+ it 'should apply the options to all locators' do
98
+ expect { @session.assert_none_of_selectors('//p//a', text: 'Redirect') }.to raise_error(Capybara::ElementNotFound)
99
+ @session.assert_none_of_selectors('//p', text: 'Doesnotexist')
100
+ end
101
+
102
+ it 'should discard all matches where the given regexp is matched' do
103
+ expect { @session.assert_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1) }.to raise_error(Capybara::ElementNotFound)
104
+ @session.assert_none_of_selectors('//p//a', text: /Red$/)
105
+ end
106
+ end
107
+
108
+ context 'with wait', requires: [:js] do
109
+ it 'should not find elements if they appear after given wait duration' do
110
+ @session.visit('/with_js')
111
+ @session.click_link('Click me')
112
+ @session.assert_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
113
+ end
114
+ end
115
+ end
116
+
117
+ Capybara::SpecHelper.spec '#assert_any_of_selectors' do
118
+ before do
119
+ @session.visit('/with_html')
120
+ end
121
+
122
+ it 'should be true if any of the given selectors are on the page' do
123
+ @session.assert_any_of_selectors(:css, 'a#foo', 'h2#h2three')
124
+ @session.assert_any_of_selectors(:css, 'h2#h2three', 'a#foo')
125
+ end
126
+
127
+ it 'should be false if none of the given selectors are on the page' do
128
+ expect { @session.assert_any_of_selectors(:css, 'h2#h2three', 'h4#h4four') }.to raise_error(Capybara::ElementNotFound)
129
+ end
130
+
131
+ it 'should use default selector' do
132
+ Capybara.default_selector = :css
133
+ expect { @session.assert_any_of_selectors('h2#h2three', 'h5#h5five') }.to raise_error(Capybara::ElementNotFound)
134
+ @session.assert_any_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
135
+ end
136
+
137
+ it 'should support filter block' do
138
+ expect { @session.assert_any_of_selectors(:css, 'h2#h2one', 'h2#h2two') { |_n| false } }.to raise_error(Capybara::ElementNotFound, /custom filter block/)
139
+ end
140
+ end