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,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#visit' do
4
- it "should fetch a response from the driver with a relative url" do
4
+ it 'should fetch a response from the driver with a relative url' do
5
5
  @session.visit('/')
6
6
  expect(@session).to have_content('Hello world!')
7
7
  @session.visit('/foo')
8
8
  expect(@session).to have_content('Another World')
9
9
  end
10
10
 
11
- it "should fetch a response from the driver with an absolute url with a port" do
11
+ it 'should fetch a response from the driver with an absolute url with a port' do
12
12
  # Preparation
13
13
  @session.visit('/')
14
14
  root_uri = URI.parse(@session.current_url)
@@ -28,41 +28,40 @@ Capybara::SpecHelper.spec '#visit' do
28
28
  expect(@session).to have_content('Hello world!')
29
29
  end
30
30
 
31
- it "should fetch a response when sequentially visiting same destination with a target" do
32
- skip "Chrome/chromedriver has an issue visiting URL with target after visiting same URL without target" if chrome_lt?(65.0, @session)
31
+ it 'should fetch a response when sequentially visiting same destination with a target' do
33
32
  @session.visit('/form')
34
33
  expect(@session).to have_css('#form_title')
35
34
  @session.visit('/form#form_title')
36
35
  expect(@session).to have_css('#form_title')
37
36
  end
38
37
 
39
- it "raises any errors caught inside the server", requires: [:server] do
40
- quietly { @session.visit("/error") }
38
+ it 'raises any errors caught inside the server', requires: [:server] do
39
+ quietly { @session.visit('/error') }
41
40
  expect do
42
- @session.visit("/")
41
+ @session.visit('/')
43
42
  end.to raise_error(TestApp::TestAppError)
44
43
  end
45
44
 
46
- it "should be able to open non-http url", requires: [:about_scheme] do
47
- @session.visit("about:blank")
48
- @session.assert_no_selector :xpath, "/html/body/*"
45
+ it 'should be able to open non-http url', requires: [:about_scheme] do
46
+ @session.visit('about:blank')
47
+ @session.assert_no_selector :xpath, '/html/body/*'
49
48
  end
50
49
 
51
- context "when Capybara.always_include_port is true" do
50
+ context 'when Capybara.always_include_port is true' do
52
51
  let(:root_uri) do
53
52
  @session.visit('/')
54
53
  URI.parse(@session.current_url)
55
54
  end
56
55
 
57
- before(:each) do
56
+ before do
58
57
  Capybara.always_include_port = true
59
58
  end
60
59
 
61
- after(:each) do
60
+ after do
62
61
  Capybara.always_include_port = false
63
62
  end
64
63
 
65
- it "should fetch a response from the driver with an absolute url without a port" do
64
+ it 'should fetch a response from the driver with an absolute url without a port' do
66
65
  @session.visit("http://#{root_uri.host}/")
67
66
  expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
68
67
  expect(@session).to have_content('Hello world!')
@@ -72,127 +71,154 @@ Capybara::SpecHelper.spec '#visit' do
72
71
  expect(@session).to have_content('Another World')
73
72
  end
74
73
 
75
- it "should add the server port to a visited url if no port specified", requires: [:server] do
76
- expect(@session.driver).to receive(:visit).with("http://www.example.com:#{@session.server.port}")
77
- @session.visit("http://www.example.com")
74
+ it 'should add the server port to a visited url if no port specified', requires: [:server] do
75
+ allow(@session.driver).to receive(:visit)
76
+ @session.visit('http://www.example.com')
77
+ expect(@session.driver).to have_received(:visit).with("http://www.example.com:#{@session.server.port}")
78
78
  end
79
79
 
80
- it "should not override the visit specified port even if default for scheme", requires: [:server] do
81
- expect(@session.driver).to receive(:visit).with("http://www.example.com:80")
80
+ it 'should not override the visit specified port even if default for scheme', requires: [:server] do
81
+ allow(@session.driver).to receive(:visit)
82
82
  @session.visit('http://www.example.com:80')
