capybara 3.3.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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +803 -13
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +25 -9
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +17 -3
  9. data/lib/capybara/driver/node.rb +31 -6
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +31 -7
  12. data/lib/capybara/minitest/spec.rb +180 -88
  13. data/lib/capybara/minitest.rb +262 -149
  14. data/lib/capybara/node/actions.rb +202 -116
  15. data/lib/capybara/node/base.rb +34 -19
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +10 -12
  18. data/lib/capybara/node/element.rb +269 -115
  19. data/lib/capybara/node/finders.rb +99 -77
  20. data/lib/capybara/node/matchers.rb +327 -151
  21. data/lib/capybara/node/simple.rb +48 -13
  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 +8 -9
  25. data/lib/capybara/queries/base_query.rb +23 -16
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +1 -0
  28. data/lib/capybara/queries/selector_query.rb +587 -130
  29. data/lib/capybara/queries/sibling_query.rb +8 -6
  30. data/lib/capybara/queries/style_query.rb +6 -2
  31. data/lib/capybara/queries/text_query.rb +28 -14
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +92 -25
  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 +68 -41
  37. data/lib/capybara/rack_test/node.rb +106 -39
  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 +75 -52
  44. data/lib/capybara/rspec/features.rb +7 -7
  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 +141 -339
  60. data/lib/capybara/rspec.rb +2 -0
  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 +27 -25
  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 +73 -25
  88. data/lib/capybara/selector/filters/base.rb +24 -5
  89. data/lib/capybara/selector/filters/expression_filter.rb +3 -3
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -2
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +85 -348
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -447
  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 +255 -143
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
  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 +436 -134
  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 +56 -19
  123. data/lib/capybara/server/checker.rb +9 -3
  124. data/lib/capybara/server/middleware.rb +28 -12
  125. data/lib/capybara/server.rb +33 -10
  126. data/lib/capybara/session/config.rb +34 -10
  127. data/lib/capybara/session/matchers.rb +23 -16
  128. data/lib/capybara/session.rb +230 -170
  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 +121 -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 +127 -40
  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_spec.rb +21 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
  141. data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
  142. data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
  143. data/lib/capybara/spec/session/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 +6 -6
  146. data/lib/capybara/spec/session/check_spec.rb +102 -47
  147. data/lib/capybara/spec/session/choose_spec.rb +58 -32
  148. data/lib/capybara/spec/session/click_button_spec.rb +219 -163
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
  150. data/lib/capybara/spec/session/click_link_spec.rb +77 -54
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +38 -29
  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_spec.rb +8 -8
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -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 +101 -46
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  165. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  166. data/lib/capybara/spec/session/find_link_spec.rb +31 -21
  167. data/lib/capybara/spec/session/find_spec.rb +244 -141
  168. data/lib/capybara/spec/session/first_spec.rb +43 -43
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
  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 +94 -13
  179. data/lib/capybara/spec/session/has_css_spec.rb +272 -132
  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 +44 -4
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
  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_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 +894 -142
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
  199. data/lib/capybara/spec/session/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 +2 -2
  202. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
  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 +85 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +49 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +25 -24
  210. data/lib/capybara/spec/session/title_spec.rb +7 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +68 -49
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  216. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
  217. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
  218. data/lib/capybara/spec/session/window/window_spec.rb +62 -63
  219. data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
  220. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  221. data/lib/capybara/spec/session/within_spec.rb +79 -42
  222. data/lib/capybara/spec/spec_helper.rb +41 -53
  223. data/lib/capybara/spec/test_app.rb +132 -43
  224. data/lib/capybara/spec/views/animated.erb +49 -0
  225. data/lib/capybara/spec/views/form.erb +139 -42
  226. data/lib/capybara/spec/views/frame_child.erb +4 -3
  227. data/lib/capybara/spec/views/frame_one.erb +2 -1
  228. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  229. data/lib/capybara/spec/views/frame_two.erb +1 -1
  230. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  231. data/lib/capybara/spec/views/layout.erb +10 -0
  232. data/lib/capybara/spec/views/obscured.erb +47 -0
  233. data/lib/capybara/spec/views/offset.erb +33 -0
  234. data/lib/capybara/spec/views/path.erb +2 -2
  235. data/lib/capybara/spec/views/popup_one.erb +1 -1
  236. data/lib/capybara/spec/views/popup_two.erb +1 -1
  237. data/lib/capybara/spec/views/react.erb +45 -0
  238. data/lib/capybara/spec/views/scroll.erb +21 -0
  239. data/lib/capybara/spec/views/spatial.erb +31 -0
  240. data/lib/capybara/spec/views/tables.erb +67 -0
  241. data/lib/capybara/spec/views/with_animation.erb +39 -4
  242. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  243. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  244. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  245. data/lib/capybara/spec/views/with_hover.erb +3 -2
  246. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  247. data/lib/capybara/spec/views/with_html.erb +37 -9
  248. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  249. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  250. data/lib/capybara/spec/views/with_js.erb +26 -5
  251. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  252. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  253. data/lib/capybara/spec/views/with_scope.erb +2 -2
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +1 -1
  261. data/lib/capybara/version.rb +1 -1
  262. data/lib/capybara/window.rb +19 -25
  263. data/lib/capybara.rb +126 -111
  264. data/spec/basic_node_spec.rb +59 -34
  265. data/spec/capybara_spec.rb +56 -44
  266. data/spec/counter_spec.rb +35 -0
  267. data/spec/css_builder_spec.rb +101 -0
  268. data/spec/css_splitter_spec.rb +8 -8
  269. data/spec/dsl_spec.rb +79 -52
  270. data/spec/filter_set_spec.rb +9 -9
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +45 -7
  274. data/spec/minitest_spec_spec.rb +87 -64
  275. data/spec/per_session_config_spec.rb +6 -6
  276. data/spec/rack_test_spec.rb +172 -116
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +80 -72
  279. data/spec/rspec/features_spec.rb +21 -16
  280. data/spec/rspec/scenarios_spec.rb +10 -6
  281. data/spec/rspec/shared_spec_matchers.rb +407 -365
  282. data/spec/rspec/views_spec.rb +3 -3
  283. data/spec/rspec_matchers_spec.rb +35 -10
  284. data/spec/rspec_spec.rb +63 -41
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +334 -89
  287. data/spec/selenium_spec_chrome.rb +176 -62
  288. data/spec/selenium_spec_chrome_remote.rb +54 -14
  289. data/spec/selenium_spec_edge.rb +41 -8
  290. data/spec/selenium_spec_firefox.rb +228 -0
  291. data/spec/selenium_spec_firefox_remote.rb +94 -0
  292. data/spec/selenium_spec_ie.rb +129 -11
  293. data/spec/selenium_spec_safari.rb +162 -0
  294. data/spec/server_spec.rb +171 -97
  295. data/spec/session_spec.rb +34 -18
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +344 -80
  298. data/spec/spec_helper.rb +124 -2
  299. data/spec/whitespace_normalizer_spec.rb +54 -0
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +326 -28
  302. data/lib/capybara/rspec/compound.rb +0 -94
  303. data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
  304. data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
  305. data/lib/capybara/spec/session/has_style_spec.rb +0 -25
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -167
@@ -1,5 +1,9 @@
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
8
  before do
