capybara 2.18.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +945 -12
  4. data/License.txt +1 -1
  5. data/README.md +264 -90
  6. data/lib/capybara/config.rb +29 -57
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +35 -18
  9. data/lib/capybara/driver/node.rb +40 -10
  10. data/lib/capybara/dsl.rb +10 -7
  11. data/lib/capybara/helpers.rb +70 -31
  12. data/lib/capybara/minitest/spec.rb +185 -83
  13. data/lib/capybara/minitest.rb +232 -112
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +42 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +362 -135
  19. data/lib/capybara/node/finders.rb +151 -137
  20. data/lib/capybara/node/matchers.rb +394 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +12 -9
  25. data/lib/capybara/queries/base_query.rb +39 -28
  26. data/lib/capybara/queries/current_path_query.rb +21 -27
  27. data/lib/capybara/queries/match_query.rb +14 -7
  28. data/lib/capybara/queries/selector_query.rb +659 -149
  29. data/lib/capybara/queries/sibling_query.rb +11 -9
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +56 -38
  32. data/lib/capybara/queries/title_query.rb +8 -11
  33. data/lib/capybara/rack_test/browser.rb +114 -42
  34. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  35. data/lib/capybara/rack_test/driver.rb +22 -17
  36. data/lib/capybara/rack_test/errors.rb +6 -0
  37. data/lib/capybara/rack_test/form.rb +93 -58
  38. data/lib/capybara/rack_test/node.rb +184 -81
  39. data/lib/capybara/rails.rb +3 -7
  40. data/lib/capybara/registration_container.rb +41 -0
  41. data/lib/capybara/registrations/drivers.rb +42 -0
  42. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  43. data/lib/capybara/registrations/servers.rb +66 -0
  44. data/lib/capybara/result.rb +97 -63
  45. data/lib/capybara/rspec/features.rb +17 -50
  46. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  47. data/lib/capybara/rspec/matchers/base.rb +113 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/rspec/matchers.rb +146 -310
  61. data/lib/capybara/rspec.rb +7 -11
  62. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  63. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  64. data/lib/capybara/selector/css.rb +85 -13
  65. data/lib/capybara/selector/definition/button.rb +68 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +28 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +55 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/definition.rb +280 -0
  87. data/lib/capybara/selector/filter.rb +2 -17
  88. data/lib/capybara/selector/filter_set.rb +80 -33
  89. data/lib/capybara/selector/filters/base.rb +50 -6
  90. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  91. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  92. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  93. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  94. data/lib/capybara/selector/selector.rb +93 -210
  95. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  96. data/lib/capybara/selector.rb +475 -523
  97. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  99. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  100. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  101. data/lib/capybara/selenium/driver.rb +298 -267
  102. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  103. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  104. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  105. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  106. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  107. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  108. data/lib/capybara/selenium/extensions/find.rb +110 -0
  109. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  110. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  111. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  112. data/lib/capybara/selenium/node.rb +517 -145
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +45 -0
  121. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  122. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  123. data/lib/capybara/server/animation_disabler.rb +80 -0
  124. data/lib/capybara/server/checker.rb +44 -0
  125. data/lib/capybara/server/middleware.rb +71 -0
  126. data/lib/capybara/server.rb +59 -67
  127. data/lib/capybara/session/config.rb +81 -67
  128. data/lib/capybara/session/matchers.rb +28 -20
  129. data/lib/capybara/session.rb +337 -365
  130. data/lib/capybara/spec/public/jquery.js +5 -5
  131. data/lib/capybara/spec/public/offset.js +6 -0
  132. data/lib/capybara/spec/public/test.js +151 -12
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +161 -57
  138. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  140. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  141. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  142. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  143. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  144. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +22 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +117 -55
  148. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  149. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  151. data/lib/capybara/spec/session/click_link_spec.rb +93 -58
  152. data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
  153. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  163. data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
  164. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  167. data/lib/capybara/spec/session/find_link_spec.rb +46 -17
  168. data/lib/capybara/spec/session/find_spec.rb +260 -145
  169. data/lib/capybara/spec/session/first_spec.rb +80 -52
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +33 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
  174. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +100 -13
  180. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
  182. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +47 -6
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
  186. data/lib/capybara/spec/session/has_select_spec.rb +107 -72
  187. data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +183 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +106 -62
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  196. data/lib/capybara/spec/session/node_spec.rb +1024 -153
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -81
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +85 -53
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +83 -44
  224. data/lib/capybara/spec/spec_helper.rb +54 -44
  225. data/lib/capybara/spec/test_app.rb +158 -43
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +163 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  247. data/lib/capybara/spec/views/with_hover.erb +3 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +69 -12
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +30 -5
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope.erb +2 -2
  256. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  257. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  258. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  259. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  260. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  261. data/lib/capybara/spec/views/with_windows.erb +1 -1
  262. data/lib/capybara/spec/views/within_frames.erb +5 -2
  263. data/lib/capybara/version.rb +2 -1
  264. data/lib/capybara/window.rb +36 -34
  265. data/lib/capybara.rb +134 -107
  266. data/spec/basic_node_spec.rb +60 -34
  267. data/spec/capybara_spec.rb +63 -88
  268. data/spec/counter_spec.rb +35 -0
  269. data/spec/css_builder_spec.rb +101 -0
  270. data/spec/css_splitter_spec.rb +38 -0
  271. data/spec/dsl_spec.rb +85 -64
  272. data/spec/filter_set_spec.rb +27 -9
  273. data/spec/fixtures/certificate.pem +25 -0
  274. data/spec/fixtures/key.pem +27 -0
  275. data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
  276. data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
  277. data/spec/minitest_spec.rb +52 -7
  278. data/spec/minitest_spec_spec.rb +94 -63
  279. data/spec/per_session_config_spec.rb +14 -13
  280. data/spec/rack_test_spec.rb +194 -125
  281. data/spec/regexp_dissassembler_spec.rb +250 -0
  282. data/spec/result_spec.rb +111 -50
  283. data/spec/rspec/features_spec.rb +37 -31
  284. data/spec/rspec/scenarios_spec.rb +10 -8
  285. data/spec/rspec/shared_spec_matchers.rb +473 -422
  286. data/spec/rspec/views_spec.rb +5 -3
  287. data/spec/rspec_matchers_spec.rb +52 -11
  288. data/spec/rspec_spec.rb +109 -89
  289. data/spec/sauce_spec_chrome.rb +43 -0
  290. data/spec/selector_spec.rb +397 -68
  291. data/spec/selenium_spec_chrome.rb +187 -40
  292. data/spec/selenium_spec_chrome_remote.rb +96 -0
  293. data/spec/selenium_spec_edge.rb +60 -0
  294. data/spec/selenium_spec_firefox.rb +201 -41
  295. data/spec/selenium_spec_firefox_remote.rb +94 -0
  296. data/spec/selenium_spec_ie.rb +149 -0
  297. data/spec/selenium_spec_safari.rb +162 -0
  298. data/spec/server_spec.rb +213 -102
  299. data/spec/session_spec.rb +53 -16
  300. data/spec/shared_selenium_node.rb +79 -0
  301. data/spec/shared_selenium_session.rb +473 -122
  302. data/spec/spec_helper.rb +126 -7
  303. data/spec/whitespace_normalizer_spec.rb +54 -0
  304. data/spec/xpath_builder_spec.rb +93 -0
  305. metadata +355 -73
  306. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  307. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  308. data/.yard/yard_extensions.rb +0 -78
  309. data/lib/capybara/query.rb +0 -7
  310. data/lib/capybara/rspec/compound.rb +0 -95
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -234
  314. data/lib/capybara/spec/session/source_spec.rb +0 -0
  315. data/lib/capybara/spec/views/with_title.erb +0 -5
  316. data/spec/selenium_spec_marionette.rb +0 -127
