capybara 3.32.2

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 (313) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/History.md +1813 -0
  4. data/License.txt +22 -0
  5. data/README.md +1099 -0
  6. data/lib/capybara.rb +511 -0
  7. data/lib/capybara/config.rb +94 -0
  8. data/lib/capybara/cucumber.rb +27 -0
  9. data/lib/capybara/driver/base.rb +170 -0
  10. data/lib/capybara/driver/node.rb +139 -0
  11. data/lib/capybara/dsl.rb +65 -0
  12. data/lib/capybara/helpers.rb +108 -0
  13. data/lib/capybara/minitest.rb +386 -0
  14. data/lib/capybara/minitest/spec.rb +264 -0
  15. data/lib/capybara/node/actions.rb +420 -0
  16. data/lib/capybara/node/base.rb +143 -0
  17. data/lib/capybara/node/document.rb +48 -0
  18. data/lib/capybara/node/document_matchers.rb +67 -0
  19. data/lib/capybara/node/element.rb +606 -0
  20. data/lib/capybara/node/finders.rb +325 -0
  21. data/lib/capybara/node/matchers.rb +883 -0
  22. data/lib/capybara/node/simple.rb +208 -0
  23. data/lib/capybara/queries/ancestor_query.rb +27 -0
  24. data/lib/capybara/queries/base_query.rb +106 -0
  25. data/lib/capybara/queries/current_path_query.rb +51 -0
  26. data/lib/capybara/queries/match_query.rb +26 -0
  27. data/lib/capybara/queries/selector_query.rb +710 -0
  28. data/lib/capybara/queries/sibling_query.rb +26 -0
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +110 -0
  31. data/lib/capybara/queries/title_query.rb +39 -0
  32. data/lib/capybara/rack_test/browser.rb +140 -0
  33. data/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/lib/capybara/rack_test/driver.rb +109 -0
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +127 -0
  37. data/lib/capybara/rack_test/node.rb +325 -0
  38. data/lib/capybara/rails.rb +16 -0
  39. data/lib/capybara/registrations/drivers.rb +36 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
  41. data/lib/capybara/registrations/servers.rb +44 -0
  42. data/lib/capybara/result.rb +190 -0
  43. data/lib/capybara/rspec.rb +29 -0
  44. data/lib/capybara/rspec/features.rb +23 -0
  45. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/lib/capybara/rspec/matchers.rb +201 -0
  47. data/lib/capybara/rspec/matchers/base.rb +111 -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 +77 -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 +38 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/selector.rb +233 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
  63. data/lib/capybara/selector/css.rb +102 -0
  64. data/lib/capybara/selector/definition.rb +276 -0
  65. data/lib/capybara/selector/definition/button.rb +51 -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 +27 -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 +46 -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/filter.rb +5 -0
  87. data/lib/capybara/selector/filter_set.rb +124 -0
  88. data/lib/capybara/selector/filters/base.rb +77 -0
  89. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  93. data/lib/capybara/selector/selector.rb +147 -0
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  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 +496 -0
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -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 +78 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +34 -0
  111. data/lib/capybara/selenium/node.rb +610 -0
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +131 -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 +47 -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.rb +126 -0
  124. data/lib/capybara/server/animation_disabler.rb +58 -0
  125. data/lib/capybara/server/checker.rb +44 -0
  126. data/lib/capybara/server/middleware.rb +69 -0
  127. data/lib/capybara/session.rb +942 -0
  128. data/lib/capybara/session/config.rb +124 -0
  129. data/lib/capybara/session/matchers.rb +87 -0
  130. data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  131. data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  132. data/lib/capybara/spec/fixtures/no_extension +1 -0
  133. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  134. data/lib/capybara/spec/public/jquery-ui.js +13 -0
  135. data/lib/capybara/spec/public/jquery.js +5 -0
  136. data/lib/capybara/spec/public/offset.js +6 -0
  137. data/lib/capybara/spec/public/test.js +268 -0
  138. data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  139. data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  140. data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  141. data/lib/capybara/spec/session/all_spec.rb +278 -0
  142. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
  150. data/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/lib/capybara/spec/session/check_spec.rb +235 -0
  152. data/lib/capybara/spec/session/choose_spec.rb +121 -0
  153. data/lib/capybara/spec/session/click_button_spec.rb +506 -0
  154. data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
  155. data/lib/capybara/spec/session/click_link_spec.rb +229 -0
  156. data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/lib/capybara/spec/session/current_url_spec.rb +115 -0
  158. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
  168. data/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/lib/capybara/spec/session/find_link_spec.rb +70 -0
  172. data/lib/capybara/spec/session/find_spec.rb +531 -0
  173. data/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  178. data/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  183. data/lib/capybara/spec/session/has_button_spec.rb +69 -0
  184. data/lib/capybara/spec/session/has_css_spec.rb +374 -0
  185. data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
  186. data/lib/capybara/spec/session/has_field_spec.rb +349 -0
  187. data/lib/capybara/spec/session/has_link_spec.rb +39 -0
  188. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  189. data/lib/capybara/spec/session/has_select_spec.rb +310 -0
  190. data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
  191. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  192. data/lib/capybara/spec/session/has_table_spec.rb +198 -0
  193. data/lib/capybara/spec/session/has_text_spec.rb +394 -0
  194. data/lib/capybara/spec/session/has_title_spec.rb +71 -0
  195. data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  196. data/lib/capybara/spec/session/headers_spec.rb +8 -0
  197. data/lib/capybara/spec/session/html_spec.rb +47 -0
  198. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  199. data/lib/capybara/spec/session/node_spec.rb +1292 -0
  200. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  201. data/lib/capybara/spec/session/refresh_spec.rb +33 -0
  202. data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
  203. data/lib/capybara/spec/session/response_code_spec.rb +8 -0
  204. data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  205. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  206. data/lib/capybara/spec/session/save_page_spec.rb +110 -0
  207. data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  208. data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  209. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  210. data/lib/capybara/spec/session/select_spec.rb +229 -0
  211. data/lib/capybara/spec/session/selectors_spec.rb +98 -0
  212. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  213. data/lib/capybara/spec/session/source_spec.rb +0 -0
  214. data/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/lib/capybara/spec/session/visit_spec.rb +204 -0
  219. data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/lib/capybara/spec/session/within_spec.rb +199 -0
  228. data/lib/capybara/spec/spec_helper.rb +134 -0
  229. data/lib/capybara/spec/test_app.rb +226 -0
  230. data/lib/capybara/spec/views/animated.erb +49 -0
  231. data/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/lib/capybara/spec/views/form.erb +685 -0
  234. data/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  241. data/lib/capybara/spec/views/obscured.erb +47 -0
  242. data/lib/capybara/spec/views/offset.erb +32 -0
  243. data/lib/capybara/spec/views/path.erb +13 -0
  244. data/lib/capybara/spec/views/popup_one.erb +9 -0
  245. data/lib/capybara/spec/views/popup_two.erb +9 -0
  246. data/lib/capybara/spec/views/postback.erb +14 -0
  247. data/lib/capybara/spec/views/react.erb +45 -0
  248. data/lib/capybara/spec/views/scroll.erb +20 -0
  249. data/lib/capybara/spec/views/spatial.erb +31 -0
  250. data/lib/capybara/spec/views/tables.erb +130 -0
  251. data/lib/capybara/spec/views/with_animation.erb +74 -0
  252. data/lib/capybara/spec/views/with_base_tag.erb +11 -0
  253. data/lib/capybara/spec/views/with_count.erb +8 -0
  254. data/lib/capybara/spec/views/with_dragula.erb +22 -0
  255. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  256. data/lib/capybara/spec/views/with_hover.erb +24 -0
  257. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  258. data/lib/capybara/spec/views/with_html.erb +208 -0
  259. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  260. data/lib/capybara/spec/views/with_html_entities.erb +2 -0
  261. data/lib/capybara/spec/views/with_js.erb +160 -0
  262. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  263. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  264. data/lib/capybara/spec/views/with_scope.erb +42 -0
  265. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  266. data/lib/capybara/spec/views/with_simple_html.erb +2 -0
  267. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  268. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  269. data/lib/capybara/spec/views/with_title.erb +5 -0
  270. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  271. data/lib/capybara/spec/views/with_windows.erb +54 -0
  272. data/lib/capybara/spec/views/within_frames.erb +15 -0
  273. data/lib/capybara/version.rb +5 -0
  274. data/lib/capybara/window.rb +146 -0
  275. data/spec/basic_node_spec.rb +154 -0
  276. data/spec/capybara_spec.rb +112 -0
  277. data/spec/css_builder_spec.rb +101 -0
  278. data/spec/css_splitter_spec.rb +38 -0
  279. data/spec/dsl_spec.rb +276 -0
  280. data/spec/filter_set_spec.rb +46 -0
  281. data/spec/fixtures/capybara.csv +1 -0
  282. data/spec/fixtures/certificate.pem +25 -0
  283. data/spec/fixtures/key.pem +27 -0
  284. data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  285. data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  286. data/spec/minitest_spec.rb +163 -0
  287. data/spec/minitest_spec_spec.rb +162 -0
  288. data/spec/per_session_config_spec.rb +68 -0
  289. data/spec/rack_test_spec.rb +268 -0
  290. data/spec/regexp_dissassembler_spec.rb +250 -0
  291. data/spec/result_spec.rb +196 -0
  292. data/spec/rspec/features_spec.rb +99 -0
  293. data/spec/rspec/scenarios_spec.rb +19 -0
  294. data/spec/rspec/shared_spec_matchers.rb +947 -0
  295. data/spec/rspec/views_spec.rb +14 -0
  296. data/spec/rspec_matchers_spec.rb +62 -0
  297. data/spec/rspec_spec.rb +145 -0
  298. data/spec/sauce_spec_chrome.rb +43 -0
  299. data/spec/selector_spec.rb +513 -0
  300. data/spec/selenium_spec_chrome.rb +188 -0
  301. data/spec/selenium_spec_chrome_remote.rb +96 -0
  302. data/spec/selenium_spec_edge.rb +47 -0
  303. data/spec/selenium_spec_firefox.rb +208 -0
  304. data/spec/selenium_spec_firefox_remote.rb +80 -0
  305. data/spec/selenium_spec_ie.rb +150 -0
  306. data/spec/selenium_spec_safari.rb +148 -0
  307. data/spec/server_spec.rb +292 -0
  308. data/spec/session_spec.rb +91 -0
  309. data/spec/shared_selenium_node.rb +83 -0
  310. data/spec/shared_selenium_session.rb +476 -0
  311. data/spec/spec_helper.rb +100 -0
  312. data/spec/xpath_builder_spec.rb +93 -0
  313. metadata +753 -0