5
9
  @window = @session.current_window
@@ -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
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
54
+ context 'with block' do
51
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,5 +1,9 @@
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
8
  before do
5
9
  @window = @session.current_window
@@ -15,8 +19,8 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
15
19
  @session.switch_to_window(@window)
16
20
  end
17
21
 
18
- let(:zero_windows_message) { "block passed to #window_opened_by opened 0 windows instead of 1" }
19
- 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' }
20
24
 
21
25
  context 'with :wait option' do
22
26
  it 'should raise error if value of :wait is less than timeout' do
@@ -1,95 +1,97 @@
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 Capybara::Window, requires: [:windows] do
8
+ let!(:orig_window) { @session.current_window }
4
9
  before do
5
- @window = @session.current_window
6
10
  @session.visit('/with_windows')
7
11
  end
8
12
 
9
13
  after do
10
- (@session.windows - [@window]).each do |w|
14
+ (@session.windows - [orig_window]).each do |w|
11
15
  @session.switch_to_window w
12
16
  w.close
13
17
  end
14
- @session.switch_to_window(@window)
18
+ @session.switch_to_window(orig_window)
15
19
  end
16
20
 
17
21
  describe '#exists?' do
18
- before do
19
- @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
20
24
  @session.find(:css, '#openWindow').click
