capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +85 -8
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +460 -170
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -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/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +126 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +135 -44
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +958 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  206. data/lib/capybara/spec/session/select_spec.rb +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +46 -11
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -1,130 +1,217 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Capybara::SpecHelper.spec "#all" do
3
+ Capybara::SpecHelper.spec '#all' do
4
4
  before do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- it "should find all elements using the given locator" do
8
+ it 'should find all elements using the given locator' do
9
9
  expect(@session.all('//p').size).to eq(3)
10
10
  expect(@session.all('//h1').first.text).to eq('This is a test')
11
11
  expect(@session.all("//input[@id='test_field']").first.value).to eq('monkey')
12
12
  end
13
13
 
14
- it "should return an empty array when nothing was found" do
14
+ it 'should return an empty array when nothing was found' do
15
15
  expect(@session.all('//div[@id="nosuchthing"]')).to be_empty
16
16
  end
17
17
 
18
- it "should wait for matching elements to appear", requires: [:js] do
18
+ it 'should wait for matching elements to appear', requires: [:js] do
19
+ Capybara.default_max_wait_time = 2
19
20
  @session.visit('/with_js')
20
21
  @session.click_link('Click me')
21
- expect(@session.all(:css, "a#has-been-clicked")).not_to be_empty
22
+ expect(@session.all(:css, 'a#has-been-clicked')).not_to be_empty
22
23
  end
23
24
 
24
- it "should not wait if `minimum: 0` option is specified", requires: [:js] do
25
+ it 'should not wait if `minimum: 0` option is specified', requires: [:js] do
25
26
  @session.visit('/with_js')
26
27
  @session.click_link('Click me')
27
- expect(@session.all(:css, "a#has-been-clicked", minimum: 0)).to be_empty
28
+ expect(@session.all(:css, 'a#has-been-clicked', minimum: 0)).to be_empty
28
29
  end
29
30
 
30
- it "should accept an XPath instance", :exact_false do
31
+ it 'should accept an XPath instance', :exact_false do
31
32
  @session.visit('/form')
32
- @xpath = Capybara::Selector.all[:fillable_field].call('Name')
33
- expect(@xpath).to be_a(::XPath::Union)
33
+ @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('Name')
34
+ expect(@xpath).to be_a(XPath::Union)
34
35
  @result = @session.all(@xpath).map(&:value)
35
36
  expect(@result).to include('Smith', 'John', 'John Smith')
36
37
  end
37
38
 
38
- it "should raise an error when given invalid options" do
39
- 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
40
81
  end
41
82
 
42
- context "with css selectors" do
43
- 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
44
85
  expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
45
86
  expect(@session.all(:css, "input[id='test_field']").first.value).to eq('monkey')
46
87
  end
47
88
 
48
- 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
49
90
  expect(@session.all(:css, 'h1, p').size).to eq(4)
50
91
  end
51
92
  end
52
93
 
53
- context "with xpath selectors" do
54
- 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
55
96
  expect(@session.all(:xpath, '//h1').first.text).to eq('This is a test')
56
97
  expect(@session.all(:xpath, "//input[@id='test_field']").first.value).to eq('monkey')
57
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
58
104
  end
59
105
 
60
- context "with css as default selector" do
106
+ context 'with css as default selector' do
61
107
  before { Capybara.default_selector = :css }
62
- it "should find the first element using the given locator" do
108
+
109
+ it 'should find the first element using the given locator' do
63
110
  expect(@session.all('h1').first.text).to eq('This is a test')
64
111
  expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
65
112
  end
66
113
  end
67
114
 
68
- context "with visible filter" do
69
- it "should only find visible nodes when true" do
70
- 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)
71
118
  end
72
119
 
73
- it "should find nodes regardless of whether they are invisible when false" do
74
- 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)
75
122
  end
76
123
 
