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,21 +1,22 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#has_link?' do
3
4
  before do
4
5
  @session.visit('/with_html')
5
6
  end
6
7
 
7
- it "should be true if the given link is on the page" do
8
+ it 'should be true if the given link is on the page' do
8
9
  expect(@session).to have_link('foo')
9
10
  expect(@session).to have_link('awesome title')
10
- expect(@session).to have_link('A link', :href => '/with_simple_html')
11
- expect(@session).to have_link(:'A link', :href => :'/with_simple_html')
12
- expect(@session).to have_link('A link', :href => /\/with_simple_html/)
11
+ expect(@session).to have_link('A link', href: '/with_simple_html')
12
+ expect(@session).to have_link(:'A link', href: :'/with_simple_html')
13
+ expect(@session).to have_link('A link', href: %r{/with_simple_html})
13
14
  end
14
15
 
15
- it "should be false if the given link is not on the page" do
16
+ it 'should be false if the given link is not on the page' do
16
17
  expect(@session).not_to have_link('monkey')
17
- expect(@session).not_to have_link('A link', :href => '/non-existant-href')
18
- expect(@session).not_to have_link('A link', :href => /non-existant/)
18
+ expect(@session).not_to have_link('A link', href: '/nonexistent-href')
19
+ expect(@session).not_to have_link('A link', href: /nonexistent/)
19
20
  end
20
21
  end
21
22
 
@@ -24,15 +25,15 @@ Capybara::SpecHelper.spec '#has_no_link?' do
24
25
  @session.visit('/with_html')
25
26
  end
26
27
 
27
- it "should be false if the given link is on the page" do
28
+ it 'should be false if the given link is on the page' do
28
29
  expect(@session).not_to have_no_link('foo')
29
30
  expect(@session).not_to have_no_link('awesome title')
30
- expect(@session).not_to have_no_link('A link', :href => '/with_simple_html')
31
+ expect(@session).not_to have_no_link('A link', href: '/with_simple_html')
31
32
  end
32
33
 
33
- it "should be true if the given link is not on the page" do
34
+ it 'should be true if the given link is not on the page' do
34
35
  expect(@session).to have_no_link('monkey')
35
- expect(@session).to have_no_link('A link', :href => '/non-existant-href')
36
- expect(@session).to have_no_link('A link', :href => /\/non-existant-href/)
36
+ expect(@session).to have_no_link('A link', href: '/nonexistent-href')
37
+ expect(@session).to have_no_link('A link', href: %r{/nonexistent-href})
37
38
  end
38
39
  end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#have_none_of_selectors' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be false if any of the given locators are on the page' do
9
+ expect do
10
+ expect(@session).to have_none_of_selectors(:xpath, '//p', '//a')
11
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
12
+ expect do
13
+ expect(@session).to have_none_of_selectors(:css, 'p a#foo')
14
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
15
+ end
16
+
17
+ it 'should be true if none of the given locators are on the page' do
18
+ expect(@session).to have_none_of_selectors(:xpath, '//abbr', '//td')
19
+ expect(@session).to have_none_of_selectors(:css, 'p a#doesnotexist', 'abbr')
20
+ end
21
+
22
+ it 'should use default selector' do
23
+ Capybara.default_selector = :css
24
+ expect(@session).to have_none_of_selectors('p a#doesnotexist', 'abbr')
25
+ expect do
26
+ expect(@session).to have_none_of_selectors('abbr', 'p a#foo')
27
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
28
+ end
29
+
30
+ context 'should respect scopes' do
31
+ it 'when used with `within`' do
32
+ @session.within "//p[@id='first']" do
33
+ expect do
34
+ expect(@session).to have_none_of_selectors(".//a[@id='foo']")
35
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
36
+ expect(@session).to have_none_of_selectors(".//a[@id='red']")
37
+ end
38
+ end
39
+
40
+ it 'when called on an element' do
41
+ el = @session.find "//p[@id='first']"
42
+ expect do
43
+ expect(el).to have_none_of_selectors(".//a[@id='foo']")
44
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
45
+ expect(el).to have_none_of_selectors(".//a[@id='red']")
46
+ end
47
+ end
48
+
49
+ context 'with options' do
50
+ it 'should apply the options to all locators' do
51
+ expect do
52
+ expect(@session).to have_none_of_selectors('//p//a', text: 'Redirect')
53
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
54
+ expect(@session).to have_none_of_selectors('//p', text: 'Doesnotexist')
55
+ end
56
+
57
+ it 'should discard all matches where the given regexp is matched' do
58
+ expect do
59
+ expect(@session).to have_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1)
60
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
61
+ expect(@session).to have_none_of_selectors('//p//a', text: /Red$/)
62
+ end
63
+ end
64
+
65
+ context 'with wait', requires: [:js] do
66
+ it 'should not find elements if they appear after given wait duration' do
67
+ @session.visit('/with_js')
68
+ @session.click_link('Click me')
69
+ expect(@session).to have_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
70
+ end
71
+ end
72
+
73
+ it 'cannot be negated' do
74
+ expect do
75
+ expect(@session).not_to have_none_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
76
+ end.to raise_error ArgumentError
77
+ end
78
+ end
@@ -1,214 +1,310 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#has_select?' 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_select('Locale')
7
8
  expect(@session).to have_select('form_region')
