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
@@ -1,25 +1,26 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#current_scope' do
3
4
  before do
4
5
  @session.visit('/with_scope')
5
6
  end
6
-
7
- context "when not in a #within block" do
8
- it "should return the document" do
7
+
8
+ context 'when not in a #within block' do
9
+ it 'should return the document' do
9
10
  expect(@session.current_scope).to be_kind_of Capybara::Node::Document
10
11
  end
11
12
  end
12
-
13
- context "when in a #within block" do
14
- it "should return the element in scope" do
15
- @session.within(:css, "#simple_first_name") do
13
+
14
+ context 'when in a #within block' do
15
+ it 'should return the element in scope' do
16
+ @session.within(:css, '#simple_first_name') do
16
17
  expect(@session.current_scope[:name]).to eq 'first_name'
17
18
  end
18
19
  end
19
20
  end
20
-
21
- context "when in a nested #within block" do
22
- it "should return the element in scope" do
21
+
22
+ context 'when in a nested #within block' do
23
+ it 'should return the element in scope' do
23
24
  @session.within("//div[@id='for_bar']") do
24
25
  @session.within(".//input[@value='Peter']") do
25
26
  expect(@session.current_scope[:name]).to eq 'form[first_name]'
@@ -1,43 +1,42 @@
1
1
  # frozen_string_literal: true
2
- require "capybara/spec/test_app"
2
+
3
+ require 'capybara/spec/test_app'
3
4
 
4
5
  Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
5
- before :all do
6
- @servers = 2.times.map { Capybara::Server.new(TestApp.clone).boot }
6
+ before :all do # rubocop:disable RSpec/BeforeAfterAll
7
+ @servers = Array.new(2) { Capybara::Server.new(TestApp.new).boot }
7
8
  # sanity check
8
- expect(@servers[0].port).not_to eq(@servers[1].port)
9
- expect(@servers.map { |s| s.port }).not_to include 80
9
+ expect(@servers[0].port).not_to eq(@servers[1].port) # rubocop:disable RSpec/ExpectInHook
10
+ expect(@servers.map(&:port)).not_to include 80 # rubocop:disable RSpec/ExpectInHook
10
11
  end
11
12
 
12
13
  def bases
13
14
  @servers.map { |s| "http://#{s.host}:#{s.port}" }
14
15
  end
15
16
 
16
- def should_be_on server_index, path="/host", scheme="http"
17
- #This delay is to give fully async drivers (selenium w/chromedriver) time for the browser
18
- #to get to its destination - should be removed when we have a waiting current_url matcher
19
- sleep 0.1 # remove and adjust tests when a waiting current_url/path matcher is implemented
17
+ def should_be_on(server_index, path = '/host', scheme = 'http')
20
18
  # Check that we are on /host on the given server
21
19
  s = @servers[server_index]
20
+
21
+ expect(@session).to have_current_path("#{scheme}://#{s.host}:#{s.port}#{path}", url: true)
22
+
22
23
  expect(@session.current_url.chomp('?')).to eq("#{scheme}://#{s.host}:#{s.port}#{path}")
23
24
  expect(@session.current_host).to eq("#{scheme}://#{s.host}") # no port
24
- expect(@session.current_path).to eq(path)
25
- if path == '/host'
26
- # Server should agree with us
27
- expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}")
28
- end
25
+ expect(@session.current_path).to eq(path.split('#')[0])
26
+ # Server should agree with us
27
+ expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}") if path == '/host'
29
28
  end
30
29
 
31
30
  def visit_host_links
32
31
  @session.visit("#{bases[0]}/host_links?absolute_host=#{bases[1]}")
33
32
  end
34
33
 
35
- it "is affected by visiting a page directly" do
34
+ it 'is affected by visiting a page directly' do
36
35
  @session.visit("#{bases[0]}/host")
37
36
  should_be_on 0
38
37
  end
39
38
 
40
- it "returns to the app host when visiting a relative url" do
39
+ it 'returns to the app host when visiting a relative url' do
41
40
  Capybara.app_host = bases[1]
42
41
  @session.visit("#{bases[0]}/host")
43
42
  should_be_on 0
@@ -46,54 +45,81 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
46
45
  Capybara.app_host = nil
47
46
  end
48
47
 
49
- it "is affected by setting Capybara.app_host" do
48
+ it 'is affected by setting Capybara.app_host' do
50
49
  Capybara.app_host = bases[0]
51
- @session.visit("/host")
50
+ @session.visit('/host')
52
51
  should_be_on 0
53
52
  Capybara.app_host = bases[1]