77
- it "should default to Capybara.ignore_hidden_elements" do
124
+ it 'should default to Capybara.ignore_hidden_elements' do
78
125
  Capybara.ignore_hidden_elements = true
79
- expect(@session.all(:css, "a.simple").size).to eq(1)
126
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
80
127
  Capybara.ignore_hidden_elements = false
81
- expect(@session.all(:css, "a.simple").size).to eq(2)
128
+ expect(@session.all(:css, 'a.simple').size).to eq(2)
82
129
  end
83
130
 
84
- context "with per session config", requires: [:psc] do
85
- 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
86
133
  Capybara.ignore_hidden_elements = true
87
134
  @session.config.ignore_hidden_elements = false
88
- expect(Capybara.ignore_hidden_elements).to eq(true)
89
- 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)
90
137
  @session.config.ignore_hidden_elements = true
91
- expect(@session.all(:css, "a.simple").size).to eq(1)
138
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
92
139
  end
93
140
  end
94
141
  end
95
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
+
96
166
  context 'with element count filters' do
97
167
  context ':count' do
98
168
  it 'should succeed when the number of elements founds matches the expectation' do
99
- 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
100
170
  end
171
+
101
172
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
102
173
  expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
103
174
  end
104
175
  end
176
+
105
177
  context ':minimum' do
106
178
  it 'should succeed when the number of elements founds matches the expectation' do
107
- 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
108
180
  end
181
+
109
182
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
110
183
  expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
111
184
  end
112
185
  end
186
+
113
187
  context ':maximum' do
114
188
  it 'should succeed when the number of elements founds matches the expectation' do
115
- 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
116
190
  end
191
+
117
192
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
118
193
  expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
119
194
  end
120
195
  end
196
+
121
197
  context ':between' do
122
198
  it 'should succeed when the number of elements founds matches the expectation' do
123
- 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
124
200
  end
201
+
125
202
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
126
203
  expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
127
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
128
215
  end
129
216
 
130
217
  context 'with multiple count filters' do
@@ -133,50 +220,54 @@ Capybara::SpecHelper.spec "#all" do
133
220
  minimum: 5,
134
221
  maximum: 0,
135
222
  between: 0..3 }
136
- expect { @session.all(:css, 'h1, p', o) }.to_not raise_error
223
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
137
224
  end
225
+
138
226
  context 'with no :count expectation' do
139
227
  it 'fails if :minimum is not met' do
140
228
  o = { minimum: 5,
141
229
  maximum: 4,
142
230
  between: 2..7 }
143
- expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
231
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
144
232
  end
233
+
145
234
  it 'fails if :maximum is not met' do
146
235
  o = { minimum: 0,
147
236
  maximum: 0,
148
237
  between: 2..7 }
149
- expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
238
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
150
239
  end
240
+
151
241
  it 'fails if :between is not met' do
152
242
  o = { minimum: 0,
153
243
  maximum: 4,
154
244
  between: 0..3 }
155
- expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
245
+ expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
156
246
  end
247
+
157
248
  it 'succeeds if all combineable expectations are met' do
158
249
  o = { minimum: 0,
159
250
  maximum: 4,
160
251
  between: 2..7 }
161
- expect { @session.all(:css, 'h1, p', o) }.to_not raise_error
252
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
162
253
  end
163
254
  end
164
255
  end
165
256
  end
166
257
 
167
- context "within a scope" do
258
+ context 'within a scope' do
168
259
  before do
169
260
  @session.visit('/with_scope')
170
261
  end
171
262
 
172
- it "should find any element using the given locator" do
263
+ it 'should find any element using the given locator' do
173
264
  @session.within(:xpath, "//div[@id='for_bar']") do
174
265
  expect(@session.all('.//li').size).to eq(2)
175
266
  end
176
267
  end
177
268
  end
178
269
 
179
- it "should have #find_all as an alias" do
270
+ it 'should have #find_all as an alias' do
180
271
  expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