83
+ expect(@session.driver).to have_received(:visit).with('http://www.example.com:80')
83
84
  end
84
85
 
85
- it "should give preference to app_host port if specified", requires: [:server] do
86
- Capybara.app_host = "http://www.example.com:6666"
87
- expect(@session.driver).to receive(:visit).with("http://www.example.com:6666/random")
86
+ it 'should give preference to app_host port if specified', requires: [:server] do
87
+ allow(@session.driver).to receive(:visit)
88
+ Capybara.app_host = 'http://www.example.com:6666'
88
89
  @session.visit('/random')
90
+ expect(@session.driver).to have_received(:visit).with('http://www.example.com:6666/random')
89
91
  end
90
92
 
91
93
  it "shouldn't override port if no server", requires: [:server] do
92
94
  session = Capybara::Session.new(@session.mode, nil)
93
- expect(session.driver).to receive(:visit).with("http://www.google.com")
94
- session.visit("http://www.google.com")
95
+ allow(session.driver).to receive(:visit)
96
+ session.visit('http://www.google.com')
97
+ expect(session.driver).to have_received(:visit).with('http://www.google.com')
95
98
  end
96
99
 
97
100
  it "shouldn't override port if no server but app_host is set", requires: [:server] do
98
101
  session = Capybara::Session.new(@session.mode, nil)
99
- Capybara.app_host = "http://www.example.com:6666"
100
- expect(session.driver).to receive(:visit).with("http://www.google.com")
101
- session.visit("http://www.google.com")
102
+ Capybara.app_host = 'http://www.example.com:6666'
103
+ allow(session.driver).to receive(:visit)
104
+ session.visit('http://www.google.com')
105
+ expect(session.driver).to have_received(:visit).with('http://www.google.com')
102
106
  end
103
107
  end
104
108
 
105
- context "when Capybara.always_include_port is false" do
106
- before(:each) do
109
+ context 'when Capybara.always_include_port is false' do
110
+ before do
107
111
  Capybara.always_include_port = false
108
112
  end
109
113
 
110
114
  it "shouldn't overwrite port if app_host is set", requires: [:server] do
111
115
  session = Capybara::Session.new(@session.mode, nil)
112
- Capybara.app_host = "http://www.example.com:6666"
113
- expect(session.driver).to receive(:visit).with("http://www.google.com")
114
- session.visit("http://www.google.com")
116
+ Capybara.app_host = 'http://www.example.com:6666'
117
+ allow(session.driver).to receive(:visit)
118
+ session.visit('http://www.google.com')
119
+ expect(session.driver).to have_received(:visit).with('http://www.google.com')
115
120
  end
116
121
 
117
122
  it "shouldn't overwrite port if port specfified", requires: [:server] do
118
123
  session = Capybara::Session.new(@session.mode, nil)
119
- Capybara.app_host = "http://www.example.com:6666"
120
- expect(session.driver).to receive(:visit).with("http://www.google.com:99")
121
- session.visit("http://www.google.com:99")
124
+ Capybara.app_host = 'http://www.example.com:6666'
125
+ allow(session.driver).to receive(:visit)
126
+ session.visit('http://www.google.com:99')
127
+ expect(session.driver).to have_received(:visit).with('http://www.google.com:99')
122
128
  end
123
129
  end
124
130
 
125
- context "without a server", requires: [:server] do
126
- it "should respect `app_host`" do
131
+ context 'without a server', requires: [:server] do
132
+ it 'should respect `app_host`' do
127
133
  serverless_session = Capybara::Session.new(@session.mode, nil)
128
134
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
129
- serverless_session.visit("/foo")
130
- expect(serverless_session).to have_content("Another World")
135
+ serverless_session.visit('/foo')
136
+ expect(serverless_session).to have_content('Another World')
131
137
  end
132
138
 
133
- it "should visit a fully qualified URL" do
139
+ it 'should visit a fully qualified URL' do
134
140
  serverless_session = Capybara::Session.new(@session.mode, nil)
