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