capybara 3.3.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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +803 -13
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +25 -9
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +17 -3
  9. data/lib/capybara/driver/node.rb +31 -6
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +31 -7
  12. data/lib/capybara/minitest/spec.rb +180 -88
  13. data/lib/capybara/minitest.rb +262 -149
  14. data/lib/capybara/node/actions.rb +202 -116
  15. data/lib/capybara/node/base.rb +34 -19
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +10 -12
  18. data/lib/capybara/node/element.rb +269 -115
  19. data/lib/capybara/node/finders.rb +99 -77
  20. data/lib/capybara/node/matchers.rb +327 -151
  21. data/lib/capybara/node/simple.rb +48 -13
  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 +8 -9
  25. data/lib/capybara/queries/base_query.rb +23 -16
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +1 -0
  28. data/lib/capybara/queries/selector_query.rb +587 -130
  29. data/lib/capybara/queries/sibling_query.rb +8 -6
  30. data/lib/capybara/queries/style_query.rb +6 -2
  31. data/lib/capybara/queries/text_query.rb +28 -14
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +92 -25
  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 +68 -41
  37. data/lib/capybara/rack_test/node.rb +106 -39
  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 +75 -52
  44. data/lib/capybara/rspec/features.rb +7 -7
  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 +141 -339
  60. data/lib/capybara/rspec.rb +2 -0
  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 +27 -25
  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 +73 -25
  88. data/lib/capybara/selector/filters/base.rb +24 -5
  89. data/lib/capybara/selector/filters/expression_filter.rb +3 -3
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -2
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +85 -348
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -447
  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 +255 -143
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
  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 +436 -134
  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 +56 -19
  123. data/lib/capybara/server/checker.rb +9 -3
  124. data/lib/capybara/server/middleware.rb +28 -12
  125. data/lib/capybara/server.rb +33 -10
  126. data/lib/capybara/session/config.rb +34 -10
  127. data/lib/capybara/session/matchers.rb +23 -16
  128. data/lib/capybara/session.rb +230 -170
  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 +121 -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 +127 -40
  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_spec.rb +21 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
  141. data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
  142. data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
  143. data/lib/capybara/spec/session/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 +6 -6
  146. data/lib/capybara/spec/session/check_spec.rb +102 -47
  147. data/lib/capybara/spec/session/choose_spec.rb +58 -32
  148. data/lib/capybara/spec/session/click_button_spec.rb +219 -163
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
  150. data/lib/capybara/spec/session/click_link_spec.rb +77 -54
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +38 -29
  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_spec.rb +8 -8
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -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 +101 -46
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  165. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  166. data/lib/capybara/spec/session/find_link_spec.rb +31 -21
  167. data/lib/capybara/spec/session/find_spec.rb +244 -141
  168. data/lib/capybara/spec/session/first_spec.rb +43 -43
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
  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 +94 -13
  179. data/lib/capybara/spec/session/has_css_spec.rb +272 -132
  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 +44 -4
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
  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_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 +894 -142
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
  199. data/lib/capybara/spec/session/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 +2 -2
  202. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
  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 +85 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +49 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +25 -24
  210. data/lib/capybara/spec/session/title_spec.rb +7 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +68 -49
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  216. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
  217. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
  218. data/lib/capybara/spec/session/window/window_spec.rb +62 -63
  219. data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
  220. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  221. data/lib/capybara/spec/session/within_spec.rb +79 -42
  222. data/lib/capybara/spec/spec_helper.rb +41 -53
  223. data/lib/capybara/spec/test_app.rb +132 -43
  224. data/lib/capybara/spec/views/animated.erb +49 -0
  225. data/lib/capybara/spec/views/form.erb +139 -42
  226. data/lib/capybara/spec/views/frame_child.erb +4 -3
  227. data/lib/capybara/spec/views/frame_one.erb +2 -1
  228. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  229. data/lib/capybara/spec/views/frame_two.erb +1 -1
  230. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  231. data/lib/capybara/spec/views/layout.erb +10 -0
  232. data/lib/capybara/spec/views/obscured.erb +47 -0
  233. data/lib/capybara/spec/views/offset.erb +33 -0
  234. data/lib/capybara/spec/views/path.erb +2 -2
  235. data/lib/capybara/spec/views/popup_one.erb +1 -1
  236. data/lib/capybara/spec/views/popup_two.erb +1 -1
  237. data/lib/capybara/spec/views/react.erb +45 -0
  238. data/lib/capybara/spec/views/scroll.erb +21 -0
  239. data/lib/capybara/spec/views/spatial.erb +31 -0
  240. data/lib/capybara/spec/views/tables.erb +67 -0
  241. data/lib/capybara/spec/views/with_animation.erb +39 -4
  242. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  243. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  244. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  245. data/lib/capybara/spec/views/with_hover.erb +3 -2
  246. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  247. data/lib/capybara/spec/views/with_html.erb +37 -9
  248. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  249. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  250. data/lib/capybara/spec/views/with_js.erb +26 -5
  251. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  252. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  253. data/lib/capybara/spec/views/with_scope.erb +2 -2
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +1 -1
  261. data/lib/capybara/version.rb +1 -1
  262. data/lib/capybara/window.rb +19 -25
  263. data/lib/capybara.rb +126 -111
  264. data/spec/basic_node_spec.rb +59 -34
  265. data/spec/capybara_spec.rb +56 -44
  266. data/spec/counter_spec.rb +35 -0
  267. data/spec/css_builder_spec.rb +101 -0
  268. data/spec/css_splitter_spec.rb +8 -8
  269. data/spec/dsl_spec.rb +79 -52
  270. data/spec/filter_set_spec.rb +9 -9
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +45 -7
  274. data/spec/minitest_spec_spec.rb +87 -64
  275. data/spec/per_session_config_spec.rb +6 -6
  276. data/spec/rack_test_spec.rb +172 -116
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +80 -72
  279. data/spec/rspec/features_spec.rb +21 -16
  280. data/spec/rspec/scenarios_spec.rb +10 -6
  281. data/spec/rspec/shared_spec_matchers.rb +407 -365
  282. data/spec/rspec/views_spec.rb +3 -3
  283. data/spec/rspec_matchers_spec.rb +35 -10
  284. data/spec/rspec_spec.rb +63 -41
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +334 -89
  287. data/spec/selenium_spec_chrome.rb +176 -62
  288. data/spec/selenium_spec_chrome_remote.rb +54 -14
  289. data/spec/selenium_spec_edge.rb +41 -8
  290. data/spec/selenium_spec_firefox.rb +228 -0
  291. data/spec/selenium_spec_firefox_remote.rb +94 -0
  292. data/spec/selenium_spec_ie.rb +129 -11
  293. data/spec/selenium_spec_safari.rb +162 -0
  294. data/spec/server_spec.rb +171 -97
  295. data/spec/session_spec.rb +34 -18
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +344 -80
  298. data/spec/spec_helper.rb +124 -2
  299. data/spec/whitespace_normalizer_spec.rb +54 -0
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +326 -28
  302. data/lib/capybara/rspec/compound.rb +0 -94
  303. data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
  304. data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
  305. data/lib/capybara/spec/session/has_style_spec.rb +0 -25
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -167
@@ -1,104 +1,174 @@
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
108
 