54
- @session.visit("/host")
53
+ @session.visit('/host')
55
54
  should_be_on 1
56
55
  Capybara.app_host = nil
57
56
  end
58
57
 
59
- it "is unaffected by following a relative link" do
58
+ it 'is unaffected by following a relative link' do
60
59
  visit_host_links
61
- @session.click_link("Relative Host")
60
+ @session.click_link('Relative Host')
62
61
  should_be_on 0
63
62
  end
64
63
 
65
- it "is affected by following an absolute link" do
64
+ it 'is affected by following an absolute link' do
66
65
  visit_host_links
67
- @session.click_link("Absolute Host")
66
+ @session.click_link('Absolute Host')
68
67
  should_be_on 1
69
68
  end
70
69
 
71
- it "is unaffected by posting through a relative form" do
70
+ it 'is unaffected by posting through a relative form' do
72
71
  visit_host_links
73
- @session.click_button("Relative Host")
72
+ @session.click_button('Relative Host')
74
73
  should_be_on 0
75
74
  end
76
75
 
77
- it "is affected by posting through an absolute form" do
76
+ it 'is affected by posting through an absolute form' do
78
77
  visit_host_links
79
- @session.click_button("Absolute Host")
78
+ @session.click_button('Absolute Host')
80
79
  should_be_on 1
81
80
  end
82
81
 
83
- it "is affected by following a redirect" do
82
+ it 'is affected by following a redirect' do
84
83
  @session.visit("#{bases[0]}/redirect")
85
- should_be_on 0, "/landed"
84
+ should_be_on 0, '/landed'
85
+ end
86
+
87
+ it 'maintains fragment' do
88
+ @session.visit("#{bases[0]}/redirect#fragment")
89
+ should_be_on 0, '/landed#fragment'
86
90
  end
87
91
 
88
- it "is affected by pushState", :requires => [:js] do
89
- @session.visit("/with_js")
92
+ it 'redirects to a fragment' do
93
+ @session.visit("#{bases[0]}/redirect_with_fragment")
94
+ should_be_on 0, '/landed#with_fragment'
95
+ end
96
+
97
+ it 'is affected by pushState', requires: [:js] do
98
+ @session.visit('/with_js')
90
99
  @session.execute_script("window.history.pushState({}, '', '/pushed')")
91
- expect(@session.current_path).to eq("/pushed")
100
+ expect(@session.current_path).to eq('/pushed')
92
101
  end
93
102
 
94
- it "is affected by replaceState", :requires => [:js] do
95
- @session.visit("/with_js")
103
+ it 'is affected by replaceState', requires: [:js] do
104
+ @session.visit('/with_js')
96
105
  @session.execute_script("window.history.replaceState({}, '', '/replaced')")
97
- expect(@session.current_path).to eq("/replaced")
106
+ expect(@session.current_path).to eq('/replaced')
107
+ end
108
+
109
+ it "doesn't raise exception on a nil current_url", requires: [:driver] do
110
+ allow(@session.driver).to receive(:current_url).and_return(nil)
111
+ @session.visit('/')
112
+ expect { @session.current_url }.not_to raise_exception
113
+ expect { @session.current_path }.not_to raise_exception
114
+ end
115
+
116
+ context 'within iframe', requires: [:frames] do
117
+ it 'should get the url of the top level browsing context' do
118
+ @session.visit('/within_frames')
119
+ expect(@session.current_url).to match(/within_frames\z/)
120
+ @session.within_frame('frameOne') do
121
+ expect(@session.current_url).to match(/within_frames\z/)
122
+ end
123
+ end
98
124
  end
99
125
  end
@@ -1,23 +1,24 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#dismiss_confirm', :requires => [:modals] do
2
+
3
+ Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should dismiss the confirm" do
8
+ it 'should dismiss the confirm' do
8
9
  @session.dismiss_confirm do
9
10
  @session.click_link('Open confirm')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
12
13
  end
13
-
14
- it "should dismiss the confirm if the message matches" do
14
+
15
+ it 'should dismiss the confirm if the message matches' do
15
16
  @session.dismiss_confirm 'Confirm opened' do
16
17
  @session.click_link('Open confirm')
17
18
  end
18
19
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
19
20
  end
20
-
21
+
21
22
  it "should not dismiss the confirm if the message doesn't match" do
22
23
  expect do
23
24
  @session.dismiss_confirm 'Incorrect Text' do
@@ -25,9 +26,8 @@ Capybara::SpecHelper.spec '#dismiss_confirm', :requires => [:modals] do
25
26
  end