181
272
  expect(@session.find_all('//p').size).to eq(3)
182
273
  end
@@ -9,64 +9,69 @@ Capybara::SpecHelper.spec '#ancestor' do
9
9
  Capybara::Selector.remove(:monkey)
10
10
  end
11
11
 
12
- it "should find the ancestor element using the given locator" do
12
+ it 'should find the ancestor element using the given locator' do
13
13
  el = @session.find(:css, '#first_image')
14
14
  expect(el.ancestor('//p')).to have_text('Lorem ipsum dolor')
15
- expect(el.ancestor("//a")[:'aria-label']).to eq('Go to simple')
15
+ expect(el.ancestor('//a')[:'aria-label']).to eq('Go to simple')
16
16
  end
17
17
 
18
- it "should find the ancestor element using the given locator and options" do
18
+ it 'should find the ancestor element using the given locator and options' do
19
19
  el = @session.find(:css, '#child')
20
20
  expect(el.ancestor('//div', text: "Ancestor\nAncestor\nAncestor")[:id]).to eq('ancestor3')
21
21
  end
22
22
 
23
- it "should raise an error if there are multiple matches" do
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
24
29
  el = @session.find(:css, '#child')
25
30
  expect { el.ancestor('//div') }.to raise_error(Capybara::Ambiguous)
26
31
  expect { el.ancestor('//div', text: 'Ancestor') }.to raise_error(Capybara::Ambiguous)
27
32
  end
28
33
 
29
- context "with css selectors" do
30
- 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
31
36
  el = @session.find(:css, '#first_image')
32
37
  expect(el.ancestor(:css, 'p')).to have_text('Lorem ipsum dolor')
33
38
  expect(el.ancestor(:css, 'a')[:'aria-label']).to eq('Go to simple')
34
39
  end
35
40
 
36
- it "should support pseudo selectors" do
41
+ it 'should support pseudo selectors' do
37
42
  el = @session.find(:css, '#button_img')
38
43
  expect(el.ancestor(:css, 'button:disabled')[:id]).to eq('ancestor_button')
39
44
  end
40
45
  end
41
46
 
42
- context "with xpath selectors" do
43
- 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
44
49
  el = @session.find(:css, '#first_image')
45
50
  expect(el.ancestor(:xpath, '//p')).to have_text('Lorem ipsum dolor')
46
- 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')
47
52
  end
48
53
  end
49
54
 
50
- context "with custom selector" do
51
- it "should use the custom selector" do
55
+ context 'with custom selector' do
56
+ it 'should use the custom selector' do
52
57
  Capybara.add_selector(:level) do
53
58
  xpath { |num| ".//*[@id='ancestor#{num}']" }
54
59
  end
55
60
  el = @session.find(:css, '#child')
56
- expect(el.ancestor(:level, 1)[:id]).to eq "ancestor1"
57
- expect(el.ancestor(:level, 3)[:id]).to eq "ancestor3"
61
+ expect(el.ancestor(:level, 1)[:id]).to eq 'ancestor1'
62
+ expect(el.ancestor(:level, 3)[:id]).to eq 'ancestor3'
58
63
  end
59
64
  end
60
65
 
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 visible 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
- context "within a scope" do
69
- 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
70
75
  @session.within(:css, '#ancestor2') do
71
76
  el = @session.find(:css, '#child')
72
77
  expect(el.ancestor(:css, 'div', text: 'Ancestor')[:id]).to eq('ancestor1')
@@ -74,7 +79,7 @@ Capybara::SpecHelper.spec '#ancestor' do
74
79
  end
75
80
  end
76
81
 
77
- it "should raise if selector type is unknown" do
82
+ it 'should raise if selector type is unknown' do
78
83
  el = @session.find(:css, '#child')
79
84
  expect do
80
85
  el.ancestor(:unknown, '//h1')
