capybara 2.7.0 → 3.35.3

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 (318) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/History.md +1147 -11
  4. data/License.txt +1 -1
  5. data/README.md +252 -131
  6. data/lib/capybara/config.rb +92 -0
  7. data/lib/capybara/cucumber.rb +3 -3
  8. data/lib/capybara/driver/base.rb +52 -21
  9. data/lib/capybara/driver/node.rb +48 -14
  10. data/lib/capybara/dsl.rb +16 -9
  11. data/lib/capybara/helpers.rb +72 -81
  12. data/lib/capybara/minitest/spec.rb +267 -0
  13. data/lib/capybara/minitest.rb +385 -0
  14. data/lib/capybara/node/actions.rb +337 -89
  15. data/lib/capybara/node/base.rb +50 -32
  16. data/lib/capybara/node/document.rb +19 -3
  17. data/lib/capybara/node/document_matchers.rb +22 -24
  18. data/lib/capybara/node/element.rb +388 -125
  19. data/lib/capybara/node/finders.rb +231 -121
  20. data/lib/capybara/node/matchers.rb +503 -217
  21. data/lib/capybara/node/simple.rb +64 -27
  22. data/lib/capybara/queries/ancestor_query.rb +27 -0
  23. data/lib/capybara/queries/base_query.rb +87 -11
  24. data/lib/capybara/queries/current_path_query.rb +24 -24
  25. data/lib/capybara/queries/match_query.rb +15 -10
  26. data/lib/capybara/queries/selector_query.rb +675 -81
  27. data/lib/capybara/queries/sibling_query.rb +26 -0
  28. data/lib/capybara/queries/style_query.rb +45 -0
  29. data/lib/capybara/queries/text_query.rb +88 -20
  30. data/lib/capybara/queries/title_query.rb +9 -11
  31. data/lib/capybara/rack_test/browser.rb +63 -39
  32. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  33. data/lib/capybara/rack_test/driver.rb +26 -16
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +73 -58
  36. data/lib/capybara/rack_test/node.rb +187 -67
  37. data/lib/capybara/rails.rb +4 -8
  38. data/lib/capybara/registration_container.rb +44 -0
  39. data/lib/capybara/registrations/drivers.rb +42 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  41. data/lib/capybara/registrations/servers.rb +45 -0
  42. data/lib/capybara/result.rb +142 -14
  43. data/lib/capybara/rspec/features.rb +17 -42
  44. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  45. data/lib/capybara/rspec/matchers/base.rb +111 -0
  46. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  47. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  48. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  49. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  50. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  51. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  52. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  53. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  54. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  55. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  56. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  57. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  58. data/lib/capybara/rspec/matchers.rb +143 -244
  59. data/lib/capybara/rspec.rb +10 -12
  60. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  61. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  62. data/lib/capybara/selector/css.rb +102 -0
  63. data/lib/capybara/selector/definition/button.rb +63 -0
  64. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  65. data/lib/capybara/selector/definition/css.rb +10 -0
  66. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  67. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  68. data/lib/capybara/selector/definition/element.rb +28 -0
  69. data/lib/capybara/selector/definition/field.rb +40 -0
  70. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  71. data/lib/capybara/selector/definition/file_field.rb +13 -0
  72. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  73. data/lib/capybara/selector/definition/frame.rb +17 -0
  74. data/lib/capybara/selector/definition/id.rb +6 -0
  75. data/lib/capybara/selector/definition/label.rb +62 -0
  76. data/lib/capybara/selector/definition/link.rb +54 -0
  77. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  78. data/lib/capybara/selector/definition/option.rb +27 -0
  79. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  80. data/lib/capybara/selector/definition/select.rb +81 -0
  81. data/lib/capybara/selector/definition/table.rb +109 -0
  82. data/lib/capybara/selector/definition/table_row.rb +21 -0
  83. data/lib/capybara/selector/definition/xpath.rb +5 -0
  84. data/lib/capybara/selector/definition.rb +278 -0
  85. data/lib/capybara/selector/filter.rb +3 -46
  86. data/lib/capybara/selector/filter_set.rb +124 -0
  87. data/lib/capybara/selector/filters/base.rb +77 -0
  88. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +155 -0
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +232 -369
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +380 -142
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  111. data/lib/capybara/selenium/node.rb +528 -97
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -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/action_pauser.rb +26 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +45 -0
  121. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  122. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  123. data/lib/capybara/server/animation_disabler.rb +63 -0
  124. data/lib/capybara/server/checker.rb +44 -0
  125. data/lib/capybara/server/middleware.rb +71 -0
  126. data/lib/capybara/server.rb +74 -71
  127. data/lib/capybara/session/config.rb +126 -0
  128. data/lib/capybara/session/matchers.rb +44 -27
  129. data/lib/capybara/session.rb +500 -297
  130. data/lib/capybara/spec/fixtures/no_extension +1 -0
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +168 -14
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
  137. data/lib/capybara/spec/session/all_spec.rb +179 -59
  138. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  140. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  141. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  142. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  143. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  144. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  145. data/lib/capybara/spec/session/attach_file_spec.rb +154 -48
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +168 -41
  148. data/lib/capybara/spec/session/choose_spec.rb +75 -23
  149. data/lib/capybara/spec/session/click_button_spec.rb +243 -175
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
  151. data/lib/capybara/spec/session/click_link_spec.rb +100 -53
  152. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  153. data/lib/capybara/spec/session/current_url_spec.rb +61 -35
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
  162. data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
  163. data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
  164. data/lib/capybara/spec/session/find_button_spec.rb +37 -18
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +57 -34
  167. data/lib/capybara/spec/session/find_link_spec.rb +47 -10
  168. data/lib/capybara/spec/session/find_spec.rb +290 -144
  169. data/lib/capybara/spec/session/first_spec.rb +91 -48
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  174. data/lib/capybara/spec/session/go_back_spec.rb +3 -2
  175. data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +76 -19
  180. data/lib/capybara/spec/session/has_css_spec.rb +277 -131
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
  182. data/lib/capybara/spec/session/has_field_spec.rb +177 -107
  183. data/lib/capybara/spec/session/has_link_spec.rb +13 -12
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  185. data/lib/capybara/spec/session/has_select_spec.rb +191 -95
  186. data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  189. data/lib/capybara/spec/session/has_text_spec.rb +126 -60
  190. data/lib/capybara/spec/session/has_title_spec.rb +35 -12
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  193. data/lib/capybara/spec/session/html_spec.rb +14 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +1028 -131
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  197. data/lib/capybara/spec/session/refresh_spec.rb +34 -0
  198. data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
  202. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  206. data/lib/capybara/spec/session/select_spec.rb +112 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +71 -8
  208. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  209. data/lib/capybara/spec/session/text_spec.rb +38 -23
  210. data/lib/capybara/spec/session/title_spec.rb +17 -5
  211. data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
  212. data/lib/capybara/spec/session/unselect_spec.rb +44 -43
  213. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
  219. data/lib/capybara/spec/session/window/window_spec.rb +121 -73
  220. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
  222. data/lib/capybara/spec/session/within_spec.rb +76 -43
  223. data/lib/capybara/spec/spec_helper.rb +67 -33
  224. data/lib/capybara/spec/test_app.rb +85 -36
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/buttons.erb +1 -1
  227. data/lib/capybara/spec/views/fieldsets.erb +1 -1
  228. data/lib/capybara/spec/views/form.erb +227 -20
  229. data/lib/capybara/spec/views/frame_child.erb +10 -2
  230. data/lib/capybara/spec/views/frame_one.erb +2 -1
  231. data/lib/capybara/spec/views/frame_parent.erb +2 -2
  232. data/lib/capybara/spec/views/frame_two.erb +1 -1
  233. data/lib/capybara/spec/views/header_links.erb +1 -1
  234. data/lib/capybara/spec/views/host_links.erb +1 -1
  235. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  236. data/lib/capybara/spec/views/obscured.erb +47 -0
  237. data/lib/capybara/spec/views/offset.erb +32 -0
  238. data/lib/capybara/spec/views/path.erb +1 -1
  239. data/lib/capybara/spec/views/popup_one.erb +1 -1
  240. data/lib/capybara/spec/views/popup_two.erb +1 -1
  241. data/lib/capybara/spec/views/postback.erb +1 -1
  242. data/lib/capybara/spec/views/react.erb +45 -0
  243. data/lib/capybara/spec/views/scroll.erb +20 -0
  244. data/lib/capybara/spec/views/spatial.erb +31 -0
  245. data/lib/capybara/spec/views/tables.erb +69 -2
  246. data/lib/capybara/spec/views/with_animation.erb +82 -0
  247. data/lib/capybara/spec/views/with_base_tag.erb +1 -1
  248. data/lib/capybara/spec/views/with_count.erb +1 -1
  249. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  250. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  251. data/lib/capybara/spec/views/with_hover.erb +7 -1
  252. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  253. data/lib/capybara/spec/views/with_html.erb +100 -10
  254. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  255. data/lib/capybara/spec/views/with_html_entities.erb +1 -1
  256. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  257. data/lib/capybara/spec/views/with_js.erb +49 -3
  258. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  259. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  260. data/lib/capybara/spec/views/with_scope.erb +1 -1
  261. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  262. data/lib/capybara/spec/views/with_simple_html.erb +1 -1
  263. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  264. data/lib/capybara/spec/views/with_title.erb +1 -1
  265. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  266. data/lib/capybara/spec/views/with_windows.erb +7 -1
  267. data/lib/capybara/spec/views/within_frames.erb +6 -3
  268. data/lib/capybara/version.rb +2 -1
  269. data/lib/capybara/window.rb +39 -21
  270. data/lib/capybara.rb +208 -186
  271. data/spec/basic_node_spec.rb +52 -39
  272. data/spec/capybara_spec.rb +72 -50
  273. data/spec/css_builder_spec.rb +101 -0
  274. data/spec/css_splitter_spec.rb +38 -0
  275. data/spec/dsl_spec.rb +81 -61
  276. data/spec/filter_set_spec.rb +46 -0
  277. data/spec/fixtures/capybara.csv +1 -0
  278. data/spec/fixtures/certificate.pem +25 -0
  279. data/spec/fixtures/key.pem +27 -0
  280. data/spec/fixtures/selenium_driver_rspec_failure.rb +7 -3
  281. data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
  282. data/spec/minitest_spec.rb +164 -0
  283. data/spec/minitest_spec_spec.rb +162 -0
  284. data/spec/per_session_config_spec.rb +68 -0
  285. data/spec/rack_test_spec.rb +189 -96
  286. data/spec/regexp_dissassembler_spec.rb +250 -0
  287. data/spec/result_spec.rb +143 -13
  288. data/spec/rspec/features_spec.rb +38 -32
  289. data/spec/rspec/scenarios_spec.rb +9 -7
  290. data/spec/rspec/shared_spec_matchers.rb +959 -0
  291. data/spec/rspec/views_spec.rb +9 -3
  292. data/spec/rspec_matchers_spec.rb +62 -0
  293. data/spec/rspec_spec.rb +127 -30
  294. data/spec/sauce_spec_chrome.rb +43 -0
  295. data/spec/selector_spec.rb +458 -37
  296. data/spec/selenium_spec_chrome.rb +196 -9
  297. data/spec/selenium_spec_chrome_remote.rb +100 -0
  298. data/spec/selenium_spec_edge.rb +47 -0
  299. data/spec/selenium_spec_firefox.rb +210 -0
  300. data/spec/selenium_spec_firefox_remote.rb +80 -0
  301. data/spec/selenium_spec_ie.rb +150 -0
  302. data/spec/selenium_spec_safari.rb +148 -0
  303. data/spec/server_spec.rb +200 -101
  304. data/spec/session_spec.rb +91 -0
  305. data/spec/shared_selenium_node.rb +83 -0
  306. data/spec/shared_selenium_session.rb +558 -0
  307. data/spec/spec_helper.rb +94 -2
  308. data/spec/xpath_builder_spec.rb +93 -0
  309. metadata +420 -60
  310. data/lib/capybara/query.rb +0 -7
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -60
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -196
  314. data/lib/capybara/spec/session/assert_title.rb +0 -70
  315. data/lib/capybara/spec/session/source_spec.rb +0 -0
  316. data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
  317. data/spec/rspec/matchers_spec.rb +0 -827
  318. data/spec/selenium_spec.rb +0 -151
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#visit' do
3
- 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
4
5
  @session.visit('/')