26
27
  end.to raise_error(Capybara::ModalNotFound)
27
28
  end
28
-
29
29
 
30
- it "should return the message presented" do
30
+ it 'should return the message presented' do
31
31
  message = @session.dismiss_confirm do
32
32
  @session.click_link('Open confirm')
33
33
  end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#dismiss_prompt', :requires => [:modals] do
2
+
3
+ Capybara::SpecHelper.spec '#dismiss_prompt', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should dismiss the prompt" do
8
+ it 'should dismiss the prompt' do
8
9
  @session.dismiss_prompt do
9
10
  @session.click_link('Open prompt')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='dismissed']")
12
13
  end
13
-
14
- it "should return the message presented" do
14
+
15
+ it 'should return the message presented' do
15
16
  message = @session.dismiss_prompt do
16
17
  @session.click_link('Open prompt')
17
18
  end
@@ -1,22 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#assert_matches_selector' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  @element = @session.find(:css, 'span', text: '42')
5
7
  end
6
8
 
7
- it "should be true if the given selector matches the element" do
9
+ it 'should be true if the given selector matches the element' do
8
10
  expect(@element.assert_matches_selector(:css, '.number')).to be true
9
11
  end
10
12
 
11
- it "should be false if the given selector does not match the element" do
13
+ it 'should be false if the given selector does not match the element' do
12
14
  expect { @element.assert_matches_selector(:css, '.not_number') }.to raise_error(Capybara::ElementNotFound)
13
15
  end
14
16
 
15
- it "should not be callable on the session" do
17
+ it 'should not be callable on the session' do
16
18
  expect { @session.assert_matches_selector(:css, '.number') }.to raise_error(NoMethodError)
17
19
  end
18
20
 
19
- it "should wait for match to occur", requires: [:js] do
21
+ it 'should wait for match to occur', requires: [:js] do
20
22
  @session.visit('/with_js')
21
23
  input = @session.find(:css, '#disable-on-click')
22
24
 
@@ -25,7 +27,12 @@ Capybara::SpecHelper.spec '#assert_matches_selector' do
25
27
  expect(input.assert_matches_selector(:css, 'input:disabled')).to be true
26
28
  end
27
29
 
28
- it "should not accept count options" do
29
- expect { @element.assert_matches_selector(:css, '.number', count: 1) }.to raise_error(ArgumentError)
30
+ it 'should not accept count options' do
31
+ expect { @element.assert_matches_selector(:css, '.number', count: 1) }.to raise_error(ArgumentError, /count/)
32
+ end
33
+
34
+ it 'should accept a filter block' do
35
+ @element.assert_matches_selector(:css, 'span') { |el| el[:class] == 'number' }
36
+ @element.assert_not_matches_selector(:css, 'span') { |el| el[:class] == 'not_number' }
30
37
  end
31
38
  end
@@ -1,17 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#match_css?' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  @element = @session.find(:css, 'span', text: '42')
5
7
  end
6
8
 
7
- it "should be true if the given selector matches the element" do
8
- expect(@element).to match_css("span")
9
- expect(@element).to match_css("span.number")
9
+ it 'should be true if the given selector matches the element' do
10
+ expect(@element).to match_css('span')
11
+ expect(@element).to match_css('span.number')
12
+ end
13
+
14
+ it 'should be false if the given selector does not match' do
15
+ expect(@element).not_to match_css('div')
16
+ expect(@element).not_to match_css('p a#doesnotexist')
17
+ expect(@element).not_to match_css('p.nosuchclass')
18
+ end
19
+
20
+ it 'should accept an optional filter block' do
21
+ # This would be better done with
22
+ expect(@element).to match_css('span') { |el| el[:class] == 'number' }
23
+ expect(@element).not_to match_css('span') { |el| el[:class] == 'not_number' }
10
24
  end
11
25
 
12
- it "should be false if the given selector does not match" do
13
- expect(@element).not_to match_css("div")
14
- expect(@element).not_to match_css("p a#doesnotexist")
15
- expect(@element).not_to match_css("p.nosuchclass")
26
+ it 'should work with root element found via ancestor' do
27
+ el = @session.find(:css, 'body').find(:xpath, '..')
28
+ expect(el).to match_css('html')
29
+ expect { expect(el).to not_match_css('html') }.to raise_exception(RSpec::Expectations::ExpectationNotMetError)
16
30
  end
17
31
  end
@@ -1,23 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#match_xpath?' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  @element = @session.find(:css, 'span.number')
5
7
  end
6
8
 