21
25
  end
22
- end
23
26
 
24
- it "should become false after window was closed" do
25
27
  expect do
26
- @session.switch_to_window @other_window
27
- @other_window.close
28
- 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)
29
31
  end
30
32
  end
31
33
 
32
34
  describe '#closed?' do
33
- it "should become true after window was closed" do
34
- @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
35
37
  @session.find(:css, '#openWindow').click
36
38
  end
37
39
  expect do
38
- @session.switch_to_window @other_window
39
- @other_window.close
40
- 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)
41
43
  end
42
44
  end
43
45
 
44
46
  describe '#current?' do
45
- before do
46
- @other_window = @session.window_opened_by do
47
+ let(:other_window) do
48
+ @session.window_opened_by do
47
49
  @session.find(:css, '#openWindow').click
48
50
  end
49
51
  end
50
52
 
51
53
  it 'should become true after switching to window' do
52
54
  expect do
53
- @session.switch_to_window(@other_window)
54
- 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)
55
57
  end
56
58
 
57
59
  it 'should return false if window is closed' do
58
- @session.switch_to_window(@other_window)
59
- @other_window.close
60
- 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)
61
63
  end
62
64
  end
63
65
 
64
66
  describe '#close' do
65
- before do
66
- @other_window = @session.window_opened_by do
67
+ let!(:other_window) do
68
+ @session.window_opened_by do
67
69
  @session.find(:css, '#openWindow').click
68
70
  end
69
71
  end
70
72
 
71
73
  it 'should switch to original window if invoked not for current window' do
72
74
  expect(@session.windows.size).to eq(2)
73
- expect(@session.current_window).to eq(@window)
74
- @other_window.close
75
+ expect(@session.current_window).to eq(orig_window)
76
+ other_window.close
75
77
  expect(@session.windows.size).to eq(1)
76
- expect(@session.current_window).to eq(@window)
78
+ expect(@session.current_window).to eq(orig_window)
77
79
  end
78
80
 
79
81
  it 'should make subsequent invocations of other methods raise no_such_window_error if invoked for current window' do
80
- @session.switch_to_window(@other_window)
81
- expect(@session.current_window).to eq(@other_window)
82
- @other_window.close
82
+ @session.switch_to_window(other_window)
83
+ expect(@session.current_window).to eq(other_window)
84
+ other_window.close
83
85
  expect do
84
86
  @session.find(:css, '#some_id')
85
87
  end.to raise_error(@session.driver.no_such_window_error)
86
- @session.switch_to_window(@window)
88
+ @session.switch_to_window(orig_window)
87
89
  end
88
90
  end
89
91
 
90
92
  describe '#size' do
91
93
  def win_size
92
- @session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
94
+ @session.evaluate_script('[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]')
93
95
  end
94
96
 
95
97
  it 'should return size of whole window', requires: %i[windows js] do
@@ -97,57 +99,54 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
97
99
  end
98
100
 
99
101
  it 'should switch to original window if invoked not for current window' do
100
- @other_window = @session.window_opened_by do
102
+ other_window = @session.window_opened_by do
101
103
  @session.find(:css, '#openWindow').click
102
104
  end
103
105
  sleep 1
104
- size = @session.within_window(@other_window) do
106
+ size = @session.within_window(other_window) do
105
107
  win_size
106
108
  end
