capybara 3.0.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +85 -8
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +460 -170
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +126 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +135 -44
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +958 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  206. data/lib/capybara/spec/session/select_spec.rb +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +46 -11
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -1,69 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#click_link_or_button' do
4
- it "should click on a link" do
4
+ it 'should click on a link' do
5
5
  @session.visit('/with_html')
6
6
  @session.click_link_or_button('labore')
7
7
  expect(@session).to have_content('Bar')
8
8
  end
9
9
 
10
- it "should click on a button" do
10
+ it 'should click on a button' do
11
11
  @session.visit('/form')
12
12
  @session.click_link_or_button('awe123')
13
13
  expect(extract_results(@session)['first_name']).to eq('John')
14
14
  end
15
15
 
16
- it "should click on a button with no type attribute" do
16
+ it 'should click on a button with no type attribute' do
17
17
  @session.visit('/form')
18
18
  @session.click_link_or_button('no_type')
19
19
  expect(extract_results(@session)['first_name']).to eq('John')
20
20
  end
21
21
 
22
- it "should be aliased as click_on" do
22
+ it 'should be aliased as click_on' do
23
23
  @session.visit('/form')
24
24
  @session.click_on('awe123')
25
25
  expect(extract_results(@session)['first_name']).to eq('John')
26
26
  end
27
27
 
28
- it "should wait for asynchronous load", requires: [:js] do
28
+ it 'should wait for asynchronous load', requires: [:js] do
29
+ Capybara.default_max_wait_time = 2
29
30
  @session.visit('/with_js')
30
31
  @session.click_link('Click me')
31
32
  @session.click_link_or_button('Has been clicked')
32
33
  end
33
34
 
34
- it "casts to string" do
35
+ it 'casts to string' do
35
36
  @session.visit('/form')
36
37
  @session.click_link_or_button(:awe123)
37
38
  expect(extract_results(@session)['first_name']).to eq('John')
38
39
  end
39
40
 
40
- context "with :exact option" do
41
- context "when `false`" do
42
- it "clicks on approximately matching link" do
41
+ context 'with test_id' do
42
+ it 'should click on a button' do
43
+ Capybara.test_id = 'data-test-id'
44
+ @session.visit('/form')
45
+ @session.click_link_or_button('test_id_button')
46
+ expect(extract_results(@session)['first_name']).to eq('John')
47
+ end
48
+ end
49
+
50
+ context 'with :exact option' do
51
+ context 'when `false`' do
52
+ it 'clicks on approximately matching link' do
43
53
  @session.visit('/with_html')
44
54
  @session.click_link_or_button('abore', exact: false)
45
55
  expect(@session).to have_content('Bar')
46
56
  end
47
57
 
48
- it "clicks on approximately matching button" do
58
+ it 'clicks on approximately matching button' do
49
59
  @session.visit('/form')
50
60
  @session.click_link_or_button('awe', exact: false)
51
61
  expect(extract_results(@session)['first_name']).to eq('John')
52
62
  end
53
63
  end
54
64
 
55
- context "when `true`" do
56
- it "does not click on link which matches approximately" do
65
+ context 'when `true`' do
66
+ it 'does not click on link which matches approximately' do
57
67
  @session.visit('/with_html')
58
- msg = "Unable to find visible link or button \"abore\""
68
+ msg = 'Unable to find link or button "abore"'
59
69
  expect do
60
70
  @session.click_link_or_button('abore', exact: true)
61
71
  end.to raise_error(Capybara::ElementNotFound, msg)
62
72
  end
63
73
 
64
- it "does not click on approximately matching button" do
74
+ it 'does not click on approximately matching button' do
65
75
  @session.visit('/form')
66
- msg = "Unable to find visible link or button \"awe\""
76
+ msg = 'Unable to find link or button "awe"'
67
77
 
68
78
  expect do
69
79
  @session.click_link_or_button('awe', exact: true)
@@ -73,47 +83,56 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
73
83
  end
74
84
 
75
85
  context "with a locator that doesn't exist" do
76
- it "should raise an error" do
86
+ it 'should raise an error' do
77
87
  @session.visit('/with_html')
78
- msg = "Unable to find visible link or button \"does not exist\""
88
+ msg = 'Unable to find link or button "does not exist"'
79
89
  expect do
80
90
  @session.click_link_or_button('does not exist')
81
91
  end.to raise_error(Capybara::ElementNotFound, msg)
82
92
  end
83
93
  end