@@ -1,169 +1,203 @@
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 Capybara::Window, requires: [:windows] do
3
- before(:each) do
4
- @window = @session.current_window
8
+ let!(:orig_window) { @session.current_window }
9
+ before do
5
10
  @session.visit('/with_windows')
6
11
  end
7
- after(:each) do
8
- (@session.windows - [@window]).each do |w|
12
+
13
+ after do
14
+ (@session.windows - [orig_window]).each do |w|
9
15
  @session.switch_to_window w
10
16
  w.close
11
17
  end
12
- @session.switch_to_window(@window)
18
+ @session.switch_to_window(orig_window)
13
19
  end
14
20
 
15
21
  describe '#exists?' do
16
- before(:each) do
17
- @other_window = @session.window_opened_by do
22
+ it 'should become false after window was closed' do
23
+ other_window = @session.window_opened_by do
18
24
  @session.find(:css, '#openWindow').click
19
25
  end
20
- end
21
26
 
22
- it "should become false after window was closed" do
23
27
  expect do
24
- @session.switch_to_window @other_window
25
- @other_window.close
26
- end.to change { @other_window.exists? }.from(true).to(false)
28
+ @session.switch_to_window other_window
29
+ other_window.close
30
+ end.to change(other_window, :exists?).from(true).to(false)
27
31
  end