5
6
  expect(@session).to have_content('Hello world!')
6
7
  @session.visit('/foo')
7
8
  expect(@session).to have_content('Another World')
8
9
  end
9
10
 
10
- 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
11
12
  # Preparation
12
13
  @session.visit('/')
13
14
  root_uri = URI.parse(@session.current_url)
@@ -27,34 +28,40 @@ Capybara::SpecHelper.spec '#visit' do
27
28
  expect(@session).to have_content('Hello world!')
28
29
  end
29
30
 
30
- it "raises any errors caught inside the server", :requires => [:server] do
31
- quietly { @session.visit("/error") }
31
+ it 'should fetch a response when sequentially visiting same destination with a target' do
32
+ @session.visit('/form')
33
+ expect(@session).to have_css('#form_title')
34
+ @session.visit('/form#form_title')
35
+ expect(@session).to have_css('#form_title')
36
+ end
37
+
38
+ it 'raises any errors caught inside the server', requires: [:server] do
39
+ quietly { @session.visit('/error') }
32
40
  expect do
33
- @session.visit("/")
41
+ @session.visit('/')
34
42
  end.to raise_error(TestApp::TestAppError)
35
43
  end
36
44
 
37
- it "should be able to open non-http url", requires: [:about_scheme] do
38
- @session.visit("about:blank")
39
- @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/*'
40
48
  end
41
49
 
42
- context "when Capybara.always_include_port is true" do
43
-
50
+ context 'when Capybara.always_include_port is true' do
44
51
  let(:root_uri) do
45
52
  @session.visit('/')
46
53
  URI.parse(@session.current_url)
47
54
  end
48
55
 
49
- before(:each) do
56
+ before do
50
57
  Capybara.always_include_port = true
51
58
  end
52
59
 
53
- after(:each) do
60
+ after do
54
61
  Capybara.always_include_port = false
55
62
  end
56
63
 
57
- 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
58
65
  @session.visit("http://#{root_uri.host}/")
59
66
  expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
60
67
  expect(@session).to have_content('Hello world!')
@@ -63,75 +70,135 @@ Capybara::SpecHelper.spec '#visit' do
63
70
  expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
64
71
  expect(@session).to have_content('Another World')
65
72
  end
73
+
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
+ end
79
+
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
+ @session.visit('http://www.example.com:80')
83
+ expect(@session.driver).to have_received(:visit).with('http://www.example.com:80')
84
+ end
85
+
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'
89
+ @session.visit('/random')
90
+ expect(@session.driver).to have_received(:visit).with('http://www.example.com:6666/random')
91
+ end
92
+
93
+ it "shouldn't override port if no server", requires: [:server] do
94
+ session = Capybara::Session.new(@session.mode, nil)
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')
98
+ end
99
+
100
+ it "shouldn't override port if no server but app_host is set", requires: [:server] do
101
+ session = Capybara::Session.new(@session.mode, nil)
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')
106
+ end
66
107
  end
67
108
 
68
- context "without a server", :requires => [:server] do
69
- it "should respect `app_host`" do
109
+ context 'when Capybara.always_include_port is false' do
110
+ before do
111
+ Capybara.always_include_port = false
112
+ end
113
+
114
+ it "shouldn't overwrite port if app_host is set", requires: [:server] do
115
+ session = Capybara::Session.new(@session.mode, nil)
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')
120
+ end
121
+
122
+ it "shouldn't overwrite port if port specfified", requires: [:server] do
123
+ session = Capybara::Session.new(@session.mode, nil)
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')
128
+ end
129
+ end
130
+
131
+ context 'without a server', requires: [:server] do
132
+ it 'should respect `app_host`' do
70
133
  serverless_session = Capybara::Session.new(@session.mode, nil)
71
134
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
72
- serverless_session.visit("/foo")
73
- expect(serverless_session).to have_content("Another World")
135
+ serverless_session.visit('/foo')
136
+ expect(serverless_session).to have_content('Another World')
74
137
  end
75
138
 
76
- it "should visit a fully qualified URL" do
139
+ it 'should visit a fully qualified URL' do
77
140
  serverless_session = Capybara::Session.new(@session.mode, nil)
78
141
  serverless_session.visit("http://#{@session.server.host}:#{@session.server.port}/foo")
79
- expect(serverless_session).to have_content("Another World")
142
+ expect(serverless_session).to have_content('Another World')
80
143
  end
81
144
  end
82
145
 
83
- context "with Capybara.app_host set" do
84
- it "should override server", requires: [:server] do
146
+ context 'with Capybara.app_host set' do
147
+ it 'should override server', requires: [:server] do
85
148
  another_session = Capybara::Session.new(@session.mode, @session.app.dup)
86
149
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
87
150
  another_session.visit('/foo')
88
- expect(another_session).to have_content("Another World")
151
+ expect(another_session).to have_content('Another World')
89
152
  expect(another_session.current_url).to start_with(Capybara.app_host)
90
153
  expect(URI.parse(another_session.current_url).port).not_to eq another_session.server.port
91
154
  expect(URI.parse(another_session.current_url).port).to eq @session.server.port
92
155
  end
93
156
 
94
- it "should append relative path", requires: [:server] do
157
+ it 'should append relative path', requires: [:server] do
95
158
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/redirect/0"
96
159
  @session.visit('/times')
97
160
  expect(@session).to have_content('redirection complete')
98
161
  end
99
- end
100
162
 
163
+ it 'should work if `app_host` has a trailing /', requires: [:server] do
164
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/"
165
+ @session.visit('/')
166
+ expect(@session).to have_content('Hello world!')
167
+ end
168
+ end
101
169
 
102
- it "should send no referer when visiting a page" do
170
+ it 'should send no referer when visiting a page' do
103
171
  @session.visit '/get_referer'
104
172
  expect(@session).to have_content 'No referer'
105
173
  end
106
174
 
107
- it "should send no referer when visiting a second page" do
175
+ it 'should send no referer when visiting a second page' do
108
176
  @session.visit '/get_referer'
109
177
  @session.visit '/get_referer'
110
178
  expect(@session).to have_content 'No referer'
111
179
  end
112
180
 
113
- it "should send a referer when following a link" do
181
+ it 'should send a referer when following a link' do
114
182
  @session.visit '/referer_base'
115
183
  @session.find('//a[@href="/get_referer"]').click
116
184
  expect(@session).to have_content %r{http://.*/referer_base}