84
94
 
85
- context "with :disabled option" do
86
- it "ignores disabled buttons when false" do
95
+ context 'with :disabled option' do
96
+ it 'ignores disabled buttons when false' do
87
97
  @session.visit('/form')
88
98
  expect do
89
99
  @session.click_link_or_button('Disabled button', disabled: false)
90
100
  end.to raise_error(Capybara::ElementNotFound)
91
101
  end
92
102
 
93
- it "ignores disabled buttons by default" do
103
+ it 'ignores disabled buttons by default' do
94
104
  @session.visit('/form')
95
105
  expect do
96
106
  @session.click_link_or_button('Disabled button')
97
107
  end.to raise_error(Capybara::ElementNotFound)
98
108
  end
99
109
 
100
- it "happily clicks on links which incorrectly have the disabled attribute" do
110
+ it 'happily clicks on links which incorrectly have the disabled attribute' do
101
111
  @session.visit('/with_html')
102
112
  @session.click_link_or_button('Disabled link')
103
- expect(@session).to have_content("Bar")
104
- end
105
-
106
- it "does nothing when button is disabled" do
107
- @session.visit('/form')
108
- expect do
109
- @session.click_link_or_button('Disabled button', disabled: false)
110
- end.to raise_error(Capybara::ElementNotFound)
113
+ expect(@session).to have_content('Bar')
111
114
  end
112
115
  end
113
116
 
114
- it "should return the element clicked" do
117
+ it 'should return the element clicked' do
115
118
  @session.visit('/with_html')
116
119
  link = @session.find(:link, 'Blank Anchor')
117
120
  expect(@session.click_link_or_button('Blank Anchor')).to eq link
118
121
  end
122
+
123
+ context 'with enable_aria_label' do
124
+ it 'should click on link' do
125
+ @session.visit('/with_html')
126
+ expect do
127
+ @session.click_link_or_button('Go to simple', enable_aria_label: true)
128
+ end.not_to raise_error
129
+ end
130
+
131
+ it 'should click on button' do
132
+ @session.visit('/form')
133
+ expect do
134
+ @session.click_link_or_button('Aria button', enable_aria_label: true)
135
+ end.not_to raise_error
136
+ end
137
+ end
119
138
  end
@@ -5,202 +5,236 @@ Capybara::SpecHelper.spec '#click_link' do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- it "should wait for asynchronous load", requires: [:js] do
8
+ it 'should wait for asynchronous load', requires: [:js] do
9
+ Capybara.default_max_wait_time = 2
9
10
  @session.visit('/with_js')
10
11
  @session.click_link('Click me')
11
12
  @session.click_link('Has been clicked')
12
13
  end
13
14
 
14
- it "casts to string" do
15
+ it 'casts to string' do
15
16
  @session.click_link(:foo)
16
17
  expect(@session).to have_content('Another World')
17
18
  end
18
19
 
19
- it "raises any errors caught inside the server", requires: [:server] do
20
- quietly { @session.visit("/error") }
20
+ it 'raises any errors caught inside the server', requires: [:server] do
21
+ quietly { @session.visit('/error') }
21
22
  expect do
22
23
  @session.click_link('foo')
23
24
  end.to raise_error(TestApp::TestAppError)
24
25
  end
25
26
 
26
- context "with id given" do
27
- it "should take user to the linked page" do
27
+ context 'with id given' do
28
+ it 'should take user to the linked page' do
28
29
  @session.click_link('foo')
29
30
  expect(@session).to have_content('Another World')
30
31
  end
31
32
  end
32
33
 
33
- context "with text given" do
34
- it "should take user to the linked page" do
34
+ context 'with text given' do
35
+ it 'should take user to the linked page' do
35
36
  @session.click_link('labore')
36
37
  expect(@session).to have_content('Bar')
37
38
  end
38
39
 
39
- it "should accept partial matches", :exact_false do
40
+ it 'should accept partial matches', :exact_false do
40
41
  @session.click_link('abo')
41
42
  expect(@session).to have_content('Bar')
42
43
  end
43
44
  end
44
45
 
45
- context "with title given" do
46
- it "should take user to the linked page" do
46
+ context 'with title given' do
47
+ it 'should take user to the linked page' do
47
48
  @session.click_link('awesome title')
48
49
  expect(@session).to have_content('Bar')
49
50
  end
50
51
 
51
- it "should accept partial matches", :exact_false do
52
+ it 'should accept partial matches', :exact_false do
52
53
  @session.click_link('some titl')