135
141
  serverless_session.visit("http://#{@session.server.host}:#{@session.server.port}/foo")
136
- expect(serverless_session).to have_content("Another World")
142
+ expect(serverless_session).to have_content('Another World')
137
143
  end
138
144
  end
139
145
 
140
- context "with Capybara.app_host set" do
141
- it "should override server", requires: [:server] do
146
+ context 'with Capybara.app_host set' do
147
+ it 'should override server', requires: [:server] do
142
148
  another_session = Capybara::Session.new(@session.mode, @session.app.dup)
143
149
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
144
150
  another_session.visit('/foo')
145
- expect(another_session).to have_content("Another World")
151
+ expect(another_session).to have_content('Another World')
146
152
  expect(another_session.current_url).to start_with(Capybara.app_host)
147
153
  expect(URI.parse(another_session.current_url).port).not_to eq another_session.server.port
148
154
  expect(URI.parse(another_session.current_url).port).to eq @session.server.port
149
155
  end
150
156
 
151
- it "should append relative path", requires: [:server] do
157
+ it 'should append relative path', requires: [:server] do
152
158
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/redirect/0"
153
159
  @session.visit('/times')
154
160
  expect(@session).to have_content('redirection complete')
155
161
  end
156
162
 
157
- it "should work if `app_host` has a trailing /", requires: [:server] do
163
+ it 'should work if `app_host` has a trailing /', requires: [:server] do
158
164
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/"
159
165
  @session.visit('/')
160
166
  expect(@session).to have_content('Hello world!')
161
167
  end
162
168
  end
163
169
 
164
- it "should send no referer when visiting a page" do
170
+ it 'should send no referer when visiting a page' do
165
171
  @session.visit '/get_referer'
166
172
  expect(@session).to have_content 'No referer'
167
173
  end
168
174
 
169
- it "should send no referer when visiting a second page" do
175
+ it 'should send no referer when visiting a second page' do
170
176
  @session.visit '/get_referer'
171
177
  @session.visit '/get_referer'
172
178
  expect(@session).to have_content 'No referer'
173
179
  end
174
180
 
175
- it "should send a referer when following a link" do
181
+ it 'should send a referer when following a link' do
176
182
  @session.visit '/referer_base'
177
183
  @session.find('//a[@href="/get_referer"]').click