117
185
  end
118
186
 
119
- 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
120
188
  @session.visit('/referer_base')
121
189
  @session.find('//a[@href="/redirect_to_get_referer"]').click
122
190
  expect(@session).to have_content %r{http://.*/referer_base}
123
191
  end
124
192
 
125
- it "should send a referer when submitting a form" do
193
+ it 'should send a referer when submitting a form' do
126
194
  @session.visit '/referer_base'
127
195
  @session.find('//input').click
128
196
  expect(@session).to have_content %r{http://.*/referer_base}
129
197
  end
130
198
 
131
- it "can set cookie if a blank path is specified" do
132
- @session.visit("")
199
+ it 'can set cookie if a blank path is specified' do
200
+ @session.visit('')
133
201
  @session.visit('/get_cookie')
134
202
  expect(@session).to have_content('root cookie')
135
203
  end
136
-
137
204
  end
@@ -1,84 +1,88 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
3
- before(:each) do
4
- @window = @session.current_window
5
- @session.visit('/with_windows')
6
- @other_window = @session.window_opened_by do
2
+
3
+ Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
4
+ let!(:window) { @session.current_window }
5
+ let(:other_window) do
6
+ @session.window_opened_by do
7
7
  @session.find(:css, '#openWindow').click
8
8
  end
9
9
  end
10
10
 
11
- after(:each) do
11
+ before do
12
+ @session.visit('/with_windows')
13
+ end
14
+
15
+ after do
12
16
  @session.document.synchronize(5, errors: [Capybara::CapybaraError]) do
13
17
  raise Capybara::CapybaraError if @session.windows.size != 1
14
18
  end
15
- @session.switch_to_window(@window)
19
+ @session.switch_to_window(window)
16
20
  end
17
21
 
18
22
  context 'with :wait option' do
19
23
  it 'should wait if value of :wait is more than timeout' do
20
- @session.within_window @other_window do
24
+ @session.within_window other_window do
21
25
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
22
26
  end
23
27
  Capybara.using_wait_time 0.1 do
24
- expect(@other_window).to become_closed(wait: 2)
28
+ expect(other_window).to become_closed(wait: 5)
25
29
  end
26
30
  end
27
31
 
28
32
  it 'should raise error if value of :wait is less than timeout' do
29
- @session.within_window @other_window do
30
- @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
33
+ @session.within_window other_window do
34
+ @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
31
35
  end
32
36
  Capybara.using_wait_time 2 do
33
37
  expect do
34
- expect(@other_window).to become_closed(wait: 0.4)
35
- end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.4 seconds\Z/)
38
+ expect(other_window).to become_closed(wait: 0.2)
39
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.2 seconds\Z/)
36
40
  end
