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