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,127 +1,155 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#first' do
3
4
  before do
4
5
  @session.visit('/with_html')
5
6
  end
6
7
 
7
- it "should find the first element using the given locator" do
8
+ it 'should find the first element using the given locator' do
8
9
  expect(@session.first('//h1').text).to eq('This is a test')
9
10
  expect(@session.first("//input[@id='test_field']").value).to eq('monkey')
10
11
  end
11
12
 
12
- it "should return nil when nothing was found" do
13
- expect(@session.first('//div[@id="nosuchthing"]')).to be_nil
13
+ it 'should raise ElementNotFound when nothing was found' do
14
+ expect do
15
+ @session.first('//div[@id="nosuchthing"]')
16
+ end.to raise_error Capybara::ElementNotFound
17
+ end
18
+
19
+ it 'should return nil when nothing was found if count options allow no results' do
20
+ expect(@session.first('//div[@id="nosuchthing"]', minimum: 0)).to be_nil
21
+ expect(@session.first('//div[@id="nosuchthing"]', count: 0)).to be_nil
22
+ expect(@session.first('//div[@id="nosuchthing"]', between: (0..3))).to be_nil
14
23
  end
15
24
 
16
- it "should accept an XPath instance" do
25
+ it 'should accept an XPath instance' do
17
26
  @session.visit('/form')
18
- @xpath = Capybara::Selector.all[:fillable_field].call('First Name')
19
- expect(@xpath).to be_a(::XPath::Union)
27
+ @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
28
+ expect(@xpath).to be_a(XPath::Union)
20
29
  expect(@session.first(@xpath).value).to eq('John')
21
30
  end
22
31
 
23
- it "should warn when unused parameters are passed" do
24
- expect_any_instance_of(Kernel).to receive(:warn).with(/Unused parameters passed.*unused text/)
25
- @session.first(:css, '.header h2', 'unused text')
32
+ it 'should raise when unused parameters are passed' do
33
+ expect do
34
+ @session.first(:css, 'h1', 'unused text')
35
+ end.to raise_error ArgumentError, /Unused parameters passed.*unused text/
26
36
  end
27
37
 
28
- context "with css selectors" do
29
- it "should find the first element using the given selector" do
38
+ context 'with css selectors' do
39
+ it 'should find the first element using the given selector' do
30
40
  expect(@session.first(:css, 'h1').text).to eq('This is a test')
31
41
  expect(@session.first(:css, "input[id='test_field']").value).to eq('monkey')
32
42
  end
33
43
  end
34
44
 
35
- context "with xpath selectors" do
36
- it "should find the first element using the given locator" do
45
+ context 'with xpath selectors' do
46
+ it 'should find the first element using the given locator' do
37
47
  expect(@session.first(:xpath, '//h1').text).to eq('This is a test')
38
48
  expect(@session.first(:xpath, "//input[@id='test_field']").value).to eq('monkey')
39
49
  end
40
50
  end
41
51
 
42
- context "with css as default selector" do
52
+ context 'with css as default selector' do
43
53
  before { Capybara.default_selector = :css }
44
- it "should find the first element using the given locator" do
54
+
55
+ it 'should find the first element using the given locator' do
45
56
  expect(@session.first('h1').text).to eq('This is a test')
46
57
  expect(@session.first("input[id='test_field']").value).to eq('monkey')
47
58
  end
48
59
  end
49
60
 
50
- context "with visible filter" do
51
- it "should only find visible nodes when true" do
52
- expect(@session.first(:css, "a#invisible", visible: true)).to be_nil
61
+ context 'with visible filter' do
62
+ it 'should only find visible nodes when true' do
63
+ expect do
64
+ @session.first(:css, 'a#invisible', visible: true)
65
+ end.to raise_error Capybara::ElementNotFound
53
66
  end
54
67
 
55
- it "should find nodes regardless of whether they are invisible when false" do
56
- expect(@session.first(:css, "a#invisible", visible: false)).not_to be_nil
57
- expect(@session.first(:css, "a#invisible", visible: false, text: 'hidden link')).not_to be_nil
58
- expect(@session.first(:css, "a#visible", visible: false)).not_to be_nil
68
+ it 'should find nodes regardless of whether they are invisible when false' do
69
+ expect(@session.first(:css, 'a#invisible', visible: false)).to be_truthy
70
+ expect(@session.first(:css, 'a#invisible', visible: false, text: 'hidden link')).to be_truthy
71
+ expect(@session.first(:css, 'a#visible', visible: false)).to be_truthy
59
72
  end