37
41
  end
38
42
  end
39
43
 
40
44
  context 'without :wait option' do
41
45
  it 'should wait if value of default_max_wait_time is more than timeout' do
42
- @session.within_window @other_window do
46
+ @session.within_window other_window do
43
47
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
44
48
  end
45
- Capybara.using_wait_time 1.5 do
46
- expect(@other_window).to become_closed
49
+ Capybara.using_wait_time 5 do
50
+ expect(other_window).to become_closed
47
51
  end
48
52
  end
49
53
 
50
54
  it 'should raise error if value of default_max_wait_time is less than timeout' do
51
- @session.within_window @other_window do
55
+ @session.within_window other_window do
52
56
  @session.execute_script('setTimeout(function(){ window.close(); }, 900);')
53
57
  end
54
58
  Capybara.using_wait_time 0.4 do
55
59
  expect do
56
- expect(@other_window).to become_closed
60
+ expect(other_window).to become_closed
57
61
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.4 seconds\Z/)
58
62
  end
59
63
  end
60
64
  end
61
65
 
62
66
  context 'with not_to' do
63
- it 'should raise error if default_max_wait_time is more than timeout' do
64
- @session.within_window @other_window do
65
- @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
67
+ it "should not raise error if window doesn't close before default_max_wait_time" do
68
+ @session.within_window other_window do
69
+ @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
66
70
  end