28
32
  end
29
33
 
30
34
  describe '#closed?' do
31
- it "should become true after window was closed" do
32
- @other_window = @session.window_opened_by do
35
+ it 'should become true after window was closed' do
36
+ other_window = @session.window_opened_by do
33
37
  @session.find(:css, '#openWindow').click
34
38
  end
35
39
  expect do
36
- @session.switch_to_window @other_window
37
- @other_window.close
38
- end.to change { @other_window.closed? }.from(false).to(true)
40
+ @session.switch_to_window other_window
41
+ other_window.close
42
+ end.to change { other_window.closed? }.from(false).to(true)
39
43
  end
40
44
  end
41
45
 
42
46
  describe '#current?' do
43
- before(:each) do
44
- @other_window = @session.window_opened_by do
47
+ let(:other_window) do
48
+ @session.window_opened_by do
45
49
  @session.find(:css, '#openWindow').click
46
50
  end
47
51
  end
48
52
 
49
53
  it 'should become true after switching to window' do
50
54
  expect do
51
- @session.switch_to_window(@other_window)
52
- end.to change { @other_window.current? }.from(false).to(true)
55
+ @session.switch_to_window(other_window)
56
+ end.to change(other_window, :current?).from(false).to(true)
53
57
  end
54
58
 
55
59
  it 'should return false if window is closed' do
56
- @session.switch_to_window(@other_window)
57
- @other_window.close
58
- expect(@other_window.current?).to eq(false)
60
+ @session.switch_to_window(other_window)
61
+ other_window.close
62
+ expect(other_window.current?).to be(false)
59
63
  end
60
64
  end
61
65
 
62
66
  describe '#close' do
63
- before(:each) do
64
- @other_window = @session.window_opened_by do
67
+ let!(:other_window) do
68
+ @session.window_opened_by do
65
69
  @session.find(:css, '#openWindow').click
66
70
  end
67
71
  end
68
72
 
69
73
  it 'should switch to original window if invoked not for current window' do
70
74
  expect(@session.windows.size).to eq(2)
71
- expect(@session.current_window).to eq(@window)
72
- @other_window.close
75
+ expect(@session.current_window).to eq(orig_window)
76
+ other_window.close
73
77
  expect(@session.windows.size).to eq(1)
74
- expect(@session.current_window).to eq(@window)
78
+ expect(@session.current_window).to eq(orig_window)
75
79
  end
76
80
 
77
81
  it 'should make subsequent invocations of other methods raise no_such_window_error if invoked for current window' do