53
54
  expect(@session).to have_content('Bar')
54
55
  end
55
56
  end
56
57
 
57
- context "with alternative text given to a contained image" do
58
- it "should take user to the linked page" do
58
+ context 'with alternative text given to a contained image' do
59
+ it 'should take user to the linked page' do
59
60
  @session.click_link('awesome image')
60
61
  expect(@session).to have_content('Bar')
61
62
  end
62
63
 
63
- it "should accept partial matches", :exact_false do
64
+ it 'should accept partial matches', :exact_false do
64
65
  @session.click_link('some imag')
65
66
  expect(@session).to have_content('Bar')
66
67
  end
67
68
  end
68
69
 
69
70
  context "with a locator that doesn't exist" do
70
- it "should raise an error" do
71
- msg = "Unable to find visible link \"does not exist\""
71
+ it 'should raise an error' do
72
+ msg = 'Unable to find link "does not exist"'
72
73
  expect do
73
74
  @session.click_link('does not exist')
74
75
  end.to raise_error(Capybara::ElementNotFound, msg)
75
76
  end
76
77
  end
77
78
 
78
- context "with :href option given" do
79
- it "should find links with valid href" do
79
+ context 'with :href option given' do
80
+ it 'should find links with valid href' do
80
81
  @session.click_link('labore', href: '/with_simple_html')
81
82
  expect(@session).to have_content('Bar')
82
83
  end
83
84
 
84
85
  it "should raise error if link wasn't found" do
85
- expect { @session.click_link('labore', href: 'invalid_href') }.to raise_error(Capybara::ElementNotFound)
86
+ expect { @session.click_link('labore', href: 'invalid_href') }.to raise_error(Capybara::ElementNotFound, /with href "invalid_href/)
86
87
  end
87
88
  end
88
89
 
89
- context "with a regex :href option given" do
90
- it "should find a link matching an all-matching regex pattern" do
90
+ context 'with a regex :href option given' do
91
+ it 'should find a link matching an all-matching regex pattern' do
91
92
  @session.click_link('labore', href: /.+/)
92
93
  expect(@session).to have_content('Bar')
93
94
  end
94
95
 
95
- it "should find a link matching an exact regex pattern" do
96
- @session.click_link('labore', href: /\/with_simple_html/)
96
+ it 'should find a link matching an exact regex pattern' do
97
+ @session.click_link('labore', href: %r{/with_simple_html})
97
98
  expect(@session).to have_content('Bar')
98
99
  end
99
100
 
100
- it "should find a link matching a partial regex pattern" do
101
- @session.click_link('labore', href: /\/with_simple/)
101
+ it 'should find a link matching a partial regex pattern' do
102
+ @session.click_link('labore', href: %r{/with_simple})
102
103
  expect(@session).to have_content('Bar')
103
104
  end
104
105
 
105
106
  it "should raise an error if no link's href matched the pattern" do
106
- expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound)
107
- expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound)
107
+ expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound, %r{with href matching /invalid_pattern/})
108
+ expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound, /#{Regexp.quote 'with href matching /.+d+/'}/)
108
109
  end
109
110
 
110
111
  context 'href: nil' do
111
- it "should not raise an error on links with no href attribute" do
112
+ it 'should not raise an error on links with no href attribute' do
112
113
  expect { @session.click_link('No Href', href: nil) }.not_to raise_error
113
114
  end
114
115
 
115
- it "should raise an error if href attribute exists" do
116
- expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound)
117
- expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound)
116
+ it 'should raise an error if href attribute exists' do
117
+ expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound, /with no href attribute/)
118
+ expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound, /with no href attribute/)
118
119
  end
119
120
  end
121
+
122
+ context 'href: false' do
123
+ it 'should not raise an error on links with no href attribute' do
124
+ expect { @session.click_link('No Href', href: false) }.not_to raise_error
125
+ end
126
+
127
+ it 'should not raise an error if href attribute exists' do
128
+ expect { @session.click_link('Blank Href', href: false) }.not_to raise_error
129
+ expect { @session.click_link('Normal Anchor', href: false) }.not_to raise_error
130
+ end
131
+ end
132
+ end
133
+
134
+ context 'with :target option given' do
135
+ it 'should find links with valid target' do
136
+ @session.click_link('labore', target: '_self')
137
+ expect(@session).to have_content('Bar')
138
+ end
139
+
140
+ it "should raise error if link wasn't found" do
141
+ expect { @session.click_link('labore', target: '_blank') }.to raise_error(Capybara::ElementNotFound, /Unable to find link "labore"/)
142
+ end
120
143
  end
