capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  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 +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  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 +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  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 +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  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 +85 -8
  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 +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  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 +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  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 +460 -170
  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 +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  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 +126 -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 +135 -44
  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.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → 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 +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  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.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -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 +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  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 +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  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 +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  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.rb → 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 +958 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
  199. data/lib/capybara/spec/session/{response_code.rb → 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 +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  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 +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +46 -11
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -1,21 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Capybara::SpecHelper.spec "#to_capybara_node" do
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
4
9
  before do
5
10
  @session.visit('/with_html')
6
11
  end
7
12
 
8
- class NodeWrapper
9
- def initialize(element); @element = element end
10
- def to_capybara_node(); @element end
11
- end
12
-
13
- it "should support have_xxx expectations" do
13
+ it 'should support have_xxx expectations' do
14
14
  para = NodeWrapper.new(@session.find(:css, '#first'))
15
- expect(para).to have_link("ullamco")
15
+ expect(para).to have_link('ullamco')
16
16
  end
17
17
 
18
- it "should support within" do
18
+ it 'should support within' do
19
19
  para = NodeWrapper.new(@session.find(:css, '#first'))
20
20
  expect(@session).to have_css('#second')
21
21
  @session.within(para) do
@@ -24,13 +24,16 @@ Capybara::SpecHelper.spec "#to_capybara_node" do
24
24
  end
25
25
  end
26
26
 
27
- it "should generate correct errors" do
27
+ it 'should generate correct errors' do
28
28
  para = NodeWrapper.new(@session.find(:css, '#first'))
29
29
  expect do
30
- expect(para).to have_text("Header Class Test One")
30
+ expect(para).to have_text('Header Class Test One')
31
31
  end.to raise_error(/^expected to find text "Header Class Test One" in "Lore/)
32
32
  expect do
33
33
  expect(para).to have_css('#second')
34
- end.to raise_error(/^expected to find visible css "#second" within #<Capybara::Node::Element/)
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 with href matching /\\/without_simple_html/ within #<Capybara::Node::Element})
35
38
  end
36
39
  end
@@ -1,7 +1,11 @@
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 '#refresh' do
4
- it "reload the page" do
8
+ it 'reload the page' do
5
9
  @session.visit('/form')
6
10
  expect(@session).to have_select('form_locale', selected: 'English')
7
11
  @session.select('Swedish', from: 'form_locale')
@@ -10,20 +14,18 @@ Capybara::SpecHelper.spec '#refresh' do
10
14
  expect(@session).to have_select('form_locale', selected: 'English')
11
15
  end
12
16
 
13
- it "raises any errors caught inside the server", requires: [:server] do
14
- quietly { @session.visit("/error") }
17
+ it 'raises any errors caught inside the server', requires: [:server] do
18
+ quietly { @session.visit('/error') }
15
19
  expect do
16
20
  @session.refresh
17
21
  end.to raise_error(TestApp::TestAppError)
18
22
  end
19
23
 
20
- it "it reposts" do
21
- if marionette?(@session) || edge?(@session) || ie?(@session)
22
- skip "Firefox and Edge insist on prompting without providing a way to suppress"
23
- end
24
+ it 'it reposts' do
24
25
  @session.visit('/form')
25
26
  @session.select('Sweden', from: 'form_region')
26
27
  @session.click_button('awesome')
28
+ sleep 2
27
29
  expect do
28
30
  @session.refresh
29
31
  sleep 2
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#reset_session!' do
4
- it "removes cookies" do
4
+ it 'removes cookies from current domain' do
5
5
  @session.visit('/set_cookie')
6
6
  @session.visit('/get_cookie')
7
7
  expect(@session).to have_content('test_cookie')
@@ -11,19 +11,33 @@ Capybara::SpecHelper.spec '#reset_session!' do
11
11
  expect(@session.body).not_to include('test_cookie')
12
12
  end
13
13
 
14
- 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
15
29
  @session.visit '/foo'
16
30
  expect(@session.current_url).not_to be_empty
17
31
  expect(@session.current_host).not_to be_empty
18
32
  expect(@session.current_path).to eq('/foo')
19
33
 
20
34
  @session.reset_session!
21
- expect([nil, '', 'about:blank']).to include(@session.current_url)
22
- 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 }
23
37
  expect(@session.current_host).to be_nil
24
38
  end
25
39
 
26
- it "resets page body" do
40
+ it 'resets page body' do
27
41
  @session.visit('/with_html')
28
42
  expect(@session).to have_content('This is a test')
29
43
  expect(@session.find('.//h1').text).to include('This is a test')
@@ -33,37 +47,37 @@ Capybara::SpecHelper.spec '#reset_session!' do
33
47
  expect(@session).to have_no_selector('.//h1')
34
48
  end
35
49
 
36
- it "is synchronous" do
37
- @session.visit("/with_slow_unload")
50
+ it 'is synchronous' do
51
+ @session.visit('/with_slow_unload')
38
52
  expect(@session).to have_selector(:css, 'div')
39
53
  @session.reset_session!
40
- expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
54
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
41
55
  end
42
56
 
43
- it "handles modals during unload", requires: [:modals] do
57
+ it 'handles modals during unload', requires: [:modals] do
44
58
  @session.visit('/with_unload_alert')
45
59
  expect(@session).to have_selector(:css, 'div')
46
60
  expect { @session.reset_session! }.not_to raise_error
47
- expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
61
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
48
62
  end
49
63
 
50
- it "handles already open modals", requires: [:modals] do
64
+ it 'handles already open modals', requires: [:modals] do
51
65
  @session.visit('/with_unload_alert')
52
66
  @session.click_link('Go away')
53
67
  expect { @session.reset_session! }.not_to raise_error
54
- expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
68
+ expect(@session).to have_no_selector :xpath, '/html/body/*', wait: false
55
69
  end
56
70
 
57
- it "raises any standard errors caught inside the server", requires: [:server] do
58
- quietly { @session.visit("/error") }
71
+ it 'raises any standard errors caught inside the server', requires: [:server] do
72
+ quietly { @session.visit('/error') }
59
73
  expect do
60
74
  @session.reset_session!
61
75
  end.to raise_error(TestApp::TestAppError)
62
- @session.visit("/")
63
- expect(@session.current_path).to eq("/")
76
+ @session.visit('/')
77
+ expect(@session.current_path).to eq('/')
64
78
  end
65
79
 
66
- it "closes extra windows", requires: [:windows] do
80
+ it 'closes extra windows', requires: [:windows] do
67
81
  @session.visit('/with_html')
68
82
  @session.open_new_window
69
83
  @session.open_new_window
@@ -72,7 +86,7 @@ Capybara::SpecHelper.spec '#reset_session!' do
72
86
  expect(@session.windows.size).to eq 1
73
87
  end
74
88
 
75
- it "closes extra windows when not on the first window", requires: [:windows] do
89
+ it 'closes extra windows when not on the first window', requires: [:windows] do
76
90
  @session.visit('/with_html')
77
91
  @session.switch_to_window(@session.open_new_window)
78
92
  @session.open_new_window
@@ -81,41 +95,55 @@ Capybara::SpecHelper.spec '#reset_session!' do
81
95
  expect(@session.windows.size).to eq 1
82
96
  end
83
97
 
84
- context "When reuse_server == false" do
98
+ it 'does not block opening a new window after a frame was switched to and not switched back', requires: [:windows] do
99
+ @session.visit('/with_iframe?id=test_iframe&url=/')
100
+ @session.switch_to_frame(@session.find(:frame, 'test_iframe'))
101
+ within_window_test = lambda do
102
+ @session.within_window(@session.open_new_window) do
103
+ @session.visit('/')
104
+ end
105
+ end
106
+ expect(&within_window_test).to raise_error(Capybara::ScopeError)
107
+ @session.reset_session!
108
+ expect(&within_window_test).not_to raise_error
109
+ end
110
+
111
+ context 'When reuse_server == false' do
112
+ let!(:orig_reuse_server) { Capybara.reuse_server }
113
+
85
114
  before do
86
- @reuse_server = Capybara.reuse_server
87
115
  Capybara.reuse_server = false
88
116
  end
89
117
 
90
- it "raises any standard errors caught inside the server during a second session", requires: [:server] do
118
+ after do
119
+ Capybara.reuse_server = orig_reuse_server
120
+ end
121
+
122
+ it 'raises any standard errors caught inside the server during a second session', requires: [:server] do
91
123
  Capybara.using_driver(@session.mode) do
92
124
  Capybara.using_session(:another_session) do
93
- @another_session = Capybara.current_session
94
- quietly { @another_session.visit("/error") }
125
+ another_session = Capybara.current_session
126
+ quietly { another_session.visit('/error') }
95
127
  expect do
96
- @another_session.reset_session!
128
+ another_session.reset_session!
97
129
  end.to raise_error(TestApp::TestAppError)
98
- @another_session.visit("/")
99
- expect(@another_session.current_path).to eq("/")
130
+ another_session.visit('/')
131
+ expect(another_session.current_path).to eq('/')
100
132
  end
101
133
  end
102
134
  end
103
-
104
- after do
105
- Capybara.reuse_server = @reuse_server
106
- end
107
135
  end
108
136
 
109
- it "raises configured errors caught inside the server", requires: [:server] do
137
+ it 'raises configured errors caught inside the server', requires: [:server] do
110
138
  prev_errors = Capybara.server_errors.dup
111
139
 
112
140
  Capybara.server_errors = [LoadError]
113
- quietly { @session.visit("/error") }
141
+ quietly { @session.visit('/error') }
114
142
  expect do
115
143
  @session.reset_session!
116
144
  end.not_to raise_error
117
145
 
118
- quietly { @session.visit("/load_error") }
146
+ quietly { @session.visit('/load_error') }
119
147
  expect do
120
148
  @session.reset_session!
121
149
  end.to raise_error(LoadError)
@@ -123,11 +151,11 @@ Capybara::SpecHelper.spec '#reset_session!' do
123
151
  Capybara.server_errors = prev_errors
124
152
  end
125
153
 
126
- it "ignores server errors when `Capybara.raise_server_errors = false`", requires: [:server] do
154
+ it 'ignores server errors when `Capybara.raise_server_errors = false`', requires: [:server] do
127
155
  Capybara.raise_server_errors = false
128
- quietly { @session.visit("/error") }
156
+ quietly { @session.visit('/error') }
129
157
  @session.reset_session!
130
- @session.visit("/")
131
- expect(@session.current_path).to eq("/")
158
+ @session.visit('/')
159
+ expect(@session.current_path).to eq('/')
132
160
  end
133
161
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#status_code' do
4
- it "should return response codes", requires: [:status_code] do
4
+ it 'should return response codes', requires: [:status_code] do
5
5
  @session.visit('/with_simple_html')
6
6
  expect(@session.status_code).to eq(200)
7
7
  end
@@ -8,12 +8,12 @@ Capybara::SpecHelper.spec '#save_and_open_page' do
8
8
  end
9
9
 
10
10
  after do
11
- Dir.glob("capybara-*.html").each do |file|
11
+ Dir.glob('capybara-*.html').each do |file|
12
12
  FileUtils.rm(file)
13
13
  end
14
14
  end
15
15
 
16
- it "sends open method to launchy" do
16
+ it 'sends open method to launchy' do
17
17
  allow(Launchy).to receive(:open)
18
18
  @session.save_and_open_page
19
19
  expect(Launchy).to have_received(:open).with(/capybara-\d+\.html/)
@@ -8,14 +8,14 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
8
8
  end
9
9
 
10
10
  it 'opens file from the default directory', requires: [:screenshot] do
11
- expected_file_regex = %r{capybara-\d+\.png}
11
+ expected_file_regex = /capybara-\d+\.png/
12
12
  allow(@session.driver).to receive(:save_screenshot)
13
13
  allow(Launchy).to receive(:open)
14
14
 
15
15
  @session.save_and_open_screenshot
16
16
 
17
17
  expect(@session.driver).to have_received(:save_screenshot)
18
- .with(expected_file_regex, {})
18
+ .with(expected_file_regex, any_args)
19
19
  expect(Launchy).to have_received(:open).with(expected_file_regex)
20
20
  end
21
21
 
@@ -27,16 +27,17 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
27
27
  @session.save_and_open_screenshot(custom_path)
28
28
 
29
29
  expect(@session.driver).to have_received(:save_screenshot)
30
- .with(/#{custom_path}$/, {})
30
+ .with(/#{custom_path}$/, any_args)
31
31
  expect(Launchy).to have_received(:open).with(/#{custom_path}$/)
32
32
  end
33
33
 
34
34
  context 'when launchy cannot be required' do
35
35
  it 'prints out a correct warning message', requires: [:screenshot] do
36
36
  file_path = File.join(Dir.tmpdir, 'test.png')
37
+ allow(@session).to receive(:warn)
37
38
  allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
38
- expect(@session).to receive(:warn).with("File saved to #{file_path}.\nPlease install the launchy gem to open the file automatically.")
39
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.")
40
41
  end
41
42
  end
42
43
  end
@@ -1,76 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#save_page' do
4
- 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') }
5
5
  before do
6
- @session.visit("/foo")
6
+ @old_save_path = Capybara.save_path
7
+ Capybara.save_path = nil
8
+ @session.visit('/foo')
7
9
  end
8
10
 
9
11
  after do
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,29 +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")
107
+ expect(result).to include('Bar')
105
108
  end
106
109
  end
107
110
  end
@@ -1,53 +1,55 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
4
- let(:alternative_path) { File.join(Dir.pwd, "save_screenshot_tmp") }
4
+ let(:alternative_path) { File.join(Dir.pwd, 'save_screenshot_tmp') }
5
5
  before do
6
+ @old_save_path = Capybara.save_path
7
+ Capybara.save_path = nil
6
8
  @session.visit '/foo'
7
9
  end
8
10
 
9
11
  after do
10
- Capybara.save_path = nil
12
+ Capybara.save_path = @old_save_path
11
13
  FileUtils.rm_rf alternative_path
12
14
  end
13
15
 
14
- it "generates sensible filename" do
16
+ it 'generates sensible filename' do
15
17
  allow(@session.driver).to receive(:save_screenshot)
16
18
 
17
19
  @session.save_screenshot
18
20
 
19
21
  regexp = Regexp.new(File.join(Dir.pwd, 'capybara-\d+\.png'))
20
- expect(@session.driver).to have_received(:save_screenshot).with(regexp, {})
22
+ expect(@session.driver).to have_received(:save_screenshot).with(regexp, any_args)
21
23
  end
22
24
 
23
- it "allows to specify another path" do
25
+ it 'allows to specify another path' do
24
26
  allow(@session.driver).to receive(:save_screenshot)
25
27
 
26
28
  custom_path = 'screenshots/1.png'
27
29
  @session.save_screenshot(custom_path)
28
30
 
29
- expect(@session.driver).to have_received(:save_screenshot).with(/#{custom_path}$/, {})
31
+ expect(@session.driver).to have_received(:save_screenshot).with(/#{custom_path}$/, any_args)
30
32
  end
31
33
 
32
- context "with Capybara.save_path" do
33
- it "file is generated in the correct location" do
34
+ context 'with Capybara.save_path' do
35
+ it 'file is generated in the correct location' do
34
36
  Capybara.save_path = alternative_path
35
37
  allow(@session.driver).to receive(:save_screenshot)
36
38
 
37
39
  @session.save_screenshot
38
40
 
39
41
  regexp = Regexp.new(File.join(alternative_path, 'capybara-\d+\.png'))
40
- expect(@session.driver).to have_received(:save_screenshot).with(regexp, {})
42
+ expect(@session.driver).to have_received(:save_screenshot).with(regexp, any_args)
41
43
  end
42
44
 
43
- it "relative paths are relative to save_path" do
45
+ it 'relative paths are relative to save_path' do
44
46
  Capybara.save_path = alternative_path
45
47
  allow(@session.driver).to receive(:save_screenshot)
46
48
 
47
49
  custom_path = 'screenshots/2.png'
48
50
  @session.save_screenshot(custom_path)
49
51
 
50
- expect(@session.driver).to have_received(:save_screenshot).with(File.expand_path(custom_path, alternative_path), {})
52
+ expect(@session.driver).to have_received(:save_screenshot).with(File.expand_path(custom_path, alternative_path), any_args)
51
53
  end
52
54
  end
53
55
  end
@@ -1,14 +1,14 @@
1
1
  # coding: US-ASCII
2
2
  # frozen_string_literal: true
3
3
 
4
- Capybara::SpecHelper.spec "#save_screenshot" do
4
+ Capybara::SpecHelper.spec '#save_screenshot' do
5
5
  let(:image_path) { File.join(Dir.tmpdir, 'capybara-screenshot.png') }
6
6
 
7
7
  before do
8
8
  @session.visit '/'
9
9
  end
10
10
 
11
- it "should generate PNG file", requires: [:screenshot] do
11
+ it 'should generate PNG file', requires: [:screenshot] do
12
12
  path = @session.save_screenshot image_path
13
13
 
14
14
  magic = File.read(image_path, 4)