67
- Capybara.using_wait_time 0.4 do
71
+ Capybara.using_wait_time 0.3 do
68
72
  expect do
69
- expect(@other_window).not_to become_closed
70
- end
73
+ expect(other_window).not_to become_closed
74
+ end.not_to raise_error
71
75
  end
72
76
  end
73
77
 
74
- it 'should raise error if default_max_wait_time is more than timeout' do
75
- @session.within_window @other_window do
78
+ it 'should raise error if window closes before default_max_wait_time' do
79
+ @session.within_window other_window do
76
80
  @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
77
81
  end
78
- Capybara.using_wait_time 1.1 do
82
+ Capybara.using_wait_time 3.1 do
79
83
  expect do
80
- expect(@other_window).not_to become_closed
81
- end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 1.1 seconds\Z/)
84
+ expect(other_window).not_to become_closed
85
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 3.1 seconds\Z/)
82
86
  end
83
87
  end
84
88
  end
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
3
- before(:each) do
4
+ before do
4
5
  @window = @session.current_window
5
6
  @session.visit('/with_windows')
6
7
  end
7
- after(:each) do
8
+
9
+ after do
8
10
  (@session.windows - [@window]).each do |w|
9
11
  @session.switch_to_window w
10
12
  w.close
@@ -16,7 +18,7 @@ Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
16
18
  expect(@session.current_window).to be_instance_of(Capybara::Window)