60
73
 
61
- it "should find nodes regardless of whether they are invisible when :all" do
62
- expect(@session.first(:css, "a#invisible", visible: :all)).not_to be_nil
63
- expect(@session.first(:css, "a#invisible", visible: :all, text: 'hidden link')).not_to be_nil
64
- expect(@session.first(:css, "a#visible", visible: :all)).not_to be_nil
74
+ it 'should find nodes regardless of whether they are invisible when :all' do
75
+ expect(@session.first(:css, 'a#invisible', visible: :all)).to be_truthy
76
+ expect(@session.first(:css, 'a#invisible', visible: :all, text: 'hidden link')).to be_truthy
77
+ expect(@session.first(:css, 'a#visible', visible: :all)).to be_truthy
65
78
  end
66
79
 
67
- it "should find only hidden nodes when :hidden" do
68
- expect(@session.first(:css, "a#invisible", visible: :hidden)).not_to be_nil
69
- expect(@session.first(:css, "a#invisible", visible: :hidden, text: 'hidden link')).not_to be_nil
70
- expect(@session.first(:css, "a#invisible", visible: :hidden, text: 'not hidden link')).to be_nil
71
- expect(@session.first(:css, "a#visible", visible: :hidden)).to be_nil
80
+ it 'should find only hidden nodes when :hidden' do
81
+ expect(@session.first(:css, 'a#invisible', visible: :hidden)).to be_truthy
82
+ expect(@session.first(:css, 'a#invisible', visible: :hidden, text: 'hidden link')).to be_truthy
83
+ expect do
84
+ @session.first(:css, 'a#invisible', visible: :hidden, text: 'not hidden link')
85
+ end.to raise_error Capybara::ElementNotFound
86
+ expect do
87
+ @session.first(:css, 'a#visible', visible: :hidden)
88
+ end.to raise_error Capybara::ElementNotFound
72
89
  end
73
90
 
74
- it "should find only visible nodes when :visible" do
75
- expect(@session.first(:css, "a#invisible", visible: :visible)).to be_nil
76
- expect(@session.first(:css, "a#invisible", visible: :visible, text: 'hidden link')).to be_nil
77
- expect(@session.first(:css, "a#visible", visible: :visible)).not_to be_nil
91
+ it 'should find only visible nodes when :visible' do
92
+ expect do
93
+ @session.first(:css, 'a#invisible', visible: :visible)
94
+ end.to raise_error Capybara::ElementNotFound
95
+ expect do
96
+ @session.first(:css, 'a#invisible', visible: :visible, text: 'hidden link')
97
+ end.to raise_error Capybara::ElementNotFound
98
+ expect(@session.first(:css, 'a#visible', visible: :visible)).to be_truthy
78
99
  end
79
100
 
80
- it "should default to Capybara.ignore_hidden_elements" do
101
+ it 'should default to Capybara.ignore_hidden_elements' do
81
102
  Capybara.ignore_hidden_elements = true
82
- expect(@session.first(:css, "a#invisible")).to be_nil
103
+ expect do
104
+ @session.first(:css, 'a#invisible')
105
+ end.to raise_error Capybara::ElementNotFound
83
106
  Capybara.ignore_hidden_elements = false
84
- expect(@session.first(:css, "a#invisible")).not_to be_nil
85
- expect(@session.first(:css, "a")).not_to be_nil
107
+ expect(@session.first(:css, 'a#invisible')).to be_truthy
108
+ expect(@session.first(:css, 'a')).to be_truthy
86
109
  end
87
110
  end
88
111
 
89
- context "within a scope" do
112
+ context 'within a scope' do
90
113
  before do
91
114
  @session.visit('/with_scope')
92
115
  end
93
116
 
94
- it "should find the first element using the given locator" do
117
+ it 'should find the first element using the given locator' do
95
118
  @session.within(:xpath, "//div[@id='for_bar']") do
96
- expect(@session.first('.//form')).not_to be_nil
119
+ expect(@session.first('.//form')).to be_truthy
97
120
  end
98
121
  end
99
122
  end
100
123
 
101
- context "with Capybara.wait_on_first_by_default", requires: [:js] do
124
+ context 'waiting behavior', requires: [:js] do
102
125
  before do
103
126
  @session.visit('/with_js')
104
127
  end
105
128
 
106
- it "should not wait if false" do
107
- Capybara.wait_on_first_by_default = false
129
+ it 'should not wait if minimum: 0' do
108
130
  @session.click_link('clickable')