@@ -5,48 +5,52 @@ Capybara::SpecHelper.spec '#assert_all_of_selectors' do
5
5
  @session.visit('/with_html')
6
6
  end
7
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")
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
10
  end
11
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)
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
14
  end
15
15
 
16
- it "should use default selector" do
16
+ it 'should use default selector' do
17
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")
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
20
  end
21
21
 
22
- context "should respect scopes" do
23
- it "when used with `within`" do
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
24
28
  @session.within "//p[@id='first']" do
25
29
  @session.assert_all_of_selectors(".//a[@id='foo']")
26
30
  expect { @session.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
27
31
  end
28
32
  end
29
33
 
30
- it "when called on elements" do
34
+ it 'when called on elements' do
31
35
  el = @session.find "//p[@id='first']"
32
36
  el.assert_all_of_selectors(".//a[@id='foo']")
33
37
  expect { el.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
34
38
  end
35
39
  end
36
40
 
37
- context "with options" do
38
- it "should apply options to all locators" do
41
+ context 'with options' do
42
+ it 'should apply options to all locators' do
39
43
  @session.assert_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
40
44
  expect { @session.assert_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea) }.to raise_error(Capybara::ElementNotFound)
41
45
  end
42
46
  end
43
47
 
44
- context "with wait", requires: [:js] do
45
- 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
46
50
  Capybara.using_wait_time(0.1) do
47
51
  @session.visit('/with_js')
48
52
  @session.click_link('Click me')
49
- @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)
50
54
  end
51
55
  end
52
56
  end
@@ -57,55 +61,80 @@ Capybara::SpecHelper.spec '#assert_none_of_selectors' do
57
61
  @session.visit('/with_html')
58
62
  end
59
63
 
60
- it "should be false if any of the given locators are on the page" do
61
- expect { @session.assert_none_of_selectors(:xpath, "//p", "//a") }.to raise_error(Capybara::ElementNotFound)
62
- expect { @session.assert_none_of_selectors(:xpath, "//abbr", "//a") }.to raise_error(Capybara::ElementNotFound)
63
- 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)
64
68
  end
65
69
 
66
- it "should be true if none of the given locators are on the page" do
67
- @session.assert_none_of_selectors(:xpath, "//abbr", "//td")
68
- @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')
69
73
  end
70
74
 
71
- it "should use default selector" do
75
+ it 'should use default selector' do
72
76
  Capybara.default_selector = :css
73
- @session.assert_none_of_selectors("p a#doesnotexist", "abbr")
74
- 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)
75
79
  end
76
80
 
77
- context "should respect scopes" do
78
- it "when used with `within`" do
81
+ context 'should respect scopes' do
82
+ it 'when used with `within`' do
79
83
  @session.within "//p[@id='first']" do
80
84
  expect { @session.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
81
85
  @session.assert_none_of_selectors(".//a[@id='red']")
82
86
  end
83
87
  end
84
88
 
85
- it "when called on an element" do
89
+ it 'when called on an element' do
86
90
  el = @session.find "//p[@id='first']"
87
91
  expect { el.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
88
92
  el.assert_none_of_selectors(".//a[@id='red']")
89
93
  end
90
94
  end
91
95
 
92
- context "with options" do
93
- it "should apply the options to all locators" do
94
- expect { @session.assert_none_of_selectors("//p//a", text: "Redirect") }.to raise_error(Capybara::ElementNotFound)
95
- @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')
96
100
  end
97
101
 
98
- it "should discard all matches where the given regexp is matched" do
99
- expect { @session.assert_none_of_selectors("//p//a", text: /re[dab]i/i, count: 1) }.to raise_error(Capybara::ElementNotFound)
100
- @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$/)
101
105
  end
102
106
  end
103
107
 
104
- context "with wait", requires: [:js] do
105
- 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
106
110
  @session.visit('/with_js')
107
111
  @session.click_link('Click me')
108
- @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)
109
113
  end
110
114
  end
111
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