63
- it "should find the first element using the given locator" do
109
+ it 'should find the first element using the given locator' do
64
110
  expect(@session.all('h1').first.text).to eq('This is a test')
65
111
  expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
66
112
  end
67
113
  end
68
114
 
69
- context "with visible filter" do
70
- it "should only find visible nodes when true" do
71
- 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)
72
118
  end
73
119
 
74
- it "should find nodes regardless of whether they are invisible when false" do
75
- 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)
76
122
  end
77
123
 
78
- it "should default to Capybara.ignore_hidden_elements" do
124
+ it 'should default to Capybara.ignore_hidden_elements' do
79
125
  Capybara.ignore_hidden_elements = true
80
- expect(@session.all(:css, "a.simple").size).to eq(1)
126
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
81
127
  Capybara.ignore_hidden_elements = false
82
- expect(@session.all(:css, "a.simple").size).to eq(2)
128
+ expect(@session.all(:css, 'a.simple').size).to eq(2)
83
129
  end
84
130
 
85
- context "with per session config", requires: [:psc] do
86
- 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
87
133
  Capybara.ignore_hidden_elements = true
88
134
  @session.config.ignore_hidden_elements = false
89
- expect(Capybara.ignore_hidden_elements).to eq(true)
90
- 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)
91
137
  @session.config.ignore_hidden_elements = true