109
- expect(@session.first(:css, 'a#has-been-clicked')).to be_nil
131
+ Capybara.using_wait_time(3) do
132
+ start_time = Time.now
133
+ expect(@session.first(:css, 'a#has-been-clicked', minimum: 0)).to be_nil
134
+ expect(Time.now - start_time).to be < 3
135
+ end
110
136
  end
111
137
 
112
- it "should wait for at least one match if true" do
113
- Capybara.wait_on_first_by_default = true
138
+ it 'should wait for at least one match by default' do
114
139
  Capybara.using_wait_time(3) do
115
140
  @session.click_link('clickable')
116
141
  expect(@session.first(:css, 'a#has-been-clicked')).not_to be_nil
117
142
  end
118
143
  end
119
144
 
120
- it "should return nil after waiting if no match" do
121
- Capybara.wait_on_first_by_default = true
145
+ it 'should raise an error after waiting if no match' do
146
+ @session.click_link('clickable')
122
147
  Capybara.using_wait_time(3) do
123
- @session.click_link('clickable')
124
- expect(@session.first(:css, 'a#not-a-real-link')).to be_nil
148
+ start_time = Time.now
149
+ expect do
150
+ @session.first(:css, 'a#not-a-real-link')
151
+ end.to raise_error Capybara::ElementNotFound
152
+ expect(Time.now - start_time).to be > 3
125
153
  end
126
154
  end
127
155
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#frame_title', requires: [:frames] do
4
+ before do
5
+ @session.visit('/within_frames')
6
+ end
7
+
8
+ it 'should return the title in a frame' do
9
+ @session.within_frame('frameOne') do
10
+ expect(@session.driver.frame_title).to eq 'This is the title of frame one'
11
+ end
12
+ end
13
+
14
+ it 'should return the title in FrameTwo' do
15
+ @session.within_frame('frameTwo') do
16
+ expect(@session.driver.frame_title).to eq 'This is the title of frame two'
17
+ end
18
+ end
19
+
20
+ it 'should return the title in the main frame' do
21
+ expect(@session.driver.frame_title).to eq 'With Frames'
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#frame_url', requires: [:frames] do
4
+ before do
5
+ @session.visit('/within_frames')
6
+ end
7
+
8
+ it 'should return the url in a frame' do
9
+ @session.within_frame('frameOne') do
10
+ expect(@session.driver.frame_url).to end_with '/frame_one'
11
+ end
12
+ end
13
+
14
+ it 'should return the url in FrameTwo' do
15
+ @session.within_frame('frameTwo') do
16
+ expect(@session.driver.frame_url).to end_with '/frame_two'
17
+ end
18
+ end
19
+
20
+ it 'should return the url in the main frame' do
21
+ expect(@session.driver.frame_url).to end_with('/within_frames')
22
+ end
23
+ end
@@ -1,69 +1,82 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
3
- before(:each) do
4
+ before do
4
5
  @session.visit('/within_frames')
5
6
  end
6
7
 
7
- after(:each) do
8
+ after do
8
9
  # Ensure we clean up after the frame changes
9
10
  @session.switch_to_frame(:top)
10
11
  end
11
12
 
12
- it "should find the div in frameOne" do
13
- frame = @session.find(:frame, "frameOne")
13
+ it 'should find the div in frameOne' do
14
+ frame = @session.find(:frame, 'frameOne')
14
15
  @session.switch_to_frame(frame)
15
16
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
16
17
  end
17
18
 
18
- it "should find the div in FrameTwo" do
19
- frame = @session.find(:frame, "frameTwo")
19
+ it 'should find the div in FrameTwo' do
20
+ frame = @session.find(:frame, 'frameTwo')
20
21
  @session.switch_to_frame(frame)
21
22
  expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
22
23
  end
23
24
 
24
- it "should return to the parent frame when told to" do
25
- frame = @session.find(:frame, "frameOne")
25
+ it 'should return to the parent frame when told to' do
26
+ frame = @session.find(:frame, 'frameOne')
26
27
  @session.switch_to_frame(frame)
27
28
  @session.switch_to_frame(:parent)
28
29
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
29
30
  end
30
31
 
31
- it "should be able to switch to nested frames" do
32
- frame = @session.find(:frame, "parentFrame")
32
+ it 'should be able to switch to nested frames' do
33
+ frame = @session.find(:frame, 'parentFrame')
33
34
  @session.switch_to_frame frame