17
19
  end
18
20
 
19
- it "should be modified by switching to another window" do
21
+ it 'should be modified by switching to another window' do
20
22
  window = @session.window_opened_by { @session.find(:css, '#openWindow').click }
21
23
 
22
24
  expect do
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#open_new_window', requires: [:windows] do
3
- before(:each) do
4
+ before do
4
5
  @window = @session.current_window
5
6
  @session.visit('/with_windows')
6
7
  end
7
- after(:each) do
8
+
9
+ after do
8
10
  (@session.windows - [@window]).each do |w|
9
11
  @session.switch_to_window w
10
12
  w.close
@@ -15,7 +17,7 @@ Capybara::SpecHelper.spec '#open_new_window', requires: [:windows] do
15
17
  it 'should open new window with blank url and title' do
16
18
  window = @session.open_new_window
17
19
  @session.switch_to_window(window)
18
- expect(['', 'about:blank']).to include(@session.title)
20
+ expect(@session.title).to satisfy('be a blank title') { |title| ['', 'about:blank'].include? title }
19
21
  expect(@session.current_url).to eq('about:blank')
20
22
  end
21
23
 
@@ -1,10 +1,17 @@
1
1
  # frozen_string_literal: true
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
+
2
7
  Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
3
- before(:each) do
8
+ before do
4
9
  @window = @session.current_window