121
144
 
122
- it "should follow relative links" do
145
+ it 'should follow relative links' do
123
146
  @session.visit('/')
124
147
  @session.click_link('Relative')
125
148
  expect(@session).to have_content('This is a test')
126
149
  end
127
150
 
128
- it "should follow protocol relative links" do
151
+ it 'should follow protocol relative links' do
129
152
  @session.click_link('Protocol')
130
153
  expect(@session).to have_content('Another World')
131
154
  end
132
155
 
133
- it "should follow redirects" do
156
+ it 'should follow redirects' do
134
157
  @session.click_link('Redirect')
135
158
  expect(@session).to have_content('You landed')
136
159
  end
137
160
 
138
- it "should follow redirects back to itself" do
161
+ it 'should follow redirects back to itself' do
139
162
  @session.click_link('BackToMyself')
140
- expect(@session).to have_css('#referrer', text: /\/with_html$/)
163
+ expect(@session).to have_css('#referrer', text: %r{/with_html$})
141
164
  expect(@session).to have_content('This is a test')
142
165
  end
143
166
 
144
- it "should add query string to current URL with naked query string" do
167
+ it 'should add query string to current URL with naked query string' do
145
168
  @session.click_link('Naked Query String')
146
169
  expect(@session).to have_content('Query String sent')
147
170
  end
148
171
 
149
- it "should do nothing on anchor links" do
150
- @session.fill_in("test_field", with: 'blah')
172
+ it 'should do nothing on anchor links' do
173
+ @session.fill_in('test_field', with: 'blah')
151
174
  @session.click_link('Normal Anchor')
152
- expect(@session.find_field("test_field").value).to eq('blah')
175
+ expect(@session.find_field('test_field').value).to eq('blah')
153
176
  @session.click_link('Blank Anchor')
154
- expect(@session.find_field("test_field").value).to eq('blah')
177
+ expect(@session.find_field('test_field').value).to eq('blah')
155
178
  @session.click_link('Blank JS Anchor')
156
- expect(@session.find_field("test_field").value).to eq('blah')
179
+ expect(@session.find_field('test_field').value).to eq('blah')
157
180
  end
158
181
 
159
- it "should do nothing on URL+anchor links for the same page" do
160
- @session.fill_in("test_field", with: 'blah')
182
+ it 'should do nothing on URL+anchor links for the same page' do
183
+ @session.fill_in('test_field', with: 'blah')
161
184
  @session.click_link('Anchor on same page')
162
- expect(@session.find_field("test_field").value).to eq('blah')
185
+ expect(@session.find_field('test_field').value).to eq('blah')
163
186
  end
164
187
 
165
- it "should follow link on URL+anchor links for a different page" do
188
+ it 'should follow link on URL+anchor links for a different page' do
166
189
  @session.click_link('Anchor on different page')
167
190
  expect(@session).to have_content('Bar')
168
191
  end
169
192
 
170
- it "should follow link on anchor if the path has regex special characters" do
193
+ it 'should follow link on anchor if the path has regex special characters' do
171
194
  @session.visit('/with.*html')
172
195
  @session.click_link('Anchor on different page')
173
196
  expect(@session).to have_content('Bar')
174
197
  end
175
198
 
176
- it "should raise an error with links with no href" do
199
+ it 'should raise an error with links with no href' do
177
200
  expect do
178
201
  @session.click_link('No Href')
179
202
  end.to raise_error(Capybara::ElementNotFound)
180
203
  end
181
204
 
182
- context "with :exact option" do
183
- it "should accept partial matches when false" do
205
+ context 'with :exact option' do
206
+ it 'should accept partial matches when false' do
184
207
  @session.click_link('abo', exact: false)
185
208
  expect(@session).to have_content('Bar')
186
209
  end
187
210
 
188
- it "should not accept partial matches when true" do
211
+ it 'should not accept partial matches when true' do
189
212
  expect do
190
213
  @session.click_link('abo', exact: true)
191
214
  end.to raise_error(Capybara::ElementNotFound)
192
215
  end
193
216
  end
194
217
 
195
- context "without locator" do
196
- it "uses options" do
218
+ context 'without locator' do
219
+ it 'uses options' do
197
220
  @session.click_link(href: '/foo')