34
- frame = @session.find(:frame, "childFrame")
35
+ frame = @session.find(:frame, 'childFrame')
35
36
  @session.switch_to_frame frame
36
- frame = @session.find(:frame, "grandchildFrame1")
37
+ frame = @session.find(:frame, 'grandchildFrame1')
37
38
  @session.switch_to_frame frame
38
39
  expect(@session).to have_selector(:css, '#divInFrameOne', text: 'This is the text of divInFrameOne')
39
40
  end
40
41
 
41
- it "should reset scope when changing frames" do
42
+ it 'should reset scope when changing frames' do
42
43
  frame = @session.find(:frame, 'parentFrame')
43
44
  @session.within(:css, '#divInMainWindow') do
44
45
  @session.switch_to_frame(frame)
45
- expect(@session.has_selector?(:css, "iframe#childFrame")).to be true
46
+ expect(@session.has_selector?(:css, 'iframe#childFrame')).to be true
46
47
  @session.switch_to_frame(:parent)
47
48
  end
48
49
  end
49
50
 
50
- it "works if the frame is closed", requires: [:frames, :js] do
51
+ it 'works if the frame is closed', requires: %i[frames js] do
51
52
  frame = @session.find(:frame, 'parentFrame')
52
53
  @session.switch_to_frame frame
53
54
  frame = @session.find(:frame, 'childFrame')
54
55
  @session.switch_to_frame frame
56
+ @session.click_link 'Close Window Now'
57
+ @session.switch_to_frame :parent # Go back to parentFrame
58
+ expect(@session).to have_selector(:css, 'body#parentBody')
59
+ expect(@session).not_to have_selector(:css, '#childFrame')
60
+ @session.switch_to_frame :parent # Go back to top
61
+ end
55
62
 
56
- @session.click_link 'Close Window'
63
+ it 'works if the frame is closed with a slight delay', requires: %i[frames js] do
64
+ frame = @session.find(:frame, 'parentFrame')
65
+ @session.switch_to_frame frame
66
+ frame = @session.find(:frame, 'childFrame')
67
+ @session.switch_to_frame frame
68
+ @session.click_link 'Close Window Soon'
69
+ sleep 1
57
70
  @session.switch_to_frame :parent # Go back to parentFrame
58
71
  expect(@session).to have_selector(:css, 'body#parentBody')
59
72
  expect(@session).not_to have_selector(:css, '#childFrame')
60
73
  @session.switch_to_frame :parent # Go back to top
61
74
  end
62
75
 
63
- it "can return to the top frame", requires: [:frames] do
64
- frame = @session.find(:frame, "parentFrame")
76
+ it 'can return to the top frame', requires: [:frames] do
77
+ frame = @session.find(:frame, 'parentFrame')
65
78
  @session.switch_to_frame frame
66
- frame = @session.find(:frame, "childFrame")
79
+ frame = @session.find(:frame, 'childFrame')
67
80
  @session.switch_to_frame frame
68
81
  @session.switch_to_frame :top
69
82
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
@@ -93,7 +106,7 @@ Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
93
106
  frame = @session.find(:frame, 'parentFrame')
94
107
  @session.switch_to_frame(frame)
95
108
  @session.within(:css, '#parentBody') do
96
- @session.switch_to_frame(@session.find(:frame, "childFrame"))
109
+ @session.switch_to_frame(@session.find(:frame, 'childFrame'))
97
110
  expect do
98
111
  @session.switch_to_frame(:top)
99
112
  end.to raise_error(Capybara::ScopeError, "`switch_to_frame(:top)` cannot be called from inside a descendant frame's `within` block.")
@@ -1,94 +1,114 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#within_frame', requires: [:frames] do
3
- before(:each) do
4
+ before do
4
5
  @session.visit('/within_frames')
5
6
  end
6
7
 
7
- it "should find the div in frameOne" do
8
- @session.within_frame("frameOne") do
8
+ it 'should find the div in frameOne' do
9
+ @session.within_frame('frameOne') do
9
10
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
10
11
  end
11
12
  end
12
13
 
13
- it "should find the div in FrameTwo" do
14
- @session.within_frame("frameTwo") do
14
+ it 'should find the div in FrameTwo' do
15
+ @session.within_frame('frameTwo') do
15
16
  expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
16
17
  end
17
18
  end
18
19
 
19
- it "should find the text div in the main window after finding text in frameOne" do
20
- @session.within_frame("frameOne") do
20
+ it 'should find the text div in the main window after finding text in frameOne' do
21
+ @session.within_frame('frameOne') do
21
22
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
22
23
  end