5
10
  @session.visit('/with_windows')
11
+ @session.assert_selector(:css, 'body.loaded')
6
12
  end
7
- after(:each) do
13
+
14
+ after do
8
15
  (@session.windows - [@window]).each do |w|
9
16
  @session.switch_to_window w
10
17
  w.close
@@ -12,27 +19,27 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
12
19
  @session.switch_to_window(@window)
13
20
  end
14
21
 
15
- it "should raise error when invoked without args" do
22
+ it 'should raise error when invoked without args' do
16
23
  expect do
17
24
  @session.switch_to_window
18
- 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')
19
26
  end
20
27
 
21
- it "should raise error when invoked with window and block" do
28
+ it 'should raise error when invoked with window and block' do
22
29
  expect do
23
30
  @session.switch_to_window(@window) { @session.title == 'Title of the first popup' }
24
- 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')
25
32
  end
26
33
 
27
- context "with an instance of Capybara::Window" do
28
- 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
29
36
  window = @session.open_new_window
30
37
  expect(@session.title).to eq('With Windows')
31
38
  @session.switch_to_window(window)
32
- expect(['', 'about:blank']).to include(@session.title)
39
+ expect(@session.title).to satisfy('be a blank title') { |title| ['', 'about:blank'].include? title }
33
40
  end
34
41
 
35
- it "should raise error when closed window is passed" do
42
+ it 'should raise error when closed window is passed' do
36
43
  original_window = @session.current_window
37
44
  new_window = @session.open_new_window
38
45
  @session.switch_to_window(new_window)
@@ -44,30 +51,30 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
44
51
  end
45
52
  end
46
53
 
47
- context "with block" do
48
- before(:each) do
54
+ context 'with block' do
55
+ before do
49
56
  @session.find(:css, '#openTwoWindows').click
50
- sleep(0.2) # wait for the windows to open
57
+ sleep(1) # wait for the windows to open
51
58
  end
