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,138 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#has_current_path?' do
4
+ before do
5
+ @session.visit('/with_js')
6
+ end
7
+
8
+ it 'should be true if the page has the given current path' do
9
+ expect(@session).to have_current_path('/with_js')
10
+ end
11
+
12
+ it 'should allow regexp matches' do
13
+ expect(@session).to have_current_path(/w[a-z]{3}_js/)
14
+ expect(@session).not_to have_current_path(/monkey/)
15
+ end
16
+
17
+ it 'should not raise an error when non-http' do
18
+ @session.reset_session!
19
+ expect(@session.has_current_path?(/monkey/)).to eq false
20
+ expect(@session.has_current_path?('/with_js')).to eq false
21
+ end
22
+
23
+ it 'should handle non-escaped query options' do
24
+ @session.click_link('Non-escaped query options')
25
+ expect(@session).to have_current_path('/with_html?options[]=things')
26
+ end
27
+
28
+ it 'should handle escaped query options' do
29
+ @session.click_link('Escaped query options')
30
+ expect(@session).to have_current_path('/with_html?options%5B%5D=things')
31
+ end
32
+
33
+ it 'should wait for current_path', requires: [:js] do
34
+ @session.click_link('Change page')
35
+ expect(@session).to have_current_path('/with_html', wait: 3)
36
+ end
37
+
38
+ it 'should be false if the page has not the given current_path' do
39
+ expect(@session).not_to have_current_path('/with_html')
40
+ end
41
+
42
+ it 'should check query options' do
43
+ @session.visit('/with_js?test=test')
44
+ expect(@session).to have_current_path('/with_js?test=test')
45
+ end
46
+
47
+ it 'should compare the full url if url: true is used' do
48
+ expect(@session).to have_current_path(%r{\Ahttp://[^/]*/with_js\Z}, url: true)
49
+ domain_port = if @session.respond_to?(:server) && @session.server
50
+ "#{@session.server.host}:#{@session.server.port}"
51
+ else
52
+ 'www.example.com'
53
+ end
54
+ expect(@session).to have_current_path("http://#{domain_port}/with_js", url: true)
55
+ end
56
+
57
+ it 'should not compare the full url if url: true is not passed' do
58
+ expect(@session).to have_current_path(%r{^/with_js\Z})
59
+ expect(@session).to have_current_path('/with_js')
60
+ end
61
+
62
+ it 'should not compare the full url if url: false is passed' do
63
+ expect(@session).to have_current_path(%r{^/with_js\Z}, url: false)
64
+ expect(@session).to have_current_path('/with_js', url: false)
65
+ end
66
+
67
+ it 'should default to full url if value is a url' do
68
+ url = @session.current_url
69
+ expect(url).to match(/with_js$/)
70
+ expect(@session).to have_current_path(url)
71
+ expect(@session).not_to have_current_path('http://www.not_example.com/with_js')
72
+ end
73
+
74
+ it 'should ignore the query' do
75
+ @session.visit('/with_js?test=test')
76
+ expect(@session).to have_current_path('/with_js?test=test')
77
+ expect(@session).to have_current_path('/with_js', ignore_query: true)
78
+ uri = ::Addressable::URI.parse(@session.current_url)
79
+ uri.query = nil
80
+ expect(@session).to have_current_path(uri.to_s, ignore_query: true)
81
+ end
82
+
83
+ it 'should not raise an exception if the current_url is nil' do
84
+ allow(@session).to receive(:current_url).and_return(nil)
85
+ allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
86
+
87
+ # Without ignore_query option
88
+ expect do
89
+ expect(@session).to have_current_path(nil)
90
+ end.not_to raise_exception
91
+
92
+ # With ignore_query option
93
+ expect do
94
+ expect(@session).to have_current_path(nil, ignore_query: true)
95
+ end.not_to raise_exception
96
+ end
97
+ end
98
+
99
+ Capybara::SpecHelper.spec '#has_no_current_path?' do
100
+ before do
101
+ @session.visit('/with_js')
102
+ end
103
+
104
+ it 'should be false if the page has the given current_path' do
105
+ expect(@session).not_to have_no_current_path('/with_js')
106
+ end
107
+
108
+ it 'should allow regexp matches' do
109
+ expect(@session).not_to have_no_current_path(/w[a-z]{3}_js/)
110
+ expect(@session).to have_no_current_path(/monkey/)
111
+ end
112
+
113
+ it 'should wait for current_path to disappear', requires: [:js] do
114
+ Capybara.using_wait_time(3) do
115
+ @session.click_link('Change page')
116
+ expect(@session).to have_no_current_path('/with_js')
117
+ end
118
+ end
119
+
120
+ it 'should be true if the page has not the given current_path' do
121
+ expect(@session).to have_no_current_path('/with_html')
122
+ end
123
+
124
+ it 'should not raise an exception if the current_url is nil' do
125
+ allow(@session).to receive(:current_url).and_return(nil)
126
+ allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
127
+
128
+ # Without ignore_query option
129
+ expect do
130
+ expect(@session).not_to have_current_path('/with_js')
131
+ end. not_to raise_exception
132
+
133
+ # With ignore_query option
134
+ expect do
135
+ expect(@session).not_to have_current_path('/with_js', ignore_query: true)
136
+ end. not_to raise_exception
137
+ end
138
+ end
@@ -0,0 +1,349 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#has_field' do
4
+ before { @session.visit('/form') }
5
+
6
+ it 'should be true if the field is on the page' do
7
+ expect(@session).to have_field('Dog')
8
+ expect(@session).to have_field('form_description')
9
+ expect(@session).to have_field('Region')
10
+ expect(@session).to have_field(:Region)
11
+ end
12
+
13
+ it 'should be false if the field is not on the page' do
14
+ expect(@session).not_to have_field('Monkey')
15
+ end
16
+
17
+ context 'with value' do
18
+ it 'should be true if a field with the given value is on the page' do
19
+ expect(@session).to have_field('First Name', with: 'John')
20
+ expect(@session).to have_field('First Name', with: /^Joh/)
21
+ expect(@session).to have_field('Phone', with: '+1 555 7021')
22
+ expect(@session).to have_field('Street', with: 'Sesame street 66')
23
+ expect(@session).to have_field('Description', with: 'Descriptive text goes here')
24
+ end
25
+
26
+ it 'should be false if the given field is not on the page' do
27
+ expect(@session).not_to have_field('First Name', with: 'Peter')
28
+ expect(@session).not_to have_field('First Name', with: /eter$/)
29
+ expect(@session).not_to have_field('Wrong Name', with: 'John')
30
+ expect(@session).not_to have_field('Description', with: 'Monkey')
31
+ end
32
+
33
+ it 'should be true after the field has been filled in with the given value' do
34
+ @session.fill_in('First Name', with: 'Jonas')
35
+ expect(@session).to have_field('First Name', with: 'Jonas')
36
+ expect(@session).to have_field('First Name', with: /ona/)
37
+ end
38
+
39
+ it 'should be false after the field has been filled in with a different value' do
40
+ @session.fill_in('First Name', with: 'Jonas')
41
+ expect(@session).not_to have_field('First Name', with: 'John')
42
+ expect(@session).not_to have_field('First Name', with: /John|Paul|George|Ringo/)
43
+ end
44
+
45
+ it 'should output filter errors if only one element matched the selector but failed the filters' do
46
+ @session.fill_in('First Name', with: 'Thomas')
47
+ expect do
48
+ expect(@session).to have_field('First Name', with: 'Jonas')
49
+ end.to raise_exception(RSpec::Expectations::ExpectationNotMetError, /Expected value to be "Jonas" but was "Thomas"/)
50
+
51
+ # native boolean node filter
52
+ expect do
53
+ expect(@session).to have_field('First Name', readonly: true)
54
+ end.to raise_exception(RSpec::Expectations::ExpectationNotMetError, /Expected readonly true but it wasn't/)
55
+
56
+ # inherited boolean node filter
57
+ expect do
58
+ expect(@session).to have_field('form_pets_cat', checked: true)
59
+ end.to raise_exception(RSpec::Expectations::ExpectationNotMetError, /Expected checked true but it wasn't/)
60
+ end
61
+ end
62
+
63
+ context 'with type' do
64
+ it 'should be true if a field with the given type is on the page' do
65
+ expect(@session).to have_field('First Name', type: 'text')
66
+ expect(@session).to have_field('Html5 Email', type: 'email')
67
+ expect(@session).to have_field('Html5 Multiple Email', type: 'email')
68
+ expect(@session).to have_field('Html5 Tel', type: 'tel')
69
+ expect(@session).to have_field('Description', type: 'textarea')
70
+ expect(@session).to have_field('Languages', type: 'select')
71
+ end
72
+
73
+ it 'should be false if the given field is not on the page' do
74
+ expect(@session).not_to have_field('First Name', type: 'textarea')
75
+ expect(@session).not_to have_field('Html5 Email', type: 'tel')
76
+ expect(@session).not_to have_field('Html5 Multiple Email', type: 'tel')
77
+ expect(@session).not_to have_field('Description', type: '')
78
+ expect(@session).not_to have_field('Description', type: 'email')
79
+ expect(@session).not_to have_field('Languages', type: 'textarea')
80
+ end
81
+
82
+ it 'it can find type="hidden" elements if explicity specified' do
83
+ expect(@session).to have_field('form[data]', with: 'TWTW', type: 'hidden')
84
+ end
85
+ end
86
+
87
+ context 'with multiple' do
88
+ it 'should be true if a field with the multiple attribute is on the page' do
89
+ expect(@session).to have_field('Html5 Multiple Email', multiple: true)
90
+ end
91
+
92
+ it 'should be false if a field without the multiple attribute is not on the page' do
93
+ expect(@session).not_to have_field('Html5 Multiple Email', multiple: false)
94
+ end
95
+ end
96
+
97
+ context 'with valid', requires: [:js] do
98
+ it 'should be true if field is valid' do
99
+ @session.fill_in 'required', with: 'something'
100
+ @session.fill_in 'length', with: 'abcd'
101
+
102
+ expect(@session).to have_field('required', valid: true)
103
+ expect(@session).to have_field('length', valid: true)
104
+ end
105
+
106
+ it 'should be false if field is invalid' do
107
+ expect(@session).not_to have_field('required', valid: true)
108
+ expect(@session).to have_field('required', valid: false)
109
+
110
+ @session.fill_in 'length', with: 'abc'
111
+ expect(@session).not_to have_field('length', valid: true)
112
+ end
113
+ end
114
+ end
115
+
116
+ Capybara::SpecHelper.spec '#has_no_field' do
117
+ before { @session.visit('/form') }
118
+
119
+ it 'should be false if the field is on the page' do
120
+ expect(@session).not_to have_no_field('Dog')
121
+ expect(@session).not_to have_no_field('form_description')
122
+ expect(@session).not_to have_no_field('Region')
123
+ end
124
+
125
+ it 'should be true if the field is not on the page' do
126
+ expect(@session).to have_no_field('Monkey')
127
+ end
128
+
129
+ context 'with value' do
130
+ it 'should be false if a field with the given value is on the page' do
131
+ expect(@session).not_to have_no_field('First Name', with: 'John')
132
+ expect(@session).not_to have_no_field('Phone', with: '+1 555 7021')
133
+ expect(@session).not_to have_no_field('Street', with: 'Sesame street 66')
134
+ expect(@session).not_to have_no_field('Description', with: 'Descriptive text goes here')
135
+ end
136
+
137
+ it 'should be true if the given field is not on the page' do
138
+ expect(@session).to have_no_field('First Name', with: 'Peter')
139
+ expect(@session).to have_no_field('Wrong Name', with: 'John')
140
+ expect(@session).to have_no_field('Description', with: 'Monkey')
141
+ end
142
+
143
+ it 'should be false after the field has been filled in with the given value' do
144
+ @session.fill_in('First Name', with: 'Jonas')
145
+ expect(@session).not_to have_no_field('First Name', with: 'Jonas')
146
+ end
147
+
148
+ it 'should be true after the field has been filled in with a different value' do
149
+ @session.fill_in('First Name', with: 'Jonas')
150
+ expect(@session).to have_no_field('First Name', with: 'John')
151
+ end
152
+ end
153
+
154
+ context 'with type' do
155
+ it 'should be false if a field with the given type is on the page' do
156
+ expect(@session).not_to have_no_field('First Name', type: 'text')
157
+ expect(@session).not_to have_no_field('Html5 Email', type: 'email')
158
+ expect(@session).not_to have_no_field('Html5 Tel', type: 'tel')
159
+ expect(@session).not_to have_no_field('Description', type: 'textarea')
160
+ expect(@session).not_to have_no_field('Languages', type: 'select')
161
+ end
162
+
163
+ it 'should be true if the given field is not on the page' do
164
+ expect(@session).to have_no_field('First Name', type: 'textarea')
165
+ expect(@session).to have_no_field('Html5 Email', type: 'tel')
166
+ expect(@session).to have_no_field('Description', type: '')
167
+ expect(@session).to have_no_field('Description', type: 'email')
168
+ expect(@session).to have_no_field('Languages', type: 'textarea')
169
+ end
170
+ end
171
+ end
172
+
173
+ Capybara::SpecHelper.spec '#has_checked_field?' do
174
+ before { @session.visit('/form') }
175
+
176
+ it 'should be true if a checked field is on the page' do
177
+ expect(@session).to have_checked_field('gender_female')
178
+ expect(@session).to have_checked_field('Hamster')
179
+ end
180
+
181
+ it 'should be true for disabled checkboxes if disabled: true' do
182
+ expect(@session).to have_checked_field('Disabled Checkbox', disabled: true)
183
+ end
184
+
185
+ it 'should be false if an unchecked field is on the page' do
186
+ expect(@session).not_to have_checked_field('form_pets_cat')
187
+ expect(@session).not_to have_checked_field('Male')
188
+ end
189
+
190
+ it 'should be false if no field is on the page' do
191
+ expect(@session).not_to have_checked_field('Does Not Exist')
192
+ end
193
+
194
+ it 'should be false for disabled checkboxes by default' do
195
+ expect(@session).not_to have_checked_field('Disabled Checkbox')
196
+ end
197
+
198
+ it 'should be false for disabled checkboxes if disabled: false' do
199
+ expect(@session).not_to have_checked_field('Disabled Checkbox', disabled: false)
200
+ end
201
+
202
+ it 'should be true for disabled checkboxes if disabled: :all' do
203
+ expect(@session).to have_checked_field('Disabled Checkbox', disabled: :all)
204
+ end
205
+
206
+ it 'should be true for enabled checkboxes if disabled: :all' do
207
+ expect(@session).to have_checked_field('gender_female', disabled: :all)
208
+ end
209
+
210
+ it 'should be true after an unchecked checkbox is checked' do
211
+ @session.check('form_pets_cat')
212
+ expect(@session).to have_checked_field('form_pets_cat')
213
+ end
214
+
215
+ it 'should be false after a checked checkbox is unchecked' do
216
+ @session.uncheck('form_pets_dog')
217
+ expect(@session).not_to have_checked_field('form_pets_dog')
218
+ end
219
+
220
+ it 'should be true after an unchecked radio button is chosen' do
221
+ @session.choose('gender_male')
222
+ expect(@session).to have_checked_field('gender_male')
223
+ end
224
+
225
+ it 'should be false after another radio button in the group is chosen' do
226
+ @session.choose('gender_male')
227
+ expect(@session).not_to have_checked_field('gender_female')
228
+ end
229
+ end
230
+
231
+ Capybara::SpecHelper.spec '#has_no_checked_field?' do
232
+ before { @session.visit('/form') }
233
+
234
+ it 'should be false if a checked field is on the page' do
235
+ expect(@session).not_to have_no_checked_field('gender_female')
236
+ expect(@session).not_to have_no_checked_field('Hamster')
237
+ end
238
+
239
+ it 'should be false for disabled checkboxes if disabled: true' do
240
+ expect(@session).not_to have_no_checked_field('Disabled Checkbox', disabled: true)
241
+ end
242
+
243
+ it 'should be true if an unchecked field is on the page' do
244
+ expect(@session).to have_no_checked_field('form_pets_cat')
245
+ expect(@session).to have_no_checked_field('Male')
246
+ end
247
+
248
+ it 'should be true if no field is on the page' do
249
+ expect(@session).to have_no_checked_field('Does Not Exist')
250
+ end
251
+
252
+ it 'should be true for disabled checkboxes by default' do
253
+ expect(@session).to have_no_checked_field('Disabled Checkbox')
254
+ end
255
+
256
+ it 'should be true for disabled checkboxes if disabled: false' do
257
+ expect(@session).to have_no_checked_field('Disabled Checkbox', disabled: false)
258
+ end
259
+ end
260
+
261
+ Capybara::SpecHelper.spec '#has_unchecked_field?' do
262
+ before { @session.visit('/form') }
263
+
264
+ it 'should be false if a checked field is on the page' do
265
+ expect(@session).not_to have_unchecked_field('gender_female')
266
+ expect(@session).not_to have_unchecked_field('Hamster')
267
+ end
268
+
269
+ it 'should be true if an unchecked field is on the page' do
270
+ expect(@session).to have_unchecked_field('form_pets_cat')
271
+ expect(@session).to have_unchecked_field('Male')
272
+ end
273
+
274
+ it 'should be true for disabled unchecked fields if disabled: true' do
275
+ expect(@session).to have_unchecked_field('Disabled Unchecked Checkbox', disabled: true)
276
+ end
277
+
278
+ it 'should be false if no field is on the page' do
279
+ expect(@session).not_to have_unchecked_field('Does Not Exist')
280
+ end
281
+
282
+ it 'should be false for disabled unchecked fields by default' do
283
+ expect(@session).not_to have_unchecked_field('Disabled Unchecked Checkbox')
284
+ end
285
+
286
+ it 'should be false for disabled unchecked fields if disabled: false' do
287
+ expect(@session).not_to have_unchecked_field('Disabled Unchecked Checkbox', disabled: false)
288
+ end
289
+
290
+ it 'should be false after an unchecked checkbox is checked' do
291
+ @session.check('form_pets_cat')
292
+ expect(@session).not_to have_unchecked_field('form_pets_cat')
293
+ end
294
+
295
+ it 'should be true after a checked checkbox is unchecked' do
296
+ @session.uncheck('form_pets_dog')
297
+ expect(@session).to have_unchecked_field('form_pets_dog')
298
+ end
299
+
300
+ it 'should be false after an unchecked radio button is chosen' do
301
+ @session.choose('gender_male')
302
+ expect(@session).not_to have_unchecked_field('gender_male')
303
+ end
304
+
305
+ it 'should be true after another radio button in the group is chosen' do
306
+ @session.choose('gender_male')
307
+ expect(@session).to have_unchecked_field('gender_female')
308
+ end
309
+
310
+ it 'should support locator-less usage' do
311
+ expect(@session.has_unchecked_field?(disabled: true, id: 'form_disabled_unchecked_checkbox')).to be true
312
+ expect(@session).to have_unchecked_field(disabled: true, id: 'form_disabled_unchecked_checkbox')
313
+ end
314
+ end
315
+
316
+ Capybara::SpecHelper.spec '#has_no_unchecked_field?' do
317
+ before { @session.visit('/form') }
318
+
319
+ it 'should be true if a checked field is on the page' do
320
+ expect(@session).to have_no_unchecked_field('gender_female')
321
+ expect(@session).to have_no_unchecked_field('Hamster')
322
+ end
323
+
324
+ it 'should be false if an unchecked field is on the page' do
325
+ expect(@session).not_to have_no_unchecked_field('form_pets_cat')
326
+ expect(@session).not_to have_no_unchecked_field('Male')
327
+ end
328
+
329
+ it 'should be false for disabled unchecked fields if disabled: true' do
330
+ expect(@session).not_to have_no_unchecked_field('Disabled Unchecked Checkbox', disabled: true)
331
+ end
332
+
333
+ it 'should be true if no field is on the page' do
334
+ expect(@session).to have_no_unchecked_field('Does Not Exist')
335
+ end
336
+
337
+ it 'should be true for disabled unchecked fields by default' do
338
+ expect(@session).to have_no_unchecked_field('Disabled Unchecked Checkbox')
339
+ end
340
+
341
+ it 'should be true for disabled unchecked fields if disabled: false' do
342
+ expect(@session).to have_no_unchecked_field('Disabled Unchecked Checkbox', disabled: false)
343
+ end
344
+
345
+ it 'should support locator-less usage' do
346
+ expect(@session.has_no_unchecked_field?(disabled: false, id: 'form_disabled_unchecked_checkbox')).to eq true
347
+ expect(@session).to have_no_unchecked_field(disabled: false, id: 'form_disabled_unchecked_checkbox')
348
+ end
349
+ end