23
24
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
24
25
  end
25
26
 
26
- it "should find the text div in the main window after finding text in frameTwo" do
27
- @session.within_frame("frameTwo") do
27
+ it 'should find the text div in the main window after finding text in frameTwo' do
28
+ @session.within_frame('frameTwo') do
28
29
  expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
29
30
  end
30
31
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
31
32
  end
32
33
 
33
- it "should return the result of executing the block" do
34
- expect(@session.within_frame("frameOne") { "return value" }).to eql "return value"
34
+ it 'should return the result of executing the block' do
35
+ expect(@session.within_frame('frameOne') { 'return value' }).to eql 'return value'
35
36
  end
36
37
 
37
- it "should find the div given Element" do
38
+ it 'should find the div given Element' do
38
39
  element = @session.find(:id, 'frameOne')
39
40
  @session.within_frame element do
40
41
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
41
42
  end
42
43
  end
43
44
 
44
- it "should find the div given selector and locator" do
45
+ it 'should find the div given selector and locator' do
45
46
  @session.within_frame(:css, '#frameOne') do
46
47
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
47
48
  end
48
49
  end
49
50
 
50
- it "should default to the :frame selector kind when only options passed" do
51
+ it 'should default to the :frame selector kind when only options passed' do
51
52
  @session.within_frame(name: 'my frame one') do
52
53
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
53
54
  end
54
55
  end
55
56
 
56
- it "should find multiple nested frames" do
57
+ it 'should default to the :frame selector when no options passed' do
58
+ container = @session.find(:css, '#divInMainWindow')
59
+ @session.within(container) do
60
+ # Ensure only one frame in scope
61
+ @session.within_frame do
62
+ expect(@session).to have_css('body#parentBody')
63
+ end
64
+ end
65
+ expect do
66
+ # Multiple frames in scope here
67
+ # rubocop:disable Style/Semicolon
68
+ @session.within_frame { ; }
69
+ # rubocop:enable Style/Semicolon
70
+ end.to raise_error Capybara::Ambiguous
71
+ end
72
+
73
+ it 'should find multiple nested frames' do
57
74
  @session.within_frame 'parentFrame' do
58
75
  @session.within_frame 'childFrame' do
59
- @session.within_frame 'grandchildFrame1' do end
60
- @session.within_frame 'grandchildFrame2' do end
76
+ @session.within_frame 'grandchildFrame1' do
77
+ # dummy
78
+ end
79
+ @session.within_frame 'grandchildFrame2' do
80
+ # dummy
81
+ end
61
82
  end
62
83
  end
63
84
  end
64
85
 
65
- it "should reset scope when changing frames" do
86
+ it 'should reset scope when changing frames' do
66
87
  @session.within(:css, '#divInMainWindow') do
67
- @session.within_frame 'parentFrame' do
68
- expect(@session.has_selector?(:css, "iframe#childFrame")).to be true
88
+ @session.within_frame 'innerParentFrame' do
89
+ expect(@session.has_selector?(:css, 'iframe#childFrame')).to be true
69
90
  end
70
91
  end
71
92
  end
72
93
 
73
- it "works if the frame is closed", requires: [:frames, :js] do
94
+ it 'works if the frame is closed', requires: %i[frames js] do
74
95
  @session.within_frame 'parentFrame' do
75
96
  @session.within_frame 'childFrame' do
76
- @session.click_link 'Close Window'
97
+ @session.click_link 'Close Window Now'
77
98
  end
78
99
  expect(@session).to have_selector(:css, 'body#parentBody')
79
100
  expect(@session).not_to have_selector(:css, '#childFrame')
80
101
  end
81
102
  end
82
103
 
83
- it "should support the driver #switch_to_frame api" do
84
- # This test is purely to notify driver authors to update their API.
85
- # The #switch_to_frame API will be required in the next version (> 2.8) of Capybara for frames support.
86
- # It should not be used as an example of code for users.
87
- frame = @session.find(:frame, "frameOne")
88
- expect {
89
- @session.driver.switch_to_frame(frame)
90
- sleep 0.5
91
- @session.driver.switch_to_frame(:parent)
92
- }.not_to raise_error
104
+ it 'works if the frame is closed with a slight delay', requires: %i[frames js] do
105
+ @session.within_frame 'parentFrame' do
106
+ @session.within_frame 'childFrame' do
107
+ @session.click_link 'Close Window Soon'
108
+ sleep 1
109
+ end
110
+ expect(@session).to have_selector(:css, 'body#parentBody')
111
+ expect(@session).not_to have_selector(:css, '#childFrame')
112
+ end
93
113
  end