8
9
  expect(@session).to have_select('Languages')
9
- expect(@session).to have_select(:'Languages')
10
+ expect(@session).to have_select(:Languages)
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_select('Monkey')
14
15
  end
15
16
 
16
17
  context 'with selected value' do
17
- it "should be true if a field with the given value is on the page" do
18
- expect(@session).to have_select('form_locale', :selected => 'English')
19
- expect(@session).to have_select('Region', :selected => 'Norway')
20
- expect(@session).to have_select('Underwear', :selected => [
18
+ it 'should be true if a field with the given value is on the page' do
19
+ expect(@session).to have_select('form_locale', selected: 'English')
20
+ expect(@session).to have_select('Region', selected: 'Norway')
21
+ expect(@session).to have_select('Underwear', selected: [
21
22
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
22
23
  ])
23
24
  end
24
25
 
25
- it "should be false if the given field is not on the page" do
26
- expect(@session).not_to have_select('Locale', :selected => 'Swedish')
27
- expect(@session).not_to have_select('Does not exist', :selected => 'John')
28
- expect(@session).not_to have_select('City', :selected => 'Not there')
29
- expect(@session).not_to have_select('Underwear', :selected => [
30
- 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistant'
26
+ it 'should be false if the given field is not on the page' do
27
+ expect(@session).not_to have_select('Locale', selected: 'Swedish')
28
+ expect(@session).not_to have_select('Does not exist', selected: 'John')
29
+ expect(@session).not_to have_select('City', selected: 'Not there')
30
+ expect(@session).not_to have_select('Underwear', selected: [
31
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistent'
31
32
  ])
32
- expect(@session).not_to have_select('Underwear', :selected => [
33
+ expect(@session).not_to have_select('Underwear', selected: [
33
34
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
34
35
  ])
35
- expect(@session).not_to have_select('Underwear', :selected => [
36
- 'Boxerbriefs', 'Briefs','Commando', "Frenchman's Pantalons"
36
+ expect(@session).not_to have_select('Underwear', selected: [
37
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
37
38
  ])
38
39
  end
39
40
 
40
- it "should be true after the given value is selected" do
41
- @session.select('Swedish', :from => 'Locale')
42
- expect(@session).to have_select('Locale', :selected => 'Swedish')
41
+ it 'should be true after the given value is selected' do
42
+ @session.select('Swedish', from: 'Locale')
43
+ expect(@session).to have_select('Locale', selected: 'Swedish')
43
44
  end
44
45
 
45
- it "should be false after a different value is selected" do
46
- @session.select('Swedish', :from => 'Locale')
47
- expect(@session).not_to have_select('Locale', :selected => 'English')
46
+ it 'should be false after a different value is selected' do
47
+ @session.select('Swedish', from: 'Locale')
48
+ expect(@session).not_to have_select('Locale', selected: 'English')
48
49
  end
49
50
 
50
- it "should be true after the given values are selected" do
51
- @session.select('Boxers', :from => 'Underwear')
52
- expect(@session).to have_select('Underwear', :selected => [
51
+ it 'should be true after the given values are selected' do
52
+ @session.select('Boxers', from: 'Underwear')
53
+ expect(@session).to have_select('Underwear', selected: [
53
54
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
54
55
  ])
55
56
  end
56
57
 
57
- it "should be false after one of the values is unselected" do
58
- @session.unselect('Briefs', :from => 'Underwear')
59
- expect(@session).not_to have_select('Underwear', :selected => [
58
+ it 'should be false after one of the values is unselected' do
59
+ @session.unselect('Briefs', from: 'Underwear')
60
+ expect(@session).not_to have_select('Underwear', selected: [
60
61
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
61
62
  ])
62
63
  end
63
64
 
64
65
  it "should be true even when the selected option invisible, regardless of the select's visibility" do
65
- expect(@session).to have_select('Icecream', :visible => false, :selected => 'Chocolate')
66
- expect(@session).to have_select('Sorbet', :selected => 'Vanilla')
66
+ expect(@session).to have_select('Icecream', visible: :hidden, selected: 'Chocolate')
67
+ expect(@session).to have_select('Sorbet', selected: 'Vanilla')
68
+ end
69
+ end
70
+
71
+ context 'with partial select' do
72
+ it 'should be true if a field with the given partial values is on the page' do
73
+ expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
74
+ end
75
+
76
+ it 'should be false if a field with the given partial values is not on the page' do
77
+ expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
78
+ end
79
+
80
+ it 'should be true after the given partial value is selected' do
81
+ @session.select('Boxers', from: 'Underwear')
82
+ expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
83
+ end
84
+
85
+ it 'should be false after one of the given partial values is unselected' do
86
+ @session.unselect('Briefs', from: 'Underwear')
87
+ expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
88
+ end
89
+
90
+ it "should be true even when the selected values are invisible, regardless of the select's visibility" do
91
+ expect(@session).to have_select('Dessert', visible: :hidden, with_options: %w[Pudding Tiramisu])
92
+ expect(@session).to have_select('Cake', with_selected: ['Chocolate Cake', 'Sponge Cake'])
93
+ end
94
+
95
+ it 'should support non array partial values' do
96
+ expect(@session).to have_select('Underwear', with_selected: 'Briefs')
97
+ expect(@session).not_to have_select('Underwear', with_selected: 'Boxers')
67
98
  end
68
99
  end
69
100
 
70
101
  context 'with exact options' do
71
- it "should be true if a field with the given options is on the page" do
72
- expect(@session).to have_select('Region', :options => ['Norway', 'Sweden', 'Finland'])
73
- expect(@session).to have_select('Tendency', :options => [])
102
+ it 'should be true if a field with the given options is on the page' do
103
+ expect(@session).to have_select('Region', options: %w[Norway Sweden Finland])
104
+ expect(@session).to have_select('Tendency', options: [])
105
+ end
106
+
107
+ it 'should be false if the given field is not on the page' do
108
+ expect(@session).not_to have_select('Locale', options: ['Swedish'])
109
+ expect(@session).not_to have_select('Does not exist', options: ['John'])
110
+ expect(@session).not_to have_select('City', options: ['London', 'Made up city'])
111
+ expect(@session).not_to have_select('Region', options: %w[Norway Sweden])
112
+ expect(@session).not_to have_select('Region', options: %w[Norway Norway Norway])
74
113
  end
75
114
 
76
- it "should be false if the given field is not on the page" do
77
- expect(@session).not_to have_select('Locale', :options => ['Swedish'])
78
- expect(@session).not_to have_select('Does not exist', :options => ['John'])
79
- expect(@session).not_to have_select('City', :options => ['London', 'Made up city'])
80
- expect(@session).not_to have_select('Region', :options => ['Norway', 'Sweden'])
81
- expect(@session).not_to have_select('Region', :options => ['Norway', 'Norway', 'Norway'])
115
+ it 'should be true even when the options are invisible, if the select itself is invisible' do
116
+ expect(@session).to have_select('Icecream', visible: :hidden, options: %w[Chocolate Vanilla Strawberry])
117
+ end
118
+ end
119
+
120
+ context 'with enabled options' do
121
+ it 'should be true if the listed options exist and are enabled' do
122
+ expect(@session).to have_select('form_title', enabled_options: %w[Mr Mrs Miss])
82
123
  end
83
124
 
84
- it" should be true even when the options are invisible, if the select itself is invisible" do
85
- expect(@session).to have_select("Icecream", :visible => false, :options => ['Chocolate', 'Vanilla', 'Strawberry'])
125
+ it 'should be false if the listed options do not exist' do
126
+ expect(@session).not_to have_select('form_title', enabled_options: ['Not there'])
86
127
  end
87
128
 
129
+ it 'should be false if the listed option exists but is not enabled' do
130
+ expect(@session).not_to have_select('form_title', enabled_options: %w[Mr Mrs Miss Other])
131
+ end
132
+ end
133
+
134
+ context 'with disabled options' do
135
+ it 'should be true if the listed options exist and are disabled' do
136
+ expect(@session).to have_select('form_title', disabled_options: ['Other'])
137
+ end
138
+
139
+ it 'should be false if the listed options do not exist' do
140
+ expect(@session).not_to have_select('form_title', disabled_options: ['Not there'])
141
+ end
142
+
143
+ it 'should be false if the listed option exists but is not disabled' do
144
+ expect(@session).not_to have_select('form_title', disabled_options: %w[Other Mrs])
145
+ end
88
146
  end
89
147
 
90
148
  context 'with partial options' do
91
- it "should be true if a field with the given partial options is on the page" do
92
- expect(@session).to have_select('Region', :with_options => ['Norway', 'Sweden'])
93
- expect(@session).to have_select('City', :with_options => ['London'])
149
+ it 'should be true if a field with the given partial options is on the page' do
150
+ expect(@session).to have_select('Region', with_options: %w[Norway Sweden])
151
+ expect(@session).to have_select('City', with_options: ['London'])
94
152
  end
95
153
 
96
- it "should be false if a field with the given partial options is not on the page" do
97
- expect(@session).not_to have_select('Locale', :with_options => ['Uruguayan'])
98
- expect(@session).not_to have_select('Does not exist', :with_options => ['John'])
99
- expect(@session).not_to have_select('Region', :with_options => ['Norway', 'Sweden', 'Finland', 'Latvia'])
154
+ it 'should be false if a field with the given partial options is not on the page' do
155
+ expect(@session).not_to have_select('Locale', with_options: ['Uruguayan'])
156
+ expect(@session).not_to have_select('Does not exist', with_options: ['John'])
157
+ expect(@session).not_to have_select('Region', with_options: %w[Norway Sweden Finland Latvia])
100
158
  end
101
159
 
102
- it" should be true even when the options are invisible, if the select itself is invisible" do
103
- expect(@session).to have_select("Icecream", :visible => false, :with_options => ['Vanilla', 'Strawberry'])
160
+ it 'should be true even when the options are invisible, if the select itself is invisible' do
161
+ expect(@session).to have_select('Icecream', visible: :hidden, with_options: %w[Vanilla Strawberry])
104
162
  end
105
163
  end
106
164
 
107
165
  context 'with multiple option' do
108
- it "should find multiple selects if true" do
166
+ it 'should find multiple selects if true' do
109
167
  expect(@session).to have_select('form_languages', multiple: true)
110
168
  expect(@session).not_to have_select('form_other_title', multiple: true)
111
169
  end
112
170
 
113
- it "should not find multiple selects if false" do
171
+ it 'should not find multiple selects if false' do
114
172
  expect(@session).not_to have_select('form_languages', multiple: false)
115
173
  expect(@session).to have_select('form_other_title', multiple: false)
116
174
  end
117
175
 
118
- it "should find both if not specified" do
176
+ it 'should find both if not specified' do
119
177
  expect(@session).to have_select('form_languages')
120
178
  expect(@session).to have_select('form_other_title')
121
179
  end
122
180
  end
123
181
 
182
+ it 'should support locator-less usage' do
183
+ expect(@session.has_select?(with_options: %w[Norway Sweden])).to eq true
184
+ expect(@session).to have_select(with_options: ['London'])
185
+ expect(@session.has_select?(with_selected: %w[Commando Boxerbriefs])).to eq true
186
+ expect(@session).to have_select(with_selected: ['Briefs'])
187
+ end
124
188
  end
125
189
 
126
190
  Capybara::SpecHelper.spec '#has_no_select?' do
127
191
  before { @session.visit('/form') }
128
192
 
129
- it "should be false if the field is on the page" do
193
+ it 'should be false if the field is on the page' do
130
194
  expect(@session).not_to have_no_select('Locale')
131
195
  expect(@session).not_to have_no_select('form_region')
132
196
  expect(@session).not_to have_no_select('Languages')
133
197
  end
134
198
 
135
- it "should be true if the field is not on the page" do
199
+ it 'should be true if the field is not on the page' do
136
200
  expect(@session).to have_no_select('Monkey')
137
201
  end
138
202
 
139
203
  context 'with selected value' do
140
- it "should be false if a field with the given value is on the page" do
141
- expect(@session).not_to have_no_select('form_locale', :selected => 'English')
142
- expect(@session).not_to have_no_select('Region', :selected => 'Norway')
143
- expect(@session).not_to have_no_select('Underwear', :selected => [
204
+ it 'should be false if a field with the given value is on the page' do
205
+ expect(@session).not_to have_no_select('form_locale', selected: 'English')
206
+ expect(@session).not_to have_no_select('Region', selected: 'Norway')
207
+ expect(@session).not_to have_no_select('Underwear', selected: [
144
208
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
145
209
  ])
146
210
  end
147
211
 
148
- it "should be true if the given field is not on the page" do
149
- expect(@session).to have_no_select('Locale', :selected => 'Swedish')
150
- expect(@session).to have_no_select('Does not exist', :selected => 'John')
151
- expect(@session).to have_no_select('City', :selected => 'Not there')
152
- expect(@session).to have_no_select('Underwear', :selected => [
153
- 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistant'
212
+ it 'should be true if the given field is not on the page' do
213
+ expect(@session).to have_no_select('Locale', selected: 'Swedish')
214
+ expect(@session).to have_no_select('Does not exist', selected: 'John')
215
+ expect(@session).to have_no_select('City', selected: 'Not there')
216
+ expect(@session).to have_no_select('Underwear', selected: [
217
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistent'
154
218
  ])
155
- expect(@session).to have_no_select('Underwear', :selected => [
219
+ expect(@session).to have_no_select('Underwear', selected: [
156
220
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
157
221
  ])
158
- expect(@session).to have_no_select('Underwear', :selected => [
159
- 'Boxerbriefs', 'Briefs','Commando', "Frenchman's Pantalons"
222
+ expect(@session).to have_no_select('Underwear', selected: [
223
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
160
224
  ])
161
225
  end
162
226
 
163
- it "should be false after the given value is selected" do
164
- @session.select('Swedish', :from => 'Locale')
165
- expect(@session).not_to have_no_select('Locale', :selected => 'Swedish')
227
+ it 'should be false after the given value is selected' do
228
+ @session.select('Swedish', from: 'Locale')
229
+ expect(@session).not_to have_no_select('Locale', selected: 'Swedish')
166
230
  end
167
231
 
168
- it "should be true after a different value is selected" do
169
- @session.select('Swedish', :from => 'Locale')
170
- expect(@session).to have_no_select('Locale', :selected => 'English')
232
+ it 'should be true after a different value is selected' do
233
+ @session.select('Swedish', from: 'Locale')
234
+ expect(@session).to have_no_select('Locale', selected: 'English')
171
235
  end
172
236
 
173
- it "should be false after the given values are selected" do
174
- @session.select('Boxers', :from => 'Underwear')
175
- expect(@session).not_to have_no_select('Underwear', :selected => [
237
+ it 'should be false after the given values are selected' do
238
+ @session.select('Boxers', from: 'Underwear')
239
+ expect(@session).not_to have_no_select('Underwear', selected: [
176
240
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
177
241
  ])
178
242
  end
179
243
 
180
- it "should be true after one of the values is unselected" do
181
- @session.unselect('Briefs', :from => 'Underwear')
182
- expect(@session).to have_no_select('Underwear', :selected => [
244
+ it 'should be true after one of the values is unselected' do
245
+ @session.unselect('Briefs', from: 'Underwear')
246
+ expect(@session).to have_no_select('Underwear', selected: [
183
247
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
184
248
  ])
185
249
  end
186
250
  end
187
251
 
252
+ context 'with partial select' do
253
+ it 'should be false if a field with the given partial values is on the page' do
254
+ expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
255
+ end
256
+
257
+ it 'should be true if a field with the given partial values is not on the page' do
258
+ expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
259
+ end
260
+
261
+ it 'should be false after the given partial value is selected' do
262
+ @session.select('Boxers', from: 'Underwear')
263
+ expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
264
+ end
265
+
266
+ it 'should be true after one of the given partial values is unselected' do
267
+ @session.unselect('Briefs', from: 'Underwear')
268
+ expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
269
+ end
270
+
271
+ it 'should support non array partial values' do
272
+ expect(@session).not_to have_no_select('Underwear', with_selected: 'Briefs')
273
+ expect(@session).to have_no_select('Underwear', with_selected: 'Boxers')
274
+ end
275
+ end
276
+
188
277
  context 'with exact options' do
189
- it "should be false if a field with the given options is on the page" do
190
- expect(@session).not_to have_no_select('Region', :options => ['Norway', 'Sweden', 'Finland'])
278
+ it 'should be false if a field with the given options is on the page' do
279
+ expect(@session).not_to have_no_select('Region', options: %w[Norway Sweden Finland])
191
280
  end
192
281
 
193
- it "should be true if the given field is not on the page" do
194
- expect(@session).to have_no_select('Locale', :options => ['Swedish'])
195
- expect(@session).to have_no_select('Does not exist', :options => ['John'])
196
- expect(@session).to have_no_select('City', :options => ['London', 'Made up city'])
197
- expect(@session).to have_no_select('Region', :options => ['Norway', 'Sweden'])
198
- expect(@session).to have_no_select('Region', :options => ['Norway', 'Norway', 'Norway'])
282
+ it 'should be true if the given field is not on the page' do
283
+ expect(@session).to have_no_select('Locale', options: ['Swedish'])
284
+ expect(@session).to have_no_select('Does not exist', options: ['John'])
285
+ expect(@session).to have_no_select('City', options: ['London', 'Made up city'])
286
+ expect(@session).to have_no_select('Region', options: %w[Norway Sweden])
287
+ expect(@session).to have_no_select('Region', options: %w[Norway Norway Norway])
199
288
  end
200
289
  end
201
290
 
202
291
  context 'with partial options' do
203
- it "should be false if a field with the given partial options is on the page" do
204
- expect(@session).not_to have_no_select('Region', :with_options => ['Norway', 'Sweden'])
205
- expect(@session).not_to have_no_select('City', :with_options => ['London'])
292
+ it 'should be false if a field with the given partial options is on the page' do
293
+ expect(@session).not_to have_no_select('Region', with_options: %w[Norway Sweden])
294
+ expect(@session).not_to have_no_select('City', with_options: ['London'])
206
295
  end
207
296
 
208
- it "should be true if a field with the given partial options is not on the page" do
209
- expect(@session).to have_no_select('Locale', :with_options => ['Uruguayan'])
210
- expect(@session).to have_no_select('Does not exist', :with_options => ['John'])
211
- expect(@session).to have_no_select('Region', :with_options => ['Norway', 'Sweden', 'Finland', 'Latvia'])
297
+ it 'should be true if a field with the given partial options is not on the page' do
298
+ expect(@session).to have_no_select('Locale', with_options: ['Uruguayan'])
299
+ expect(@session).to have_no_select('Does not exist', with_options: ['John'])
300
+ expect(@session).to have_no_select('Region', with_options: %w[Norway Sweden Finland Latvia])
212
301
  end
213
302
  end
303
+
304
+ it 'should support locator-less usage' do
305
+ expect(@session.has_no_select?(with_options: %w[Norway Sweden Finland Latvia])).to eq true
306
+ expect(@session).to have_no_select(with_options: ['New London'])
307
+ expect(@session.has_no_select?(id: 'form_underwear', with_selected: ['Boxers'])).to eq true
308
+ expect(@session).to have_no_select(id: 'form_underwear', with_selected: %w[Commando Boxers])
309
+ end
214
310
  end