107
- expect(@other_window.size).to eq(size)
108
- expect(@session.current_window).to eq(@window)
109
+ expect(other_window.size).to eq(size)
110
+ expect(@session.current_window).to eq(orig_window)
109
111
  end
110
112
  end
111
113
 
112
114
  describe '#resize_to' do
113
- before do
114
- @initial_size = @session.current_window.size
115
- end
115
+ let!(:initial_size) { @session.current_window.size }
116
116
 
117
117
  after do
118
- @session.current_window.resize_to(*@initial_size)
119
- sleep 0.5
118
+ @session.current_window.resize_to(*initial_size)
119
+ sleep 1
120
120
  end
121
121
 
122
122
  it 'should be able to resize window', requires: %i[windows js] do
123
- width, height = @initial_size
123
+ width, height = initial_size
124
124
  @session.current_window.resize_to(width - 100, height - 100)
125
125
  sleep 1
126
126
  expect(@session.current_window.size).to eq([width - 100, height - 100])
127
127
  end
128
128
 
129
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
130
+ other_window = @session.window_opened_by do
131
131
  @session.find(:css, '#openWindow').click
132
132
  end
133
- @other_window.resize_to(400, 300)
134
- expect(@session.current_window).to eq(@window)
135
133
 
136
- # #size returns values larger than availWidth, availHeight with Chromedriver
137
- @session.within_window(@other_window) do
138
- expect(@session.current_window.size).to eq([400, 300])
139
- # 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])
140
139
  end
141
140
  end
142
141
  end
143
142
 
144
143
  describe '#maximize' do
145
- before do
146
- @initial_size = @session.current_window.size
144
+ let! :initial_size do
145
+ @session.current_window.size
147
146
  end
148
147
 
149
148
  after do
150
- @session.current_window.resize_to(*@initial_size)
149
+ @session.current_window.resize_to(*initial_size)
151
150
  sleep 0.5
152
151
  end
153
152
 
@@ -167,35 +166,35 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
167
166
  end
168
167
 
169
168
  it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
170
- @other_window = @session.window_opened_by do
169
+ other_window = @session.window_opened_by do
171
170
  @session.find(:css, '#openWindow').click
172
171
  end
173
- @other_window.resize_to(400, 300)
172
+ other_window.resize_to(400, 300)
174
173
  sleep 0.5
175
- @other_window.maximize
174
+ other_window.maximize
176
175
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
177
176
 
178
- expect(@session.current_window).to eq(@window)
177
+ expect(@session.current_window).to eq(orig_window)
179
178
  # Maximizing the browser affects all tabs so this may not be valid in real browsers
180
- # expect(@session.current_window.size).to eq(@initial_size)
179
+ # expect(@session.current_window.size).to eq(initial_size)
181
180
 
182
- ow_width, ow_height = @other_window.size
181
+ ow_width, ow_height = other_window.size
183
182
  expect(ow_width).to be > 400
184
183
  expect(ow_height).to be > 300
185
184
  end
186
185
  end
187
186
 
188
187
  describe '#fullscreen' do
189
- before do
190
- @initial_size = @session.current_window.size
188
+ let! :initial_size do
189
+ @session.current_window.size
191
190
  end
192
191
 
193
192
  after do
194
- @session.current_window.resize_to(*@initial_size)
195
- sleep 0.5
193
+ @session.current_window.resize_to(*initial_size)
194
+ sleep 1
196
195
  end
197
196
 
198
- it "should be able to fullscreen the window" do
197
+ it 'should be able to fullscreen the window' do
199
198
  expect do
200
199
  @session.current_window.fullscreen
201
200
  end.not_to raise_error
@@ -1,5 +1,9 @@
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 '#windows', requires: [:windows] do
4
8
  before do
5
9
  @window = @session.current_window
@@ -25,6 +29,6 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
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(['With Windows', 'Title of the first popup', 'Title of popup two'])
32
+ expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two']) # rubocop:disable RSpec/MatchArray
29
33
  end
30
34
  end
@@ -19,8 +19,8 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
19
19
  @session.switch_to_window(@window)
20
20
  end
21
21
 