78
- @session.switch_to_window(@other_window)
79
- expect(@session.current_window).to eq(@other_window)
80
- @other_window.close
82
+ @session.switch_to_window(other_window)
83
+ expect(@session.current_window).to eq(other_window)
84
+ other_window.close
81
85
  expect do
82
86
  @session.find(:css, '#some_id')
83
87
  end.to raise_error(@session.driver.no_such_window_error)
84
- @session.switch_to_window(@window)
88
+ @session.switch_to_window(orig_window)
85
89
  end
86
90
  end
87
91
 
88
92
  describe '#size' do
89
93
  def win_size
90
- @session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
94
+ @session.evaluate_script('[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]')
91
95
  end
92
96
 
93
- it 'should return size of whole window', requires: [:windows, :js] do
97
+ it 'should return size of whole window', requires: %i[windows js] do
94
98
  expect(@session.current_window.size).to eq win_size
95
99
  end
96
100
 
97
101
  it 'should switch to original window if invoked not for current window' do
98
- @other_window = @session.window_opened_by do
102
+ other_window = @session.window_opened_by do
99
103
  @session.find(:css, '#openWindow').click
100
104
  end
101
105
  sleep 1
102
- size = @session.within_window(@other_window) do
106
+ size = @session.within_window(other_window) do
103
107
  win_size
104
108
  end
105
- expect(@other_window.size).to eq(size)
106
- expect(@session.current_window).to eq(@window)
109
+ expect(other_window.size).to eq(size)
110
+ expect(@session.current_window).to eq(orig_window)
107
111
  end
108
112
  end
109
113
 
110
114
  describe '#resize_to' do
111
- it 'should be able to resize window', requires: [:windows, :js] do
112
- width, height = @session.current_window.size
113
- @session.current_window.resize_to(width-100, height-100)
115
+ let!(:initial_size) { @session.current_window.size }
116
+
117
+ after do
118
+ @session.current_window.resize_to(*initial_size)
114
119
  sleep 1
115
- expect(@session.current_window.size).to eq([width-100, height-100])
116
120
  end
117
121
 
118
- it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
122
+ it 'should be able to resize window', requires: %i[windows js] do
123
+ width, height = initial_size
124
+ @session.current_window.resize_to(width - 100, height - 100)
125
+ sleep 1
126
+ expect(@session.current_window.size).to eq([width - 100, height - 100])
127
+ end
119
128
 
120
- @other_window = @session.window_opened_by do
129
+ it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
130
+ other_window = @session.window_opened_by do
121
131
  @session.find(:css, '#openWindow').click
122
132
  end
123
- @other_window.resize_to(400, 300)
124
- expect(@session.current_window).to eq(@window)
125
133
 
126
- # #size returns values larger than availWidth, availHeight with Chromedriver
127
- @session.within_window(@other_window) do
128
- expect(@session.current_window.size).to eq([400,300])
129
- # expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
134
+ other_window.resize_to(600, 400)
135
+ expect(@session.current_window).to eq(orig_window)
136
+
137
+ @session.within_window(other_window) do
138
+ expect(@session.current_window.size).to eq([600, 400])
130
139
  end
131
140
  end
132
141
  end
133
142
 
134
143
  describe '#maximize' do
135
- it 'should be able to maximize window', requires: [:windows, :js] do
144
+ let! :initial_size do
145
+ @session.current_window.size
146
+ end
147
+
148
+ after do
149
+ @session.current_window.resize_to(*initial_size)
150
+ sleep 0.5
151
+ end
152
+
153
+ it 'should be able to maximize window', requires: %i[windows js] do
136
154
  start_width, start_height = 400, 300
137
155
  @session.current_window.resize_to(start_width, start_height)
138
156
  sleep 0.5
139
157
 
140
158
  @session.current_window.maximize
141
- sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
159
+ sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
142
160
 
143
161
  max_width, max_height = @session.current_window.size
144
162
 
145
- #maximize behavior is window manage dependant, so just make sure it increases in size
163
+ # maximize behavior is window manage dependant, so just make sure it increases in size
146
164
  expect(max_width).to be > start_width