198
221
  expect(@session).to have_content('Another World')
199
222
  end
200
223
  end
201
224
 
202
- it "should return element clicked" do
225
+ it 'should return element clicked' do
203
226
  el = @session.find(:link, 'Normal Anchor')
204
227
  expect(@session.click_link('Normal Anchor')).to eq el
205
228
  end
229
+
230
+ it 'can download a file', requires: [:download] do
231
+ # This requires the driver used for the test to be configured
232
+ # to download documents with the mime type "text/csv"
233
+ download_file = File.join(Capybara.save_path, 'download.csv')
234
+ expect(File).not_to exist(download_file)
235
+ @session.click_link('Download Me')
236
+ sleep 2 # allow time for file to download
237
+ expect(File).to exist(download_file)
238
+ FileUtils.rm_rf download_file
239
+ end
206
240
  end
@@ -5,22 +5,22 @@ Capybara::SpecHelper.spec '#current_scope' do
5
5
  @session.visit('/with_scope')
6
6
  end
7
7
 
8
- context "when not in a #within block" do
9
- it "should return the document" do
10
- expect(@session.current_scope).to be_kind_of Capybara::Node::Document
8
+ context 'when not in a #within block' do
9
+ it 'should return the document' do
10
+ expect(@session.current_scope).to be_a Capybara::Node::Document
11
11
  end
12
12
  end
13
13
 
14
- context "when in a #within block" do
15
- it "should return the element in scope" do
16
- @session.within(:css, "#simple_first_name") do
14
+ context 'when in a #within block' do
15
+ it 'should return the element in scope' do
16
+ @session.within(:css, '#simple_first_name') do
17
17
  expect(@session.current_scope[:name]).to eq 'first_name'
18
18
  end
19
19
  end
20
20
  end
21
21
 
22
- context "when in a nested #within block" do
23
- it "should return the element in scope" do
22
+ context 'when in a nested #within block' do
23
+ it 'should return the element in scope' do
24
24
  @session.within("//div[@id='for_bar']") do
25
25
  @session.within(".//input[@value='Peter']") do
26
26
  expect(@session.current_scope[:name]).to eq 'form[first_name]'
@@ -1,20 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "capybara/spec/test_app"
3
+ require 'capybara/spec/test_app'
4
4
 
5
5
  Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
6
- before :all do
6
+ before :all do # rubocop:disable RSpec/BeforeAfterAll
7
7
  @servers = Array.new(2) { Capybara::Server.new(TestApp.new).boot }
8
8
  # sanity check
9
- expect(@servers[0].port).not_to eq(@servers[1].port)
10
- expect(@servers.map(&:port)).not_to include 80
9
+ expect(@servers[0].port).not_to eq(@servers[1].port) # rubocop:disable RSpec/ExpectInHook
10
+ expect(@servers.map(&:port)).not_to include 80 # rubocop:disable RSpec/ExpectInHook
11
11
  end
12
12
 
13
13
  def bases
14
14
  @servers.map { |s| "http://#{s.host}:#{s.port}" }
15
15
  end
16
16
 
17
- def should_be_on(server_index, path = "/host", scheme = "http")
17
+ def should_be_on(server_index, path = '/host', scheme = 'http')
18
18
  # Check that we are on /host on the given server
19
19
  s = @servers[server_index]
20
20
 
@@ -22,23 +22,21 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
22
22
 
23
23
  expect(@session.current_url.chomp('?')).to eq("#{scheme}://#{s.host}:#{s.port}#{path}")
24
24
  expect(@session.current_host).to eq("#{scheme}://#{s.host}") # no port
25
- expect(@session.current_path).to eq(path)
26
- if path == '/host'
27
- # Server should agree with us
28
- expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}")
29
- end
25
+ expect(@session.current_path).to eq(path.split('#')[0])
26
+ # Server should agree with us
27
+ expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}") if path == '/host'
30
28
  end
31
29
 
32
30
  def visit_host_links
33
31
  @session.visit("#{bases[0]}/host_links?absolute_host=#{bases[1]}")
34
32
  end
35
33
 
36
- it "is affected by visiting a page directly" do
34
+ it 'is affected by visiting a page directly' do
37
35
  @session.visit("#{bases[0]}/host")
38
36
  should_be_on 0
39
37
  end
40
38
 
41
- it "returns to the app host when visiting a relative url" do
39
+ it 'returns to the app host when visiting a relative url' do
42
40
  Capybara.app_host = bases[1]