7
- it "should be true if the given selector is on the page" do
8
- expect(@element).to match_xpath("//span")
9
+ it 'should be true if the given selector is on the page' do
10
+ expect(@element).to match_xpath('//span')
9
11
  expect(@element).to match_xpath("//span[@class='number']")
10
12
  end
11
13
 
12
- it "should be false if the given selector is not on the page" do
13
- expect(@element).not_to match_xpath("//abbr")
14
- expect(@element).not_to match_xpath("//div")
14
+ it 'should be false if the given selector is not on the page' do
15
+ expect(@element).not_to match_xpath('//abbr')
16
+ expect(@element).not_to match_xpath('//div')
15
17
  expect(@element).not_to match_xpath("//span[@class='not_a_number']")
16
18
  end
17
19
 
18
- it "should use xpath even if default selector is CSS" do
20
+ it 'should use xpath even if default selector is CSS' do
19
21
  Capybara.default_selector = :css
20
22
  expect(@element).not_to have_xpath("//span[@class='not_a_number']")
21
23
  expect(@element).not_to have_xpath("//div[@class='number']")
22
24
  end
23
- end
25
+ end
@@ -1,63 +1,120 @@
1
- Capybara::SpecHelper.spec '#match_xpath?' do
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#match_selector?' do
4
+ let(:element) { @session.find(:xpath, '//span', text: '42') }
5
+
2
6
  before do
3
7
  @session.visit('/with_html')
4
- @element = @session.find('//span', text: '42')
5
8
  end
6
9
 
7
- it "should be true if the element matches the given selector" do
8
- expect(@element).to match_selector(:xpath, "//span")
9
- expect(@element).to match_selector(:css, 'span.number')
10
- expect(@element.matches_selector?(:css, 'span.number')).to be true
10
+ it 'should be true if the element matches the given selector' do
11
+ expect(element).to match_selector(:xpath, '//span')
12
+ expect(element).to match_selector(:css, 'span.number')
13
+ expect(element.matches_selector?(:css, 'span.number')).to be true
11
14
  end
12
15
 
13
- it "should be false if the element does not match the given selector" do
14
- expect(@element).not_to match_selector(:xpath, "//div")
15
- expect(@element).not_to match_selector(:css, "span.not_a_number")
16
- expect(@element.matches_selector?(:css, "span.not_a_number")).to be false
16
+ it 'should be false if the element does not match the given selector' do
17
+ expect(element).not_to match_selector(:xpath, '//div')
18
+ expect(element).not_to match_selector(:css, 'span.not_a_number')
19
+ expect(element.matches_selector?(:css, 'span.not_a_number')).to be false
17
20
  end
18
21
 
19
- it "should use default selector" do
22
+ it 'should use default selector' do
20
23
  Capybara.default_selector = :css
21
- expect(@element).not_to match_selector("span.not_a_number")
22
- expect(@element).to match_selector("span.number")
24
+ expect(element).not_to match_selector('span.not_a_number')
25
+ expect(element).to match_selector('span.number')
26
+ end
27
+
28
+ it 'should work with elements located via a sibling selector' do
29
+ sibling = element.sibling(:css, 'span', text: 'Other span')
30
+ expect(sibling).to match_selector(:xpath, '//span')
31
+ expect(sibling).to match_selector(:css, 'span')
32
+ end
33
+
34
+ it 'should work with the html element' do
35
+ html = @session.find('/html')
36
+ expect(html).to match_selector(:css, 'html')
23
37
  end
24
38
 
25
- context "with text" do
26
- it "should discard all matches where the given string is not contained" do
27
- expect(@element).to match_selector("//span", :text => "42")
28
- expect(@element).not_to match_selector("//span", :text => "Doesnotexist")
39
+ context 'with text' do
40
+ it 'should discard all matches where the given string is not contained' do
41
+ expect(element).to match_selector('//span', text: '42')
42
+ expect(element).not_to match_selector('//span', text: 'Doesnotexist')
29
43
  end
30
44
  end