22
- context "with an instance of Capybara::Window" do
23
- it "should not invoke driver#switch_to_window when given current window" do
22
+ context 'with an instance of Capybara::Window' do
23
+ it 'should not invoke driver#switch_to_window when given current window' do
24
24
  allow(@session.driver).to receive(:switch_to_window).and_call_original
25
25
  @session.within_window @window do
26
26
  expect(@session.title).to eq('With Windows')
@@ -28,7 +28,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
28
28
  expect(@session.driver).not_to have_received(:switch_to_window)
29
29
  end
30
30
 
31
- it "should be able to switch to another window" do
31
+ it 'should be able to switch to another window' do
32
32
  window = (@session.windows - [@window]).first
33
33
  @session.within_window window do
34
34
  expect(@session).to have_title(/Title of the first popup|Title of popup two/)
@@ -36,7 +36,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
36
36
  expect(@session.title).to eq('With Windows')
37
37
  end
38
38
 
39
- it "returns value from the block" do
39
+ it 'returns value from the block' do
40
40
  window = (@session.windows - [@window]).first
41
41
  value = @session.within_window window do
42
42
  43252003274489856000
@@ -44,7 +44,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
44
44
  expect(value).to eq(43252003274489856000)
45
45
  end
46
46
 
47
- it "should switch back if exception was raised inside block" do
47
+ it 'should switch back if exception was raised inside block' do
48
48
  window = (@session.windows - [@window]).first
49
49
  expect do
50
50
  @session.within_window(window) do
@@ -58,7 +58,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
58
58
  expect(@session.send(:scopes)).to eq([nil])
59
59
  end
60
60
 
61
- it "should leave correct scopes after execution in case of error", requires: %i[windows frames] do
61
+ it 'should leave correct scopes after execution in case of error', requires: %i[windows frames] do
62
62
  window = (@session.windows - [@window]).first
63
63
  expect do
64
64
  @session.within_frame 'frameOne' do
@@ -86,14 +86,14 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
86
86
  end
87
87
  end
88
88
 
89
- context "with lambda" do
90
- it "should find the div in another window" do
89
+ context 'with lambda' do
90
+ it 'should find the div in another window' do
91
91
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
92
92
  expect(@session).to have_css('#divInPopupOne')
93
93
  end
94
94
  end
95
95
 
96
- it "should find divs in both windows" do
96
+ it 'should find divs in both windows' do
97
97
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
98
98
  expect(@session).to have_css('#divInPopupTwo')
99
99
  end
@@ -103,7 +103,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
103
103
  expect(@session.title).to eq('With Windows')
104
104
  end
105
105
 
106
- it "should be able to nest within_window" do
106
+ it 'should be able to nest within_window' do
107
107
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
108
108
  expect(@session).to have_css('#divInPopupTwo')
109
109
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
@@ -117,7 +117,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
117
117
  expect(@session.title).to eq('With Windows')
118
118
  end
119
119
 
120
- it "should work inside a normal scope" do
120
+ it 'should work inside a normal scope' do
121
121
  expect(@session).to have_css('#openWindow')
122
122
  @session.within(:css, '#scope') do
123
123
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
@@ -133,18 +133,18 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
133
133
  @session.within_window(-> { @session.title == 'Invalid title' }) do
134
134
  expect(@session).to have_css('#divInPopupOne')
135
135
  end
136
- 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')
137
137
  expect(@session.current_window).to eq(@window)
138
138
  expect(@session).to have_css('#doesNotOpenWindows')
139
139
  expect(@session.send(:scopes)).to eq([nil])
140
140
  end
141
141
 
142
- it "returns value from the block" do
142
+ it 'returns value from the block' do
143
143
  value = @session.within_window(-> { @session.title == 'Title of popup two' }) { 42 }
144
144
  expect(value).to eq(42)
145
145
  end
146
146
 
147
- it "should switch back if exception was raised inside block" do
147
+ it 'should switch back if exception was raised inside block' do
148
148
  expect do
149
149
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
150
150
  raise 'some error'