43
41
  @session.visit("#{bases[0]}/host")
44
42
  should_be_on 0
@@ -47,67 +45,76 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
47
45
  Capybara.app_host = nil
48
46
  end
49
47
 
50
- it "is affected by setting Capybara.app_host" do
48
+ it 'is affected by setting Capybara.app_host' do
51
49
  Capybara.app_host = bases[0]
52
- @session.visit("/host")
50
+ @session.visit('/host')
53
51
  should_be_on 0
54
52
  Capybara.app_host = bases[1]
55
- @session.visit("/host")
53
+ @session.visit('/host')
56
54
  should_be_on 1
57
55
  Capybara.app_host = nil
58
56
  end
59
57
 
60
- it "is unaffected by following a relative link" do
58
+ it 'is unaffected by following a relative link' do
61
59
  visit_host_links
62
- @session.click_link("Relative Host")
60
+ @session.click_link('Relative Host')
63
61
  should_be_on 0
64
62
  end
65
63
 
66
- it "is affected by following an absolute link" do
64
+ it 'is affected by following an absolute link' do
67
65
  visit_host_links
68
- @session.click_link("Absolute Host")
66
+ @session.click_link('Absolute Host')
69
67
  should_be_on 1
70
68
  end
71
69
 
72
- it "is unaffected by posting through a relative form" do
70
+ it 'is unaffected by posting through a relative form' do
73
71
  visit_host_links
74
- @session.click_button("Relative Host")
72
+ @session.click_button('Relative Host')
75
73
  should_be_on 0
76
74
  end
77
75
 
78
- it "is affected by posting through an absolute form" do
76
+ it 'is affected by posting through an absolute form' do
79
77
  visit_host_links
80
- @session.click_button("Absolute Host")
78
+ @session.click_button('Absolute Host')
81
79
  should_be_on 1
82
80
  end
83
81
 
84
- it "is affected by following a redirect" do
82
+ it 'is affected by following a redirect' do
85
83
  @session.visit("#{bases[0]}/redirect")
86
- should_be_on 0, "/landed"
84
+ should_be_on 0, '/landed'
85
+ end
86
+
87
+ it 'maintains fragment' do
88
+ @session.visit("#{bases[0]}/redirect#fragment")
89
+ should_be_on 0, '/landed#fragment'
90
+ end
91
+
92
+ it 'redirects to a fragment' do
93
+ @session.visit("#{bases[0]}/redirect_with_fragment")
94
+ should_be_on 0, '/landed#with_fragment'
87
95
  end
88
96
 
89
- it "is affected by pushState", requires: [:js] do
90
- @session.visit("/with_js")
97
+ it 'is affected by pushState', requires: [:js] do
98
+ @session.visit('/with_js')
91
99
  @session.execute_script("window.history.pushState({}, '', '/pushed')")
92
- expect(@session.current_path).to eq("/pushed")
100
+ expect(@session.current_path).to eq('/pushed')
93
101
  end
94
102
 
95
- it "is affected by replaceState", requires: [:js] do
96
- @session.visit("/with_js")
103
+ it 'is affected by replaceState', requires: [:js] do
104
+ @session.visit('/with_js')
97
105
  @session.execute_script("window.history.replaceState({}, '', '/replaced')")
98
- expect(@session.current_path).to eq("/replaced")
106
+ expect(@session.current_path).to eq('/replaced')
99
107
  end
100
108
 
101
- it "doesn't raise exception on a nil current_url" do
102
- skip "Only makes sense when there is a real driver" unless @session.respond_to?(:driver)
103
- allow(@session.driver).to receive(:current_url) { nil }
104
- @session.visit("/")
109
+ it "doesn't raise exception on a nil current_url", requires: [:driver] do
110
+ allow(@session.driver).to receive(:current_url).and_return(nil)
111
+ @session.visit('/')
105
112
  expect { @session.current_url }.not_to raise_exception
106
113
  expect { @session.current_path }.not_to raise_exception
107
114
  end
108
115
 
109
- context "within iframe", requires: [:frames] do
110
- it "should get the url of the top level browsing context" do
116
+ context 'within iframe', requires: [:frames] do
117
+ it 'should get the url of the top level browsing context' do
111
118
  @session.visit('/within_frames')
112
119
  expect(@session.current_url).to match(/within_frames\z/)
113
120
  @session.within_frame('frameOne') do