178
184
  expect(@session).to have_content %r{http://.*/referer_base}
179
185
  end
180
186
 
181
- it "should preserve the original referer URL when following a redirect" do
187
+ it 'should preserve the original referer URL when following a redirect' do
182
188
  @session.visit('/referer_base')
183
189
  @session.find('//a[@href="/redirect_to_get_referer"]').click
184
190
  expect(@session).to have_content %r{http://.*/referer_base}
185
191
  end
186
192
 
187
- it "should send a referer when submitting a form" do
193
+ it 'should send a referer when submitting a form' do
188
194
  @session.visit '/referer_base'
189
195
  @session.find('//input').click
190
196
  expect(@session).to have_content %r{http://.*/referer_base}
191
197
  end
192
198
 
193
- it "can set cookie if a blank path is specified" do
194
- @session.visit("")
199
+ it 'can set cookie if a blank path is specified' do
200
+ @session.visit('')
195
201
  @session.visit('/get_cookie')
196
202
  expect(@session).to have_content('root cookie')
197
203
  end
204
+
205
+ context 'with base element' do
206
+ it 'should use base href with relative links' do
207
+ @session.visit('/base/with_base')
208
+ @session.click_link('Title page')
209
+ expect(@session).to have_current_path('/with_title')
210
+ end
211
+
212
+ it 'should use base href with bare queries' do
213
+ @session.visit('/base/with_base')
214
+ @session.click_link('Bare query')
215
+ expect(@session).to have_current_path('/?a=3')
216
+ end
217
+
218
+ it 'should not use the base href with a new visit call' do
219
+ @session.visit('/base/with_other_base')
220
+ @session.visit('with_html')
221
+ expect(@session).to have_current_path('/with_html')
222
+ end
223
+ end
198
224
  end
@@ -1,38 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
4
- before(:each) do
5
- @window = @session.current_window
6
- @session.visit('/with_windows')
7
- @other_window = @session.window_opened_by do
4
+ let!(:window) { @session.current_window }
5
+ let(:other_window) do
6
+ @session.window_opened_by do
8
7
  @session.find(:css, '#openWindow').click
9
8
  end
10
9
  end
11
10
 
12
- after(:each) do
11
+ before do
12
+ @session.visit('/with_windows')
13
+ end
14
+
15
+ after do
13
16
  @session.document.synchronize(5, errors: [Capybara::CapybaraError]) do
14
17
  raise Capybara::CapybaraError if @session.windows.size != 1
15
18
  end
16
- @session.switch_to_window(@window)
19
+ @session.switch_to_window(window)
17
20
  end
18
21
 
19
22
  context 'with :wait option' do
20
23
  it 'should wait if value of :wait is more than timeout' do
21
- @session.within_window @other_window do
24
+ @session.within_window other_window do
22
25
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
23
26
  end
24
27
  Capybara.using_wait_time 0.1 do
25
- expect(@other_window).to become_closed(wait: 5)
28
+ expect(other_window).to become_closed(wait: 5)
26
29
  end
27
30
  end
28
31
 
29
32
  it 'should raise error if value of :wait is less than timeout' do
30
- @session.within_window @other_window do
33
+ @session.within_window other_window do
31
34
  @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
32
35
  end
33
36
  Capybara.using_wait_time 2 do
34
37
  expect do
35
- expect(@other_window).to become_closed(wait: 0.2)
38
+ expect(other_window).to become_closed(wait: 0.2)
36
39
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.2 seconds\Z/)
37
40
  end
38
41
  end
@@ -40,21 +43,21 @@ Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
40
43
 
41
44
  context 'without :wait option' do
42
45
  it 'should wait if value of default_max_wait_time is more than timeout' do
43
- @session.within_window @other_window do
46
+ @session.within_window other_window do
44
47
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
45
48
  end
46
49
  Capybara.using_wait_time 5 do
47
- expect(@other_window).to become_closed
50
+ expect(other_window).to become_closed
48
51
  end
49
52
  end
50
53
 
51
54
  it 'should raise error if value of default_max_wait_time is less than timeout' do
52
- @session.within_window @other_window do
55
+ @session.within_window other_window do
53
56
  @session.execute_script('setTimeout(function(){ window.close(); }, 900);')
54
57
  end
55
58
  Capybara.using_wait_time 0.4 do
56
59
  expect do
57
- expect(@other_window).to become_closed
60
+ expect(other_window).to become_closed
58
61
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.4 seconds\Z/)
59
62
  end
60
63
  end
@@ -62,23 +65,23 @@ Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
62
65
 
63
66
  context 'with not_to' do
64
67
  it "should not raise error if window doesn't close before default_max_wait_time" do
65
- @session.within_window @other_window do
68
+ @session.within_window other_window do
66
69
  @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
67
70
  end
68
71
  Capybara.using_wait_time 0.3 do
69
72
  expect do
70
- expect(@other_window).not_to become_closed
71
- end
73
+ expect(other_window).not_to become_closed
74
+ end.not_to raise_error
72
75
  end
73
76
  end
74
77
 
75
78
  it 'should raise error if window closes before default_max_wait_time' do
76
- @session.within_window @other_window do
79
+ @session.within_window other_window do
77
80
  @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
78
81
  end
79
82
  Capybara.using_wait_time 3.1 do
80
83
  expect do
81
- expect(@other_window).not_to become_closed
84
+ expect(other_window).not_to become_closed
82
85
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 3.1 seconds\Z/)
83
86
  end
84
87
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
4
- before(:each) do
4
+ before do
5
5
  @window = @session.current_window
6
6
  @session.visit('/with_windows')
7
7
  end