45
+
46
+ it 'should have css sugar' do
47
+ expect(element.matches_css?('span.number')).to be true
48
+ expect(element.matches_css?('span.not_a_number')).to be false
49
+ expect(element.matches_css?('span.number', text: '42')).to be true
50
+ expect(element.matches_css?('span.number', text: 'Nope')).to be false
51
+ end
52
+
53
+ it 'should have xpath sugar' do
54
+ expect(element.matches_xpath?('//span')).to be true
55
+ expect(element.matches_xpath?('//div')).to be false
56
+ expect(element.matches_xpath?('//span', text: '42')).to be true
57
+ expect(element.matches_xpath?('//span', text: 'Nope')).to be false
58
+ end
59
+
60
+ it 'should accept selector filters' do
61
+ @session.visit('/form')
62
+ cbox = @session.find(:css, '#form_pets_dog')
63
+ expect(cbox.matches_selector?(:checkbox, id: 'form_pets_dog', option: 'dog', name: 'form[pets][]', checked: true)).to be true
64
+ end
65
+
66
+ it 'should accept a custom filter block' do
67
+ @session.visit('/form')
68
+ cbox = @session.find(:css, '#form_pets_dog')
69
+ expect(cbox).to match_selector(:checkbox) { |node| node[:id] == 'form_pets_dog' }
70
+ expect(cbox).not_to match_selector(:checkbox) { |node| node[:id] != 'form_pets_dog' }
71
+ expect(cbox.matches_selector?(:checkbox) { |node| node[:id] == 'form_pets_dog' }).to be true
72
+ expect(cbox.matches_selector?(:checkbox) { |node| node[:id] != 'form_pets_dog' }).to be false
73
+ end
31
74
  end
32
75
 
33
76
  Capybara::SpecHelper.spec '#not_matches_selector?' do
77
+ let(:element) { @session.find(:css, 'span', text: 42) }
34
78
  before do
35
79
  @session.visit('/with_html')
36
- @element = @session.find(:css, "span", text: 42)
37
80
  end
38
81
 
39
- it "should be false if the given selector matches the element" do
40
- expect(@element).not_to not_match_selector(:xpath, "//span")
41
- expect(@element).not_to not_match_selector(:css, "span.number")
42
- expect(@element.not_matches_selector?(:css, "span.number")).to be false
82
+ it 'should be false if the given selector matches the element' do
83
+ expect(element).not_to not_match_selector(:xpath, '//span')
84
+ expect(element).not_to not_match_selector(:css, 'span.number')
85
+ expect(element.not_matches_selector?(:css, 'span.number')).to be false
43
86
  end
44
87
 
45
- it "should be true if the given selector does not match the element" do
46
- expect(@element).to not_match_selector(:xpath, "//abbr")
47
- expect(@element).to not_match_selector(:css, "p a#doesnotexist")
48
- expect(@element.not_matches_selector?(:css, "p a#doesnotexist")).to be true
88
+ it 'should be true if the given selector does not match the element' do
89
+ expect(element).to not_match_selector(:xpath, '//abbr')
90
+ expect(element).to not_match_selector(:css, 'p a#doesnotexist')
91
+ expect(element.not_matches_selector?(:css, 'p a#doesnotexist')).to be true
49
92
  end
50
93
 
51
- it "should use default selector" do
94
+ it 'should use default selector' do
52
95
  Capybara.default_selector = :css
53
- expect(@element).to not_match_selector("p a#doesnotexist")
54
- expect(@element).not_to not_match_selector("span.number")
96
+ expect(element).to not_match_selector('p a#doesnotexist')
97
+ expect(element).not_to not_match_selector('span.number')
55
98
  end
56
99
 
57
- context "with text" do
58
- it "should discard all matches where the given string is contained" do
59
- expect(@element).not_to not_match_selector(:css, "span.number", :text => "42")
60
- expect(@element).to not_match_selector(:css, "span.number", :text => "Doesnotexist")
100
+ context 'with text' do
101
+ it 'should discard all matches where the given string is contained' do
102
+ expect(element).not_to not_match_selector(:css, 'span.number', text: '42')
103
+ expect(element).to not_match_selector(:css, 'span.number', text: 'Doesnotexist')
61
104
  end
62
105
  end
63
- end if Gem::Version.new(RSpec::Expectations::Version::STRING) >= Gem::Version.new('3.1')
106
+
107
+ it 'should have CSS sugar' do
108
+ expect(element.not_matches_css?('span.number')).to be false
109
+ expect(element.not_matches_css?('p a#doesnotexist')).to be true
110
+ expect(element.not_matches_css?('span.number', text: '42')).to be false
111
+ expect(element.not_matches_css?('span.number', text: 'Doesnotexist')).to be true
112
+ end
113
+
114
+ it 'should have xpath sugar' do
115
+ expect(element.not_matches_xpath?('//span')).to be false
116
+ expect(element.not_matches_xpath?('//div')).to be true
117
+ expect(element.not_matches_xpath?('//span', text: '42')).to be false
118
+ expect(element.not_matches_xpath?('//span', text: 'Doesnotexist')).to be true
119
+ end
120
+ end