147
165
  expect(max_height).to be > start_height
148
166
  end
149
167
 
150
- it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
151
- cur_window_size = @session.current_window.size
152
- @other_window = @session.window_opened_by do
168
+ it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
169
+ other_window = @session.window_opened_by do
153
170
  @session.find(:css, '#openWindow').click
154
171
  end
155
-
156
- @other_window.resize_to(400,300)
172
+ other_window.resize_to(400, 300)
157
173
  sleep 0.5
158
- @other_window.maximize
174
+ other_window.maximize
159
175
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
160
176
 
161
- expect(@session.current_window).to eq(@window)
162
- expect(@session.current_window.size).to eq(cur_window_size)
177
+ expect(@session.current_window).to eq(orig_window)
178
+ # Maximizing the browser affects all tabs so this may not be valid in real browsers
179
+ # expect(@session.current_window.size).to eq(initial_size)
163
180
 
164
- ow_width, ow_height = @other_window.size
181
+ ow_width, ow_height = other_window.size
165
182
  expect(ow_width).to be > 400
166
183
  expect(ow_height).to be > 300
167
184
  end
168
185
  end
186
+
187
+ describe '#fullscreen' do
188
+ let! :initial_size do
189
+ @session.current_window.size
190
+ end
191
+
192
+ after do
193
+ @session.current_window.resize_to(*initial_size)
194
+ sleep 1
195
+ end
196
+
197
+ it 'should be able to fullscreen the window' do
198
+ expect do
199
+ @session.current_window.fullscreen
200
+ end.not_to raise_error
201
+ end
202
+ end
169
203
  end
@@ -1,6 +1,11 @@
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 '#windows', requires: [:windows] do
3
- before(:each) do
8
+ before do
4
9
  @window = @session.current_window
5
10
  @session.visit('/with_windows')
6
11
  @session.find(:css, '#openTwoWindows').click
@@ -9,11 +14,9 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
9
14
  raise Capybara::CapybaraError if @session.windows.size != 3
10
15
  end
11
16
  end
12
- after(:each) do
13
- (@session.windows - [@window]).each do |w|
14
- @session.switch_to_window w
15
- w.close
16
- end
17
+
18
+ after do
19
+ (@session.windows - [@window]).each(&:close)
17
20
  @session.switch_to_window(@window)
18
21
  end
19
22
 
@@ -21,12 +24,11 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
21
24
  expect(@session.windows.map { |window| window.instance_of?(Capybara::Window) }).to eq([true] * 3)
22
25
  end
23
26
 
24
- it 'should switchable windows' do
27
+ it 'should be able to switch to windows' do
28
+ sleep 1 # give windows enough time to fully load
25
29
  titles = @session.windows.map do |window|
26
30
  @session.within_window(window) { @session.title }
27
31
  end
28
- expect(titles).to match_array([
29
- 'With Windows', 'Title of the first popup', 'Title of popup two'
30
- ])
32
+ expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two']) # rubocop:disable RSpec/MatchArray
31
33
  end
32
34
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#within_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
  @session.find(:css, '#openTwoWindows').click
@@ -9,7 +10,8 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
9
10
  raise Capybara::CapybaraError if @session.windows.size != 3
10
11
  end
11
12
  end
12
- after(:each) do
13
+
14
+ after do
13
15
  (@session.windows - [@window]).each do |w|
14
16
  @session.switch_to_window w
15
17
  w.close
@@ -17,33 +19,32 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
17
19
  @session.switch_to_window(@window)
18
20
  end
19
21
 
20
- context "with an instance of Capybara::Window" do
21
- it "should not invoke driver#switch_to_window when given current window" do
22
- # switch_to_window is invoked in after hook
23
- expect(@session.driver).to receive(:switch_to_window).exactly(3).times.and_call_original
22
+ context 'with an instance of Capybara::Window' do
23
+ it 'should not invoke driver#switch_to_window when given current window' do
24
+ allow(@session.driver).to receive(:switch_to_window).and_call_original
24
25
  @session.within_window @window do