94
114
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#go_back', requires: [:js] do
3
- it "should fetch a response from the driver from the previous page" do
4
+ it 'should fetch a response from the driver from the previous page' do
4
5
  @session.visit('/')
5
6
  expect(@session).to have_content('Hello world!')
6
7
  @session.visit('/foo')
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#go_forward', requires: [:js] do
3
- it "should fetch a response from the driver from the previous page" do
4
+ it 'should fetch a response from the driver from the previous page' do
4
5
  @session.visit('/')
5
6
  expect(@session).to have_content('Hello world!')
6
7
  @session.visit('/foo')
@@ -1,69 +1,69 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#have_all_selectors' do
2
+
3
+ Capybara::SpecHelper.spec '#have_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
- expect(@session).to have_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
+ expect(@session).to have_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 {
13
- expect(@session).to have_all_of_selectors(:css, "p a#foo", "h2#h2three", "h2#h2one")
14
- }.to raise_error ::RSpec::Expectations::ExpectationNotMetError
12
+ it 'should be false if any of the given selectors are not on the page' do
13
+ expect do
14
+ expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one')
15
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
15
16
  end
16
17
 
17
- it "should use default selector" do
18
+ it 'should use default selector' do
18
19
  Capybara.default_selector = :css
19
- expect(@session).to have_all_of_selectors("p a#foo", "h2#h2two", "h2#h2one" )
20
- expect {
21
- expect(@session).to have_all_of_selectors("p a#foo", "h2#h2three", "h2#h2one")
22
- }.to raise_error ::RSpec::Expectations::ExpectationNotMetError
20
+ expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
21
+ expect do
22
+ expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one')
23
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
23
24
  end
24
25
 
25
- context "should respect scopes" do
26
- it "when used with `within`" do
26
+ context 'should respect scopes' do
27
+ it 'when used with `within`' do
27
28
  @session.within "//p[@id='first']" do
28
29
  expect(@session).to have_all_of_selectors(".//a[@id='foo']")
29
- expect {
30
+ expect do
30
31
  expect(@session).to have_all_of_selectors(".//a[@id='red']")
31
- }.to raise_error ::RSpec::Expectations::ExpectationNotMetError
32
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
32
33
  end
33
34
  end
34
35
 
35
- it "when called on elements" do
36
+ it 'when called on elements' do
36
37
  el = @session.find "//p[@id='first']"
37
38
  expect(el).to have_all_of_selectors(".//a[@id='foo']")
38
- expect {
39
+ expect do
39
40
  expect(el).to have_all_of_selectors(".//a[@id='red']")
40
- }.to raise_error ::RSpec::Expectations::ExpectationNotMetError
41
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
41
42
  end
42
43
  end
43
44
 
44
- context "with options" do
45
- it "should apply options to all locators" do
45
+ context 'with options' do
46
+ it 'should apply options to all locators' do
46
47
  expect(@session).to have_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
47
- expect {
48
+ expect do
48
49
  expect(@session).to have_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea)
49
- }.to raise_error ::RSpec::Expectations::ExpectationNotMetError
50
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
50
51
  end
51
52
  end
52
53
 
53
- context "with wait", requires: [:js] do
54
- it "should not raise error if all the elements appear before given wait duration" do
54
+ context 'with wait', requires: [:js] do
55
+ it 'should not raise error if all the elements appear before given wait duration' do
55
56
  Capybara.using_wait_time(0.1) do
56
57
  @session.visit('/with_js')
57
58
  @session.click_link('Click me')
58
- expect(@session).to have_all_of_selectors(:css, "a#clickable", "a#has-been-clicked", '#drag', wait: 0.9)
59
+ expect(@session).to have_all_of_selectors(:css, 'a#clickable', 'a#has-been-clicked', '#drag', wait: 5)
59
60
  end
60
61
  end
61
62
  end
62
63
 
63
- it "cannot be negated" do
64
- expect {
65
- expect(@session).not_to have_all_of_selectors(:css, "p a#foo", "h2#h2one", "h2#h2two")
66
- }.to raise_error ArgumentError
64
+ it 'cannot be negated' do
65
+ expect do
66
+ expect(@session).not_to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
67
+ end.to raise_error ArgumentError
67
68
  end
68
69
  end
69
-