@@ -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,33 @@
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
+ expect do
29
+ @session.refresh
30
+ sleep 2
31
+ end.to change { extract_results(@session)['post_count'] }.by(1)
32
+ end
33
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#reset_session!' do
4
+ it 'removes cookies from current domain' do
5
+ @session.visit('/set_cookie')
6
+ @session.visit('/get_cookie')
7
+ expect(@session).to have_content('test_cookie')
8
+
9
+ @session.reset_session!
10
+ @session.visit('/get_cookie')
11
+ expect(@session.body).not_to include('test_cookie')
12
+ end
13
+
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
29
+ @session.visit '/foo'
30
+ expect(@session.current_url).not_to be_empty
31
+ expect(@session.current_host).not_to be_empty
32
+ expect(@session.current_path).to eq('/foo')
33
+
34
+ @session.reset_session!
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 }
37
+ expect(@session.current_host).to be_nil
38
+ end
39
+
40
+ it 'resets page body' do
41
+ @session.visit('/with_html')
42
+ expect(@session).to have_content('This is a test')
43
+ expect(@session.find('.//h1').text).to include('This is a test')
44
+
45
+ @session.reset_session!
46
+ expect(@session.body).not_to include('This is a test')
47
+ expect(@session).to have_no_selector('.//h1')
48
+ end
49
+
50
+ it 'is synchronous' do
51
+ @session.visit('/with_slow_unload')
52
+ expect(@session).to have_selector(:css, 'div')
53
+ @session.reset_session!
54
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
55
+ end
56
+
57
+ it 'handles modals during unload', requires: [:modals] do
58
+ @session.visit('/with_unload_alert')
59
+ expect(@session).to have_selector(:css, 'div')
60
+ expect { @session.reset_session! }.not_to raise_error
61
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
62
+ end
63
+
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') }
73
+ expect do
74
+ @session.reset_session!
75
+ end.to raise_error(TestApp::TestAppError)
76
+ @session.visit('/')
77
+ expect(@session.current_path).to eq('/')
78
+ end
79
+
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
+
101
+ before do
102
+ Capybara.reuse_server = false
103
+ end
104
+
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
110
+ Capybara.using_driver(@session.mode) do
111
+ Capybara.using_session(:another_session) do
112
+ another_session = Capybara.current_session
113
+ quietly { another_session.visit('/error') }
114
+ expect do
115
+ another_session.reset_session!
116
+ end.to raise_error(TestApp::TestAppError)
117
+ another_session.visit('/')
118
+ expect(another_session.current_path).to eq('/')
119
+ end
120
+ end
121
+ end
122
+ end
123
+
124
+ it 'raises configured errors caught inside the server', requires: [:server] do
125
+ prev_errors = Capybara.server_errors.dup
126
+
127
+ Capybara.server_errors = [LoadError]
128
+ quietly { @session.visit('/error') }
129
+ expect do
130
+ @session.reset_session!
131
+ end.not_to raise_error
132
+
133
+ quietly { @session.visit('/load_error') }
134
+ expect do
135
+ @session.reset_session!
136
+ end.to raise_error(LoadError)
137
+
138
+ Capybara.server_errors = prev_errors
139
+ end
140
+
141
+ it 'ignores server errors when `Capybara.raise_server_errors = false`', requires: [:server] do
142
+ Capybara.raise_server_errors = false
143
+ quietly { @session.visit('/error') }
144
+ @session.reset_session!
145
+ @session.visit('/')
146
+ expect(@session.current_path).to eq('/')
147
+ end
148
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#status_code' do
4
+ it 'should return response codes', requires: [:status_code] do
5
+ @session.visit('/with_simple_html')
6
+ expect(@session.status_code).to eq(200)
7
+ end
8
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'launchy'
4
+
5
+ Capybara::SpecHelper.spec '#save_and_open_page' do
6
+ before do
7
+ @session.visit '/foo'
8
+ end
9
+
10
+ after do
11
+ Dir.glob('capybara-*.html').each do |file|
12
+ FileUtils.rm(file)
13
+ end
14
+ end
15
+
16
+ it 'sends open method to launchy' do
17
+ allow(Launchy).to receive(:open)
18
+ @session.save_and_open_page
19
+ expect(Launchy).to have_received(:open).with(/capybara-\d+\.html/)
20
+ end
21
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'launchy'
4
+
5
+ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
6
+ before do
7
+ @session.visit '/'
8
+ end
9
+
10
+ it 'opens file from the default directory', requires: [:screenshot] do
11
+ expected_file_regex = /capybara-\d+\.png/
12
+ allow(@session.driver).to receive(:save_screenshot)
13
+ allow(Launchy).to receive(:open)
14
+
15
+ @session.save_and_open_screenshot
16
+
17
+ expect(@session.driver).to have_received(:save_screenshot)
18
+ .with(expected_file_regex, any_args)
19
+ expect(Launchy).to have_received(:open).with(expected_file_regex)
20
+ end
21
+
22
+ it 'opens file from the provided directory', requires: [:screenshot] do
23
+ custom_path = 'screenshots/1.png'
24
+ allow(@session.driver).to receive(:save_screenshot)
25
+ allow(Launchy).to receive(:open)
26
+
27
+ @session.save_and_open_screenshot(custom_path)
28
+
29
+ expect(@session.driver).to have_received(:save_screenshot)
30
+ .with(/#{custom_path}$/, any_args)
31
+ expect(Launchy).to have_received(:open).with(/#{custom_path}$/)
32
+ end
33
+
34
+ context 'when launchy cannot be required' do
35
+ it 'prints out a correct warning message', requires: [:screenshot] do
36
+ file_path = File.join(Dir.tmpdir, 'test.png')
37
+ allow(@session).to receive(:warn)
38
+ allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
39
+ @session.save_and_open_screenshot(file_path)
40
+ expect(@session).to have_received(:warn).with("File saved to #{file_path}.\nPlease install the launchy gem to open the file automatically.")
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#save_page' do
4
+ let(:alternative_path) { File.join(Dir.pwd, 'save_and_open_page_tmp') }
5
+ before do
6
+ @old_save_path = Capybara.save_path
7
+ Capybara.save_path = nil
8
+ @session.visit('/foo')
9
+ end
10
+
11
+ after do
12
+ Capybara.save_path = @old_save_path
13
+ Dir.glob('capybara-*.html').each do |file|
14
+ FileUtils.rm(file)
15
+ end
16
+ FileUtils.rm_rf alternative_path
17
+ end
18
+
19
+ it 'saves the page in the root directory' do
20
+ @session.save_page
21
+ path = Dir.glob('capybara-*.html').first
22
+ expect(File.read(path)).to include('Another World')
23
+ end
24
+
25
+ it 'generates a sensible filename' do
26
+ @session.save_page
27
+ filename = Dir.glob('capybara-*.html').first
28
+ expect(filename).to match(/^capybara-\d+\.html$/)
29
+ end
30
+
31
+ it 'can store files in a specified directory' do
32
+ Capybara.save_path = alternative_path
33
+ @session.save_page
34
+ path = Dir.glob(alternative_path + '/capybara-*.html').first
35
+ expect(File.read(path)).to include('Another World')
36
+ end
37
+
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')
41
+ end
42
+
43
+ it 'can store files in a specified directory with a given filename' do
44
+ Capybara.save_path = alternative_path
45
+ @session.save_page('capybara-001133.html')
46
+ path = alternative_path + '/capybara-001133.html'
47
+ expect(File.read(path)).to include('Another World')
48
+ end
49
+
50
+ it 'can store files in a specified directory with a given relative filename' do
51
+ Capybara.save_path = alternative_path
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')
55
+ end
56
+
57
+ it 'returns an absolute path in pwd' do
58
+ result = @session.save_page
59
+ path = File.expand_path(Dir.glob('capybara-*.html').first, Dir.pwd)
60
+ expect(result).to eq(path)
61
+ end
62
+
63
+ it 'returns an absolute path in given directory' do
64
+ Capybara.save_path = alternative_path
65
+ result = @session.save_page
66
+ path = File.expand_path(Dir.glob(alternative_path + '/capybara-*.html').first, alternative_path)
67
+ expect(result).to eq(path)
68
+ end
69
+
70
+ context 'asset_host contains a string' do
71
+ before { Capybara.asset_host = 'http://example.com' }
72
+
73
+ after { Capybara.asset_host = nil }
74
+
75
+ it 'prepends base tag with value from asset_host to the head' do
76
+ @session.visit('/with_js')
77
+ path = @session.save_page
78
+
79
+ result = File.read(path)
80
+ expect(result).to include("<head><base href='http://example.com' />")
81
+ end
82
+
83
+ it "doesn't prepend base tag to pages when asset_host is nil" do
84
+ Capybara.asset_host = nil
85
+ @session.visit('/with_js')
86
+ path = @session.save_page
87
+
88
+ result = File.read(path)
89
+ expect(result).to include('<html')
90
+ expect(result).not_to include('http://example.com')
91
+ end
92
+
93
+ it "doesn't prepend base tag to pages which already have it" do
94
+ @session.visit('/with_base_tag')
95
+ path = @session.save_page
96
+
97
+ result = File.read(path)
98
+ expect(result).to include('<html')
99
+ expect(result).not_to include('http://example.com')
100
+ end
101
+
102
+ it 'executes successfully even if the page is missing a <head>' do
103
+ @session.visit('/with_simple_html')
104
+ path = @session.save_page
105
+
106
+ result = File.read(path)
107
+ expect(result).to include('Bar')
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
4
+ let(:alternative_path) { File.join(Dir.pwd, 'save_screenshot_tmp') }
5
+ before do
6
+ @old_save_path = Capybara.save_path
7
+ Capybara.save_path = nil
8
+ @session.visit '/foo'
9
+ end
10
+
11
+ after do
12
+ Capybara.save_path = @old_save_path
13
+ FileUtils.rm_rf alternative_path
14
+ end
15
+
16
+ it 'generates sensible filename' do
17
+ allow(@session.driver).to receive(:save_screenshot)
18
+
19
+ @session.save_screenshot
20
+
21
+ regexp = Regexp.new(File.join(Dir.pwd, 'capybara-\d+\.png'))
22
+ expect(@session.driver).to have_received(:save_screenshot).with(regexp, any_args)
23
+ end
24
+
25
+ it 'allows to specify another path' do
26
+ allow(@session.driver).to receive(:save_screenshot)
27
+
28
+ custom_path = 'screenshots/1.png'
29
+ @session.save_screenshot(custom_path)
30
+
31
+ expect(@session.driver).to have_received(:save_screenshot).with(/#{custom_path}$/, any_args)
32
+ end
33
+
34
+ context 'with Capybara.save_path' do
35
+ it 'file is generated in the correct location' do
36
+ Capybara.save_path = alternative_path
37
+ allow(@session.driver).to receive(:save_screenshot)
38
+
39
+ @session.save_screenshot
40
+
41
+ regexp = Regexp.new(File.join(alternative_path, 'capybara-\d+\.png'))
42
+ expect(@session.driver).to have_received(:save_screenshot).with(regexp, any_args)
43
+ end
44
+
45
+ it 'relative paths are relative to save_path' do
46
+ Capybara.save_path = alternative_path
47
+ allow(@session.driver).to receive(:save_screenshot)
48
+
49
+ custom_path = 'screenshots/2.png'
50
+ @session.save_screenshot(custom_path)
51
+
52
+ expect(@session.driver).to have_received(:save_screenshot).with(File.expand_path(custom_path, alternative_path), any_args)
53
+ end
54
+ end
55
+ end