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
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ class NodeWrapper
4
+ def initialize(element); @element = element end
5
+ def to_capybara_node(); @element end
6
+ end
7
+
8
+ Capybara::SpecHelper.spec '#to_capybara_node' do
9
+ before do
10
+ @session.visit('/with_html')
11
+ end
12
+
13
+ it 'should support have_xxx expectations' do
14
+ para = NodeWrapper.new(@session.find(:css, '#first'))
15
+ expect(para).to have_link('ullamco')
16
+ end
17
+
18
+ it 'should support within' do
19
+ para = NodeWrapper.new(@session.find(:css, '#first'))
20
+ expect(@session).to have_css('#second')
21
+ @session.within(para) do
22
+ expect(@session).to have_link('ullamco')
23
+ expect(@session).not_to have_css('#second')
24
+ end
25
+ end
26
+
27
+ it 'should generate correct errors' do
28
+ para = NodeWrapper.new(@session.find(:css, '#first'))
29
+ expect do
30
+ expect(para).to have_text('Header Class Test One')
31
+ end.to raise_error(/^expected to find text "Header Class Test One" in "Lore/)
32
+ expect do
33
+ expect(para).to have_css('#second')
34
+ end.to raise_error(/^expected to find css "#second" within #<Capybara::Node::Element/)
35
+ expect do
36
+ expect(para).to have_link(href: %r{/without_simple_html})
37
+ end.to raise_error(%r{^expected to find link nil with href matching /\\/without_simple_html/ within #<Capybara::Node::Element})
38
+ end
39
+ end
@@ -0,0 +1,34 @@
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
+
7
+ Capybara::SpecHelper.spec '#refresh' do
8
+ it 'reload the page' do
9
+ @session.visit('/form')
10
+ expect(@session).to have_select('form_locale', selected: 'English')
11
+ @session.select('Swedish', from: 'form_locale')
12
+ expect(@session).to have_select('form_locale', selected: 'Swedish')
13
+ @session.refresh
14
+ expect(@session).to have_select('form_locale', selected: 'English')
15
+ end
16
+
17
+ it 'raises any errors caught inside the server', requires: [:server] do
18
+ quietly { @session.visit('/error') }
19
+ expect do
20
+ @session.refresh
21
+ end.to raise_error(TestApp::TestAppError)
22
+ end
23
+
24
+ it 'it reposts' do
25
+ @session.visit('/form')
26
+ @session.select('Sweden', from: 'form_region')
27
+ @session.click_button('awesome')
28
+ sleep 2
29
+ expect do
30
+ @session.refresh
31
+ sleep 2
32
+ end.to change { extract_results(@session)['post_count'] }.by(1)
33
+ end
34
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#reset_session!' do
3
- it "removes cookies" do
4
+ it 'removes cookies from current domain' do
4
5
  @session.visit('/set_cookie')
5
6
  @session.visit('/get_cookie')
6
7
  expect(@session).to have_content('test_cookie')
@@ -10,19 +11,33 @@ Capybara::SpecHelper.spec '#reset_session!' do
10
11
  expect(@session.body).not_to include('test_cookie')
11
12
  end
12
13
 
13
- it "resets current url, host, path" do
14
+ it 'removes ALL cookies', requires: [:server] do
15
+ domains = ['localhost', '127.0.0.1']
16
+ domains.each do |domain|
17
+ @session.visit("http://#{domain}:#{@session.server.port}/set_cookie")
18
+ @session.visit("http://#{domain}:#{@session.server.port}/get_cookie")
19
+ expect(@session).to have_content('test_cookie')
20
+ end
21
+ @session.reset_session!
22
+ domains.each do |domain|
23
+ @session.visit("http://#{domain}:#{@session.server.port}/get_cookie")
24
+ expect(@session.body).not_to include('test_cookie')
25
+ end
26
+ end
27
+
28
+ it 'resets current url, host, path' do
14
29
  @session.visit '/foo'
15
30
  expect(@session.current_url).not_to be_empty
16
31
  expect(@session.current_host).not_to be_empty
17
32
  expect(@session.current_path).to eq('/foo')
18
33
 
19
34
  @session.reset_session!
20
- expect([nil, '', 'about:blank']).to include(@session.current_url)
21
- expect(['', nil]).to include(@session.current_path)
35
+ expect(@session.current_url).to satisfy('be a blank url') { |url| [nil, '', 'about:blank'].include? url }
36
+ expect(@session.current_path).to satisfy('be a blank path') { |path| ['', nil].include? path }
22
37
  expect(@session.current_host).to be_nil
23
38
  end
24
39
 
25
- it "resets page body" do
40
+ it 'resets page body' do
26
41
  @session.visit('/with_html')
27
42
  expect(@session).to have_content('This is a test')
28
43
  expect(@session.find('.//h1').text).to include('This is a test')
@@ -32,64 +47,90 @@ Capybara::SpecHelper.spec '#reset_session!' do
32
47
  expect(@session).to have_no_selector('.//h1')
33
48
  end
34
49
 
35
- it "is synchronous" do
36
- @session.visit("/with_slow_unload")
50
+ it 'is synchronous' do
51
+ @session.visit('/with_slow_unload')
37
52
  expect(@session).to have_selector(:css, 'div')
38
53
  @session.reset_session!
39
- expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
54
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
40
55
  end
41
56
 
42
- it "handles modals during unload" do
57
+ it 'handles modals during unload', requires: [:modals] do
43
58
  @session.visit('/with_unload_alert')
44
59
  expect(@session).to have_selector(:css, 'div')
45
60
  expect { @session.reset_session! }.not_to raise_error
46
- expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
61
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
47
62
  end
48
63
 
49
- it "raises any standard errors caught inside the server", :requires => [:server] do
50
- quietly { @session.visit("/error") }
64
+ it 'handles already open modals', requires: [:modals] do
65
+ @session.visit('/with_unload_alert')
66
+ @session.click_link('Go away')
67
+ expect { @session.reset_session! }.not_to raise_error
68
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
69
+ end
70
+
71
+ it 'raises any standard errors caught inside the server', requires: [:server] do
72
+ quietly { @session.visit('/error') }
51
73
  expect do
52
74
  @session.reset_session!
53
75
  end.to raise_error(TestApp::TestAppError)
54
- @session.visit("/")
55
- expect(@session.current_path).to eq("/")
76
+ @session.visit('/')
77
+ expect(@session.current_path).to eq('/')
56
78
  end
57
79
 
58
- context "When reuse_server == false" do
80
+ it 'closes extra windows', requires: [:windows] do
81
+ @session.visit('/with_html')
82
+ @session.open_new_window
83
+ @session.open_new_window
84
+ expect(@session.windows.size).to eq 3
85
+ @session.reset_session!
86
+ expect(@session.windows.size).to eq 1
87
+ end
88
+
89
+ it 'closes extra windows when not on the first window', requires: [:windows] do
90
+ @session.visit('/with_html')
91
+ @session.switch_to_window(@session.open_new_window)
92
+ @session.open_new_window
93
+ expect(@session.windows.size).to eq 3
94
+ @session.reset_session!
95
+ expect(@session.windows.size).to eq 1
96
+ end
97
+
98
+ context 'When reuse_server == false' do
99
+ let!(:orig_reuse_server) { Capybara.reuse_server }
100
+
59
101
  before do
60
- @reuse_server = Capybara.reuse_server
61
102
  Capybara.reuse_server = false
62
103
  end
63
104
 
64
- it "raises any standard errors caught inside the server during a second session", :requires => [:server] do
105
+ after do
106
+ Capybara.reuse_server = orig_reuse_server
107
+ end
108
+
109
+ it 'raises any standard errors caught inside the server during a second session', requires: [:server] do
65
110
  Capybara.using_driver(@session.mode) do
66
111
  Capybara.using_session(:another_session) do
67
- @another_session = Capybara.current_session
68
- quietly { @another_session.visit("/error") }
112
+ another_session = Capybara.current_session
113
+ quietly { another_session.visit('/error') }
69
114
  expect do
70
- @another_session.reset_session!
115
+ another_session.reset_session!
71
116
  end.to raise_error(TestApp::TestAppError)
72
- @another_session.visit("/")
73
- expect(@another_session.current_path).to eq("/")
117
+ another_session.visit('/')
118
+ expect(another_session.current_path).to eq('/')
74
119
  end
75
120
  end
76
121
  end
77
-
78
- after do
79
- Capybara.reuse_server = @reuse_server
80
- end
81
122
  end
82
123
 
83
- it "raises configured errors caught inside the server", :requires => [:server] do
84
- prev_errors = Capybara.server_errors
124
+ it 'raises configured errors caught inside the server', requires: [:server] do
125
+ prev_errors = Capybara.server_errors.dup
85
126
 
86
127
  Capybara.server_errors = [LoadError]
87
- quietly { @session.visit("/error") }
128
+ quietly { @session.visit('/error') }
88
129
  expect do
89
130
  @session.reset_session!
90
131
  end.not_to raise_error
91
132
 
92
- quietly { @session.visit("/load_error") }
133
+ quietly { @session.visit('/load_error') }
93
134
  expect do
94
135
  @session.reset_session!
95
136
  end.to raise_error(LoadError)
@@ -97,11 +138,11 @@ Capybara::SpecHelper.spec '#reset_session!' do
97
138
  Capybara.server_errors = prev_errors
98
139
  end
99
140
 
100
- it "ignores server errors when `Capybara.raise_server_errors = false`", :requires => [:server] do
141
+ it 'ignores server errors when `Capybara.raise_server_errors = false`', requires: [:server] do
101
142
  Capybara.raise_server_errors = false
102
- quietly { @session.visit("/error") }
143
+ quietly { @session.visit('/error') }
103
144
  @session.reset_session!
104
- @session.visit("/")
105
- expect(@session.current_path).to eq("/")
145
+ @session.visit('/')
146
+ expect(@session.current_path).to eq('/')
106
147
  end
107
148
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#status_code' do
3
- it "should return response codes", :requires => [:status_code] do
4
+ it 'should return response codes', requires: [:status_code] do
4
5
  @session.visit('/with_simple_html')
5
6
  expect(@session.status_code).to eq(200)
6
7
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'launchy'
3
4
 
4
5
  Capybara::SpecHelper.spec '#save_and_open_page' do
@@ -7,12 +8,12 @@ Capybara::SpecHelper.spec '#save_and_open_page' do
7
8
  end
8
9
 
9
10
  after do
10
- Dir.glob("capybara-*.html").each do |file|
11
+ Dir.glob('capybara-*.html').each do |file|
11
12
  FileUtils.rm(file)
12
13
  end
13
14
  end
14
15
 
15
- it "sends open method to launchy" do
16
+ it 'sends open method to launchy' do
16
17
  allow(Launchy).to receive(:open)
17
18
  @session.save_and_open_page
18
19
  expect(Launchy).to have_received(:open).with(/capybara-\d+\.html/)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'launchy'
3
4
 
4
5
  Capybara::SpecHelper.spec '#save_and_open_screenshot' do
@@ -6,42 +7,37 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
6
7
  @session.visit '/'
7
8
  end
8
9
 
9
- it 'opens file from the default directory', :requires => [:screenshot] do
10
- expected_file_regex = %r{capybara-\d+\.png}
10
+ it 'opens file from the default directory', requires: [:screenshot] do
11
+ expected_file_regex = /capybara-\d+\.png/
11
12
  allow(@session.driver).to receive(:save_screenshot)
12
13
  allow(Launchy).to receive(:open)
13
14
 
14
15
  @session.save_and_open_screenshot
15
16
 
16
- expect(@session.driver).to have_received(:save_screenshot).
17
- with(expected_file_regex, {})
17
+ expect(@session.driver).to have_received(:save_screenshot)
18
+ .with(expected_file_regex, any_args)
18
19
  expect(Launchy).to have_received(:open).with(expected_file_regex)
19
20
  end
20
21
 
21
- it 'opens file from the provided directory', :requires => [:screenshot] do
22
+ it 'opens file from the provided directory', requires: [:screenshot] do
22
23
  custom_path = 'screenshots/1.png'
23
24
  allow(@session.driver).to receive(:save_screenshot)
24
25
  allow(Launchy).to receive(:open)
25
26
 
26
27
  @session.save_and_open_screenshot(custom_path)
27
28
 
28
- expect(@session.driver).to have_received(:save_screenshot).
29
- with(/#{custom_path}$/, {})
29
+ expect(@session.driver).to have_received(:save_screenshot)
30
+ .with(/#{custom_path}$/, any_args)
30
31
  expect(Launchy).to have_received(:open).with(/#{custom_path}$/)
31
32
  end
32
33
 
33
34
  context 'when launchy cannot be required' do
34
- it 'prints out a correct warning message', :requires => [:screenshot] do
35
+ it 'prints out a correct warning message', requires: [:screenshot] do
35
36
  file_path = File.join(Dir.tmpdir, 'test.png')
36
- allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
37
37
  allow(@session).to receive(:warn)
38
-
38
+ allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
39
39
  @session.save_and_open_screenshot(file_path)
40
-
41
- expect(@session).to have_received(:warn).
42
- with("File saved to #{file_path}.")
43
- expect(@session).to have_received(:warn).
44
- with('Please install the launchy gem to open the file automatically.')
40
+ expect(@session).to have_received(:warn).with("File saved to #{file_path}.\nPlease install the launchy gem to open the file automatically.")
45
41
  end
46
42
  end
47
43
  end
@@ -1,76 +1,79 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#save_page' do
3
- let(:alternative_path) { File.join(Dir.pwd, "save_and_open_page_tmp") }
4
+ let(:alternative_path) { File.join(Dir.pwd, 'save_and_open_page_tmp') }
4
5
  before do
5
- @session.visit("/foo")
6
+ @old_save_path = Capybara.save_path
7
+ Capybara.save_path = nil
8
+ @session.visit('/foo')
6
9
  end
7
10
 
8
11
  after do
9
- Capybara.save_and_open_page_path = nil
10
- Capybara.save_path = nil
11
- Dir.glob("capybara-*.html").each do |file|
12
+ Capybara.save_path = @old_save_path
13
+ Dir.glob('capybara-*.html').each do |file|
12
14
  FileUtils.rm(file)
13
15
  end
14
16
  FileUtils.rm_rf alternative_path
15
17
  end
16
18
 
17
- it "saves the page in the root directory" do
19
+ it 'saves the page in the root directory' do
18
20
  @session.save_page
19
- path = Dir.glob("capybara-*.html").first
20
- expect(File.read(path)).to include("Another World")
21
+ path = Dir.glob('capybara-*.html').first
22
+ expect(File.read(path)).to include('Another World')
21
23
  end
22
24
 
23
- it "generates a sensible filename" do
25
+ it 'generates a sensible filename' do
24
26
  @session.save_page
25
- filename = Dir.glob("capybara-*.html").first
27
+ filename = Dir.glob('capybara-*.html').first
26
28
  expect(filename).to match(/^capybara-\d+\.html$/)
27
29
  end
28
30
 
29
- it "can store files in a specified directory" do
31
+ it 'can store files in a specified directory' do
30
32
  Capybara.save_path = alternative_path
31
33
  @session.save_page
32
- path = Dir.glob(alternative_path + "/capybara-*.html").first
33
- expect(File.read(path)).to include("Another World")
34
+ path = Dir.glob("#{alternative_path}/capybara-*.html").first
35
+ expect(File.read(path)).to include('Another World')
34
36
  end
35
37
 
36
- it "uses the given filename" do
37
- @session.save_page("capybara-001122.html")
38
- expect(File.read("capybara-001122.html")).to include("Another World")
38
+ it 'uses the given filename' do
39
+ @session.save_page('capybara-001122.html')
40
+ expect(File.read('capybara-001122.html')).to include('Another World')
39
41
  end
40
42
 
41
- it "can store files in a specified directory with a given filename" do
43
+ it 'can store files in a specified directory with a given filename' do
42
44
  Capybara.save_path = alternative_path
43
- @session.save_page("capybara-001133.html")
44
- path = alternative_path + "/capybara-001133.html"
45
- expect(File.read(path)).to include("Another World")
45
+ @session.save_page('capybara-001133.html')
46
+ path = "#{alternative_path}/capybara-001133.html"
47
+ expect(File.read(path)).to include('Another World')
46
48
  end
47
49
 
48
- it "can store files in a specified directory with a given relative filename" do
50
+ it 'can store files in a specified directory with a given relative filename' do
49
51
  Capybara.save_path = alternative_path
50
- @session.save_page("tmp/capybara-001144.html")
51
- path = alternative_path + "/tmp/capybara-001144.html"
52
- expect(File.read(path)).to include("Another World")
52
+ @session.save_page('tmp/capybara-001144.html')
53
+ path = "#{alternative_path}/tmp/capybara-001144.html"
54
+ expect(File.read(path)).to include('Another World')
53
55
  end
54
56
 
55
- it "returns an absolute path in pwd" do
57
+ it 'returns an absolute path in pwd' do
56
58
  result = @session.save_page
57
- path = File.expand_path(Dir.glob("capybara-*.html").first, Dir.pwd)
59
+ path = File.expand_path(Dir.glob('capybara-*.html').first, Dir.pwd)
58
60
  expect(result).to eq(path)
59
61
  end
60
62
 
61
- it "returns an absolute path in given directory" do
63
+ it 'returns an absolute path in given directory' do
62
64
  Capybara.save_path = alternative_path
63
65
  result = @session.save_page
64
- path = File.expand_path(Dir.glob(alternative_path + "/capybara-*.html").first, alternative_path)
66
+ path = File.expand_path(Dir.glob("#{alternative_path}/capybara-*.html").first, alternative_path)
65
67
  expect(result).to eq(path)
66
68
  end
67
69
 
68
- context "asset_host contains a string" do
69
- before { Capybara.asset_host = "http://example.com" }
70
+ context 'asset_host contains a string' do
71
+ before { Capybara.asset_host = 'http://example.com' }
72
+
70
73
  after { Capybara.asset_host = nil }
71
74
 
72
- it "prepends base tag with value from asset_host to the head" do
73
- @session.visit("/with_js")
75
+ it 'prepends base tag with value from asset_host to the head' do
76
+ @session.visit('/with_js')
74
77
  path = @session.save_page
75
78
 
76
79
  result = File.read(path)
@@ -79,45 +82,29 @@ Capybara::SpecHelper.spec '#save_page' do
79
82
 
80
83
  it "doesn't prepend base tag to pages when asset_host is nil" do
81
84
  Capybara.asset_host = nil
82
- @session.visit("/with_js")
85
+ @session.visit('/with_js')
83
86
  path = @session.save_page
84
87
 
85
88
  result = File.read(path)
86
89
  expect(result).to include('<html')
87
- expect(result).not_to include("http://example.com")
90
+ expect(result).not_to include('http://example.com')
88
91
  end
89
92
 
90
93
  it "doesn't prepend base tag to pages which already have it" do
91
- @session.visit("/with_base_tag")
94
+ @session.visit('/with_base_tag')
92
95
  path = @session.save_page
93
96
 
94
97
  result = File.read(path)
95
98
  expect(result).to include('<html')
96
- expect(result).not_to include("http://example.com")
99
+ expect(result).not_to include('http://example.com')
97
100
  end
98
101
 
99
- it "executes successfully even if the page is missing a <head>" do
100
- @session.visit("/with_simple_html")
102
+ it 'executes successfully even if the page is missing a <head>' do
103
+ @session.visit('/with_simple_html')
101
104
  path = @session.save_page
102
105
 
103
106
  result = File.read(path)
104
- expect(result).to include("Bar")
105
- end
106
- end
107
-
108
- context "with deprecated save_and_open_page_path" do
109
- it "can store files in a specified directory" do
110
- Capybara.save_and_open_page_path = alternative_path
111
- @session.save_page
112
- path = Dir.glob(alternative_path + "/capybara-*.html").first
113
- expect(File.read(path)).to include("Another World")
114
- end
115
-
116
- it "returns an absolute path in given directory" do
117
- Capybara.save_and_open_page_path = alternative_path
118
- result = @session.save_page
119
- path = File.expand_path(Dir.glob(alternative_path + "/capybara-*.html").first, alternative_path)
120
- expect(result).to eq(path)
107
+ expect(result).to include('Bar')
121
108
  end
122
109
  end
123
110
  end