25
26
  expect(@session.title).to eq('With Windows')
26
27
  end
28
+ expect(@session.driver).not_to have_received(:switch_to_window)
27
29
  end
28
30
 
29
- it "should be able to switch to another window" do
31
+ it 'should be able to switch to another window' do
30
32
  window = (@session.windows - [@window]).first
31
- expect(@session.driver).to receive(:switch_to_window).exactly(5).times.and_call_original
32
33
  @session.within_window window do
33
34
  expect(@session).to have_title(/Title of the first popup|Title of popup two/)
34
35
  end
35
36
  expect(@session.title).to eq('With Windows')
36
37
  end
37
38
 
38
- it "returns value from the block" do
39
+ it 'returns value from the block' do
39
40
  window = (@session.windows - [@window]).first
40
41
  value = @session.within_window window do
41
- 43252003274489856000
42
- end
42
+ 43252003274489856000
43
+ end
43
44
  expect(value).to eq(43252003274489856000)
44
45
  end
45
46
 
46
- it "should switch back if exception was raised inside block" do
47
+ it 'should switch back if exception was raised inside block' do
47
48
  window = (@session.windows - [@window]).first
48
49
  expect do
49
50
  @session.within_window(window) do
@@ -57,7 +58,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
57
58
  expect(@session.send(:scopes)).to eq([nil])
58
59
  end
59
60
 
60
- it "should leave correct scopes after execution in case of error", requires: [:windows, :frames] do
61
+ it 'should leave correct scopes after execution in case of error', requires: %i[windows frames] do
61
62
  window = (@session.windows - [@window]).first
62
63
  expect do
63
64
  @session.within_frame 'frameOne' do
@@ -85,27 +86,27 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
85
86
  end
86
87
  end
87
88
 
88
- context "with lambda" do
89
- it "should find the div in another window" do
90
- @session.within_window(->{ @session.title == 'Title of the first popup'}) do
89
+ context 'with lambda' do
90
+ it 'should find the div in another window' do
91
+ @session.within_window(-> { @session.title == 'Title of the first popup' }) do
91
92
  expect(@session).to have_css('#divInPopupOne')
92
93
  end
93
94
  end
94
95
 
95
- it "should find divs in both windows" do
96
- @session.within_window(->{ @session.title == 'Title of popup two'}) do
96
+ it 'should find divs in both windows' do
97
+ @session.within_window(-> { @session.title == 'Title of popup two' }) do
97
98
  expect(@session).to have_css('#divInPopupTwo')
98
99
  end
99
- @session.within_window(->{ @session.title == 'Title of the first popup'}) do
100
+ @session.within_window(-> { @session.title == 'Title of the first popup' }) do
100
101
  expect(@session).to have_css('#divInPopupOne')
101
102
  end
102
103
  expect(@session.title).to eq('With Windows')
103
104
  end
104
105
 
105
- it "should be able to nest within_window" do
106
- @session.within_window(->{ @session.title == 'Title of popup two'}) do
106
+ it 'should be able to nest within_window' do
107
+ @session.within_window(-> { @session.title == 'Title of popup two' }) do
107
108
  expect(@session).to have_css('#divInPopupTwo')
108
- @session.within_window(->{ @session.title == 'Title of the first popup'}) do
109
+ @session.within_window(-> { @session.title == 'Title of the first popup' }) do
109
110
  expect(@session).to have_css('#divInPopupOne')
110
111
  end
111
112
  expect(@session).to have_css('#divInPopupTwo')
@@ -116,10 +117,10 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
116
117
  expect(@session.title).to eq('With Windows')
117
118
  end
118
119
 
119
- it "should work inside a normal scope" do
120
+ it 'should work inside a normal scope' do
120
121
  expect(@session).to have_css('#openWindow')