52
59
 
53
- it "should be able to switch to current window" do
60
+ it 'should be able to switch to current window' do
54
61
  @session.switch_to_window { @session.title == 'With Windows' }
55
62
  expect(@session).to have_css('#openTwoWindows')
56
63
  end
57
64
 
58
- it "should find the div in another window" do
65
+ it 'should find the div in another window' do
59
66
  @session.switch_to_window { @session.title == 'Title of popup two' }
60
67
  expect(@session).to have_css('#divInPopupTwo')
61
68
  end
62
69
 
63
- it "should be able to switch multiple times" do
70
+ it 'should be able to switch multiple times' do
64
71
  @session.switch_to_window { @session.title == 'Title of the first popup' }
65
72
  expect(@session).to have_css('#divInPopupOne')
66
73
  @session.switch_to_window { @session.title == 'Title of popup two' }
67
74
  expect(@session).to have_css('#divInPopupTwo')
68
75
  end
69
76
 
70
- it "should return window" do
77
+ it 'should return window' do
71
78
  window = @session.switch_to_window { @session.title == 'Title of popup two' }
72
79
  expect((@session.windows - [@window])).to include(window)
73
80
  end
@@ -77,7 +84,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
77
84
  @session.within(:css, '#doesNotOpenWindows') do
78
85
  @session.switch_to_window { @session.title == 'With Windows' }
79
86
  end
80
- end.to raise_error(Capybara::ScopeError, "`switch_to_window` is not supposed to be invoked from `within`'s, `within_frame`'s' or `within_window`'s' block.")
87
+ end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked/)
81
88
  end
82
89
 
83
90
  it "should raise error when invoked inside `within_frame` as it's nonsense" do
@@ -85,27 +92,29 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
85
92
  @session.within_frame('frameOne') do
86
93
  @session.switch_to_window { @session.title == 'With Windows' }
87
94
  end
88
- end.to raise_error(Capybara::ScopeError, "`switch_to_window` is not supposed to be invoked from `within`'s, `within_frame`'s' or `within_window`'s' block.")
95
+ end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked from/)
89
96
  end
90
97
 
91
- it "should raise error when invoked inside `within_window` as it's nonsense" do
92
- window = (@session.windows - [@window]).first
93
- expect do
94
- @session.within_window window do
95
- @session.switch_to_window { @session.title == 'With Windows' }
96
- end
97
- end.to raise_error(Capybara::ScopeError, "`switch_to_window` is not supposed to be invoked from `within`'s, `within_frame`'s' or `within_window`'s' block.")
98
+ it 'should allow to be called inside within_window and within_window will still return to original' do
99
+ other_windows = (@session.windows - [@window])
100
+ expect(@session.current_window).to eq(@window)
101
+ @session.within_window other_windows[0] do
102
+ expect(@session.current_window).to eq(other_windows[0])
103
+ @session.switch_to_window other_windows[1]
104
+ expect(@session.current_window).to eq(other_windows[1])
105
+ end
106
+ expect(@session.current_window).to eq(@window)
98
107
  end
99
108
 
100
109
  it "should raise error if window matching block wasn't found" do
101
110
  original = @session.current_window
102
111
  expect do
103
112
  @session.switch_to_window { @session.title == 'A title' }
104
- 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')
105
114
  expect(@session.current_window).to eq(original)
106
115
  end
107
116
 
108
- 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
109
118
  original = @session.switch_to_window(@session.windows[1])
110
119
  expect do
111
120
  @session.switch_to_window { raise 'error' }
@@ -114,10 +123,10 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
114
123
  end
115
124
  end
116
125
 
117
- it "should wait for window to appear" do
126
+ it 'should wait for window to appear' do
118
127
  @session.find(:css, '#openWindowWithTimeout').click
119
128
  expect do
120
- @session.switch_to_window { @session.title == 'Title of the first popup'}
129
+ @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup' }
121
130
  end.not_to raise_error
122
131
  end
123
132
  end