8
- after(:each) do
8
+
9
+ after do
9
10
  (@session.windows - [@window]).each do |w|
10
11
  @session.switch_to_window w
11
12
  w.close
@@ -17,7 +18,7 @@ Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
17
18
  expect(@session.current_window).to be_instance_of(Capybara::Window)
18
19
  end
19
20
 
20
- it "should be modified by switching to another window" do
21
+ it 'should be modified by switching to another window' do
21
22
  window = @session.window_opened_by { @session.find(:css, '#openWindow').click }
22
23
 
23
24
  expect do
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#open_new_window', requires: [:windows] do
4
- before(:each) do
4
+ before do
5
5
  @window = @session.current_window
6
6
  @session.visit('/with_windows')
7
7
  end
8
- after(:each) do
8
+
9
+ after do
9
10
  (@session.windows - [@window]).each do |w|
10
11
  @session.switch_to_window w
11
12
  w.close
@@ -16,7 +17,7 @@ Capybara::SpecHelper.spec '#open_new_window', requires: [:windows] do
16
17
  it 'should open new window with blank url and title' do
17
18
  window = @session.open_new_window
18
19
  @session.switch_to_window(window)
19
- expect(['', 'about:blank']).to include(@session.title)
20
+ expect(@session.title).to satisfy('be a blank title') { |title| ['', 'about:blank'].include? title }
20
21
  expect(@session.current_url).to eq('about:blank')
21
22
  end
22
23
 
@@ -1,13 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
4
+ # because of the methods being tested. In tests using Capybara this type of behavior should be implemented
5
+ # using Capybara provided assertions with builtin waiting behavior.
6
+
3
7
  Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
4
- before(:each) do
8
+ before do
5
9
  @window = @session.current_window
6
10
  @session.visit('/with_windows')
7
- expect(@session).to have_css('body.loaded')
11
+ @session.assert_selector(:css, 'body.loaded')
8
12
  end
9
13
 
10
- after(:each) do
14
+ after do
11
15
  (@session.windows - [@window]).each do |w|
12
16
  @session.switch_to_window w
13
17
  w.close
@@ -15,27 +19,27 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
15
19
  @session.switch_to_window(@window)
16
20
  end
17
21
 
18
- it "should raise error when invoked without args" do
22
+ it 'should raise error when invoked without args' do
19
23
  expect do
20
24
  @session.switch_to_window
21
- end.to raise_error(ArgumentError, "`switch_to_window`: either window or block should be provided")
25
+ end.to raise_error(ArgumentError, '`switch_to_window`: either window or block should be provided')
22
26
  end
23
27
 
24
- it "should raise error when invoked with window and block" do
28
+ it 'should raise error when invoked with window and block' do
25
29
  expect do
26
30
  @session.switch_to_window(@window) { @session.title == 'Title of the first popup' }
27
- end.to raise_error(ArgumentError, "`switch_to_window` can take either a block or a window, not both")
31
+ end.to raise_error(ArgumentError, '`switch_to_window` can take either a block or a window, not both')
28
32
  end
29
33
 
30
- context "with an instance of Capybara::Window" do
31
- it "should be able to switch to window" do
34
+ context 'with an instance of Capybara::Window' do
35
+ it 'should be able to switch to window' do
32
36
  window = @session.open_new_window
33
37
  expect(@session.title).to eq('With Windows')
34
38
  @session.switch_to_window(window)
35
- expect(['', 'about:blank']).to include(@session.title)
39
+ expect(@session.title).to satisfy('be a blank title') { |title| ['', 'about:blank'].include? title }
36
40
  end
37
41
 
38
- it "should raise error when closed window is passed" do
42
+ it 'should raise error when closed window is passed' do
39
43
  original_window = @session.current_window
40
44
  new_window = @session.open_new_window
41
45
  @session.switch_to_window(new_window)
@@ -47,30 +51,30 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
47
51
  end
48
52
  end
49
53
 
50
- context "with block" do
51
- before(:each) do
54
+ context 'with block' do
55
+ before do
52
56
  @session.find(:css, '#openTwoWindows').click