92
- expect(@session.all(:css, "a.simple").size).to eq(1)
138
+ expect(@session.all(:css, 'a.simple').size).to eq(1)
93
139
  end
94
140
  end
95
141
  end
96
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
+
97
166
  context 'with element count filters' do
98
167
  context ':count' do
99
168
  it 'should succeed when the number of elements founds matches the expectation' do
100
169
  expect { @session.all(:css, 'h1, p', count: 4) }.not_to raise_error
101
170
  end
171
+
102
172
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
103
173
  expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
104
174
  end
@@ -108,6 +178,7 @@ Capybara::SpecHelper.spec "#all" do
108
178
  it 'should succeed when the number of elements founds matches the expectation' do
109
179
  expect { @session.all(:css, 'h1, p', minimum: 0) }.not_to raise_error
110
180
  end
181
+
111
182
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
112
183
  expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
113
184
  end
@@ -117,6 +188,7 @@ Capybara::SpecHelper.spec "#all" do
117
188
  it 'should succeed when the number of elements founds matches the expectation' do
118
189
  expect { @session.all(:css, 'h1, p', maximum: 4) }.not_to raise_error
119
190
  end
191
+
120
192
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
121
193
  expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
122
194
  end
@@ -126,9 +198,20 @@ Capybara::SpecHelper.spec "#all" do
126
198
  it 'should succeed when the number of elements founds matches the expectation' do
127
199
  expect { @session.all(:css, 'h1, p', between: 2..7) }.not_to raise_error
128
200
  end
201
+
129
202
  it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
130
203
  expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
131
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
132
215
  end
133
216
 
134
217
  context 'with multiple count filters' do
@@ -137,50 +220,54 @@ Capybara::SpecHelper.spec "#all" do
137
220
  minimum: 5,
138
221
  maximum: 0,
139
222
  between: 0..3 }
140
- expect { @session.all(:css, 'h1, p', o) }.not_to raise_error
223
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
141
224
  end
225
+
142
226
  context 'with no :count expectation' do
143
227
  it 'fails if :minimum is not met' do
144
228
  o = { minimum: 5,
145
229
  maximum: 4,
146
230
  between: 2..7 }
147
- 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)
148
232
  end
233
+
149
234
  it 'fails if :maximum is not met' do
150
235
  o = { minimum: 0,
151
236
  maximum: 0,
152
237
  between: 2..7 }
153
- 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)
154
239
  end
240
+
155
241
  it 'fails if :between is not met' do
156
242
  o = { minimum: 0,
157
243
  maximum: 4,
158
244
  between: 0..3 }
159
- 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)
160
246
  end
247
+
161
248
  it 'succeeds if all combineable expectations are met' do
162
249
  o = { minimum: 0,
163
250
  maximum: 4,
164
251
  between: 2..7 }
165
- expect { @session.all(:css, 'h1, p', o) }.not_to raise_error
252
+ expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
166
253
  end
167
254
  end
168
255
  end
169
256
  end
170
257
 
171
- context "within a scope" do
258
+ context 'within a scope' do
172
259
  before do
173
260
  @session.visit('/with_scope')
174
261
  end
175
262
 
176
- it "should find any element using the given locator" do
263
+ it 'should find any element using the given locator' do
177
264
  @session.within(:xpath, "//div[@id='for_bar']") do
178
265
  expect(@session.all('.//li').size).to eq(2)
179
266
  end
180
267
  end
181
268
  end
182
269
 
183
- it "should have #find_all as an alias" do
270
+ it 'should have #find_all as an alias' do
184
271
  expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
185
272
  expect(@session.find_all('//p').size).to eq(3)
186
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