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