53
57
  sleep(1) # wait for the windows to open
54
58
  end
55
59
 
56
- it "should be able to switch to current window" do
60
+ it 'should be able to switch to current window' do
57
61
  @session.switch_to_window { @session.title == 'With Windows' }
58
62
  expect(@session).to have_css('#openTwoWindows')
59
63
  end
60
64
 
61
- it "should find the div in another window" do
65
+ it 'should find the div in another window' do
62
66
  @session.switch_to_window { @session.title == 'Title of popup two' }
63
67
  expect(@session).to have_css('#divInPopupTwo')
64
68
  end
65
69
 
66
- it "should be able to switch multiple times" do
70
+ it 'should be able to switch multiple times' do
67
71
  @session.switch_to_window { @session.title == 'Title of the first popup' }
68
72
  expect(@session).to have_css('#divInPopupOne')
69
73
  @session.switch_to_window { @session.title == 'Title of popup two' }
70
74
  expect(@session).to have_css('#divInPopupTwo')
71
75
  end
72
76
 
73
- it "should return window" do
77
+ it 'should return window' do
74
78
  window = @session.switch_to_window { @session.title == 'Title of popup two' }
75
79
  expect((@session.windows - [@window])).to include(window)
76
80
  end
@@ -91,7 +95,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
91
95
  end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked from/)
92
96
  end
93
97
 
94
- it "should allow to be called inside within_window and within_window will still return to original" do
98
+ it 'should allow to be called inside within_window and within_window will still return to original' do
95
99
  other_windows = (@session.windows - [@window])
96
100
  expect(@session.current_window).to eq(@window)
97
101
  @session.within_window other_windows[0] do
@@ -106,11 +110,11 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
106
110
  original = @session.current_window
107
111
  expect do
108
112
  @session.switch_to_window { @session.title == 'A title' }
109
- end.to raise_error(Capybara::WindowError, "Could not find a window matching block/lambda")
113
+ end.to raise_error(Capybara::WindowError, 'Could not find a window matching block/lambda')
110
114
  expect(@session.current_window).to eq(original)
111
115
  end
112
116
 
113
- it "should switch to original window if error is raised inside block" do
117
+ it 'should switch to original window if error is raised inside block' do
114
118
  original = @session.switch_to_window(@session.windows[1])
115
119
  expect do
116
120
  @session.switch_to_window { raise 'error' }
@@ -119,7 +123,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
119
123
  end
120
124
  end
121
125
 
122
- it "should wait for window to appear" do
126
+ it 'should wait for window to appear' do
123
127
  @session.find(:css, '#openWindowWithTimeout').click
124
128
  expect do
125
129
  @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup' }
@@ -1,12 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
4
+ # because of the methods being tested. In tests using Capybara this type of behavior should be implemented
5
+ # using Capybara provided assertions with builtin waiting behavior.
6
+
3
7
  Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
4
- before(:each) do
8
+ before do
5
9
  @window = @session.current_window
6
10
  @session.visit('/with_windows')
7
- expect(@session).to have_css('body.loaded')
11
+ @session.assert_selector(:css, 'body.loaded')
8
12
  end
9
- after(:each) do
13
+
14
+ after do
10
15
  (@session.windows - [@window]).each do |w|
11
16
  @session.switch_to_window w
12
17
  w.close
@@ -14,8 +19,8 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
14
19
  @session.switch_to_window(@window)
15
20
  end
16
21
 
17
- let(:zero_windows_message) { "block passed to #window_opened_by opened 0 windows instead of 1" }
18
- let(:two_windows_message) { "block passed to #window_opened_by opened 2 windows instead of 1" }
22
+ let(:zero_windows_message) { 'block passed to #window_opened_by opened 0 windows instead of 1' }
23
+ let(:two_windows_message) { 'block passed to #window_opened_by opened 2 windows instead of 1' }
19
24
 
20
25
  context 'with :wait option' do
21
26
  it 'should raise error if value of :wait is less than timeout' do