121
122
  @session.within(:css, '#scope') do
122
- @session.within_window(->{ @session.title == 'Title of the first popup'}) do
123
+ @session.within_window(-> { @session.title == 'Title of the first popup' }) do
123
124
  expect(@session).to have_css('#divInPopupOne')
124
125
  end
125
126
  expect(@session).to have_content('My scoped content')
@@ -129,25 +130,23 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
129
130
 
130
131
  it "should raise error if window wasn't found" do
131
132
  expect do
132
- @session.within_window(->{ @session.title == 'Invalid title'}) do
133
+ @session.within_window(-> { @session.title == 'Invalid title' }) do
133
134
  expect(@session).to have_css('#divInPopupOne')
134
135
  end
135
- end.to raise_error(Capybara::WindowError, "Could not find a window matching block/lambda")
136
+ end.to raise_error(Capybara::WindowError, 'Could not find a window matching block/lambda')
136
137
  expect(@session.current_window).to eq(@window)
137
138
  expect(@session).to have_css('#doesNotOpenWindows')
138
139
  expect(@session.send(:scopes)).to eq([nil])
139
140
  end
140
141
 
141
- it "returns value from the block" do
142
- value = @session.within_window(->{ @session.title == 'Title of popup two'}) do
143
- 42
144
- end
142
+ it 'returns value from the block' do
143
+ value = @session.within_window(-> { @session.title == 'Title of popup two' }) { 42 }
145
144
  expect(value).to eq(42)
146
145
  end
147
146
 
148
- it "should switch back if exception was raised inside block" do
147
+ it 'should switch back if exception was raised inside block' do
149
148
  expect do
150
- @session.within_window(->{ @session.title == 'Title of popup two'}) do
149
+ @session.within_window(-> { @session.title == 'Title of popup two' }) do
151
150
  raise 'some error'
152
151
  end
153
152
  end.to raise_error(StandardError, 'some error')
@@ -155,58 +154,4 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
155
154
  expect(@session.send(:scopes)).to eq([nil])
156
155
  end
157
156
  end
158
-
159
- context "with string" do
160
- it "should warn" do
161
- expect(@session).to receive(:warn).with(/DEPRECATION WARNING/).and_call_original
162
- @session.within_window('firstPopup') {}
163
- end
164
-
165
- it "should find window by handle" do
166
- window = (@session.windows - [@window]).first
167
- @session.within_window window.handle do
168
- expect(@session).to have_title(/Title of the first popup|Title of popup two/)
169
- end
170
- end
171
-
172
- it "should find the div in firstPopup" do
173
- @session.within_window("firstPopup") do
174
- expect(@session.find("//*[@id='divInPopupOne']").text).to eq 'This is the text of divInPopupOne'
175
- end
176
- end
177
- it "should find the div in secondPopup" do
178
- @session.within_window("secondPopup") do
179
- expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
180
- end
181
- end
182
- it "should find the divs in both popups" do
183
- @session.within_window("secondPopup") do
184
- expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
185
- end
186
- @session.within_window("firstPopup") do
187
- expect(@session.find("//*[@id='divInPopupOne']").text).to eq 'This is the text of divInPopupOne'
188
- end
189
- end
190
- it "should find the div in the main window after finding a div in a popup" do
191
- @session.within_window("secondPopup") do
192
- expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
193
- end
194
- expect(@session.find("//*[@id='doesNotOpenWindows']").text).to eq 'Does not open windows'
195
- end
196
- it "should reset scope when switching windows" do
197
- @session.within(:css, '#doesNotOpenWindows') do
198
- @session.within_window("secondPopup") do
199
- expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
200
- end
201
- end
202
- end
203
- it "should switch back if exception was raised inside block" do
204
- expect do
205
- @session.within_window('secondPopup') do
206
- raise 'some error'
207
- end
208
- end.to raise_error(StandardError, 'some error')
209
- expect(@session.current_window).to eq(@window)
210
- end
211
- end
212
157
  end