capybara 2.18.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +945 -12
  4. data/License.txt +1 -1
  5. data/README.md +264 -90
  6. data/lib/capybara/config.rb +29 -57
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +35 -18
  9. data/lib/capybara/driver/node.rb +40 -10
  10. data/lib/capybara/dsl.rb +10 -7
  11. data/lib/capybara/helpers.rb +70 -31
  12. data/lib/capybara/minitest/spec.rb +185 -83
  13. data/lib/capybara/minitest.rb +232 -112
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +42 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +362 -135
  19. data/lib/capybara/node/finders.rb +151 -137
  20. data/lib/capybara/node/matchers.rb +394 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +12 -9
  25. data/lib/capybara/queries/base_query.rb +39 -28
  26. data/lib/capybara/queries/current_path_query.rb +21 -27
  27. data/lib/capybara/queries/match_query.rb +14 -7
  28. data/lib/capybara/queries/selector_query.rb +659 -149
  29. data/lib/capybara/queries/sibling_query.rb +11 -9
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +56 -38
  32. data/lib/capybara/queries/title_query.rb +8 -11
  33. data/lib/capybara/rack_test/browser.rb +114 -42
  34. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  35. data/lib/capybara/rack_test/driver.rb +22 -17
  36. data/lib/capybara/rack_test/errors.rb +6 -0
  37. data/lib/capybara/rack_test/form.rb +93 -58
  38. data/lib/capybara/rack_test/node.rb +184 -81
  39. data/lib/capybara/rails.rb +3 -7
  40. data/lib/capybara/registration_container.rb +41 -0
  41. data/lib/capybara/registrations/drivers.rb +42 -0
  42. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  43. data/lib/capybara/registrations/servers.rb +66 -0
  44. data/lib/capybara/result.rb +97 -63
  45. data/lib/capybara/rspec/features.rb +17 -50
  46. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  47. data/lib/capybara/rspec/matchers/base.rb +113 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/rspec/matchers.rb +146 -310
  61. data/lib/capybara/rspec.rb +7 -11
  62. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  63. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  64. data/lib/capybara/selector/css.rb +85 -13
  65. data/lib/capybara/selector/definition/button.rb +68 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +28 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +55 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/definition.rb +280 -0
  87. data/lib/capybara/selector/filter.rb +2 -17
  88. data/lib/capybara/selector/filter_set.rb +80 -33
  89. data/lib/capybara/selector/filters/base.rb +50 -6
  90. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  91. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  92. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  93. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  94. data/lib/capybara/selector/selector.rb +93 -210
  95. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  96. data/lib/capybara/selector.rb +475 -523
  97. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  99. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  100. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  101. data/lib/capybara/selenium/driver.rb +298 -267
  102. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  103. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  104. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  105. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  106. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  107. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  108. data/lib/capybara/selenium/extensions/find.rb +110 -0
  109. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  110. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  111. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  112. data/lib/capybara/selenium/node.rb +517 -145
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -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 +80 -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 +59 -67
  127. data/lib/capybara/session/config.rb +81 -67
  128. data/lib/capybara/session/matchers.rb +28 -20
  129. data/lib/capybara/session.rb +337 -365
  130. data/lib/capybara/spec/public/jquery.js +5 -5
  131. data/lib/capybara/spec/public/offset.js +6 -0
  132. data/lib/capybara/spec/public/test.js +151 -12
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +161 -57
  138. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  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.rb → assert_title_spec.rb} +22 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +117 -55
  148. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  149. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  151. data/lib/capybara/spec/session/click_link_spec.rb +93 -58
  152. data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
  153. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  163. data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
  164. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  167. data/lib/capybara/spec/session/find_link_spec.rb +46 -17
  168. data/lib/capybara/spec/session/find_spec.rb +260 -145
  169. data/lib/capybara/spec/session/first_spec.rb +80 -52
  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 +33 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
  174. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +100 -13
  180. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
  182. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +47 -6
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
  186. data/lib/capybara/spec/session/has_select_spec.rb +107 -72
  187. data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +183 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +106 -62
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  196. data/lib/capybara/spec/session/node_spec.rb +1024 -153
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -81
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +85 -53
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +83 -44
  224. data/lib/capybara/spec/spec_helper.rb +54 -44
  225. data/lib/capybara/spec/test_app.rb +158 -43
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +163 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  247. data/lib/capybara/spec/views/with_hover.erb +3 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +69 -12
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +30 -5
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope.erb +2 -2
  256. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  257. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  258. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  259. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  260. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  261. data/lib/capybara/spec/views/with_windows.erb +1 -1
  262. data/lib/capybara/spec/views/within_frames.erb +5 -2
  263. data/lib/capybara/version.rb +2 -1
  264. data/lib/capybara/window.rb +36 -34
  265. data/lib/capybara.rb +134 -107
  266. data/spec/basic_node_spec.rb +60 -34
  267. data/spec/capybara_spec.rb +63 -88
  268. data/spec/counter_spec.rb +35 -0
  269. data/spec/css_builder_spec.rb +101 -0
  270. data/spec/css_splitter_spec.rb +38 -0
  271. data/spec/dsl_spec.rb +85 -64
  272. data/spec/filter_set_spec.rb +27 -9
  273. data/spec/fixtures/certificate.pem +25 -0
  274. data/spec/fixtures/key.pem +27 -0
  275. data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
  276. data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
  277. data/spec/minitest_spec.rb +52 -7
  278. data/spec/minitest_spec_spec.rb +94 -63
  279. data/spec/per_session_config_spec.rb +14 -13
  280. data/spec/rack_test_spec.rb +194 -125
  281. data/spec/regexp_dissassembler_spec.rb +250 -0
  282. data/spec/result_spec.rb +111 -50
  283. data/spec/rspec/features_spec.rb +37 -31
  284. data/spec/rspec/scenarios_spec.rb +10 -8
  285. data/spec/rspec/shared_spec_matchers.rb +473 -422
  286. data/spec/rspec/views_spec.rb +5 -3
  287. data/spec/rspec_matchers_spec.rb +52 -11
  288. data/spec/rspec_spec.rb +109 -89
  289. data/spec/sauce_spec_chrome.rb +43 -0
  290. data/spec/selector_spec.rb +397 -68
  291. data/spec/selenium_spec_chrome.rb +187 -40
  292. data/spec/selenium_spec_chrome_remote.rb +96 -0
  293. data/spec/selenium_spec_edge.rb +60 -0
  294. data/spec/selenium_spec_firefox.rb +201 -41
  295. data/spec/selenium_spec_firefox_remote.rb +94 -0
  296. data/spec/selenium_spec_ie.rb +149 -0
  297. data/spec/selenium_spec_safari.rb +162 -0
  298. data/spec/server_spec.rb +213 -102
  299. data/spec/session_spec.rb +53 -16
  300. data/spec/shared_selenium_node.rb +79 -0
  301. data/spec/shared_selenium_session.rb +473 -122
  302. data/spec/spec_helper.rb +126 -7
  303. data/spec/whitespace_normalizer_spec.rb +54 -0
  304. data/spec/xpath_builder_spec.rb +93 -0
  305. metadata +355 -73
  306. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  307. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  308. data/.yard/yard_extensions.rb +0 -78
  309. data/lib/capybara/query.rb +0 -7
  310. data/lib/capybara/rspec/compound.rb +0 -95
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -234
  314. data/lib/capybara/spec/session/source_spec.rb +0 -0
  315. data/lib/capybara/spec/views/with_title.erb +0 -5
  316. data/spec/selenium_spec_marionette.rb +0 -127
@@ -1,20 +1,21 @@
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
+ it 'should be true if a field with the given value is on the page' do
18
19
  expect(@session).to have_select('form_locale', selected: 'English')
19
20
  expect(@session).to have_select('Region', selected: 'Norway')
20
21
  expect(@session).to have_select('Underwear', selected: [
@@ -22,7 +23,7 @@ Capybara::SpecHelper.spec '#has_select?' do
22
23
  ])
23
24
  end
24
25
 
25
- it "should be false if the given field is not on the page" do
26
+ it 'should be false if the given field is not on the page' do
26
27
  expect(@session).not_to have_select('Locale', selected: 'Swedish')
27
28
  expect(@session).not_to have_select('Does not exist', selected: 'John')
28
29
  expect(@session).not_to have_select('City', selected: 'Not there')
@@ -33,28 +34,28 @@ Capybara::SpecHelper.spec '#has_select?' do
33
34
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
34
35
  ])
35
36
  expect(@session).not_to have_select('Underwear', selected: [
36
- 'Boxerbriefs', 'Briefs','Commando', "Frenchman's Pantalons"
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
+ it 'should be true after the given value is selected' do
41
42
  @session.select('Swedish', from: 'Locale')
42
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
+ it 'should be false after a different value is selected' do
46
47
  @session.select('Swedish', from: 'Locale')
47
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
+ it 'should be true after the given values are selected' do
51
52
  @session.select('Boxers', from: 'Underwear')
52
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
+ it 'should be false after one of the values is unselected' do
58
59
  @session.unselect('Briefs', from: 'Underwear')
59
60
  expect(@session).not_to have_select('Underwear', selected: [
60
61
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
@@ -62,98 +63,132 @@ Capybara::SpecHelper.spec '#has_select?' do
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('Icecream', visible: :hidden, selected: 'Chocolate')
66
67
  expect(@session).to have_select('Sorbet', selected: 'Vanilla')
67
68
  end
68
69
  end
69
70
 
70
71
  context 'with partial select' do
71
- it "should be true if a field with the given partial values is on the page" do
72
- expect(@session).to have_select('Underwear', with_selected: ['Boxerbriefs', 'Briefs'])
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])
73
74
  end
74
75
 
75
- it "should be false if a field with the given partial values is not on the page" do
76
- expect(@session).not_to have_select('Underwear', with_selected: ['Boxerbriefs', 'Boxers'])
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])
77
78
  end
78
79
 
79
- it "should be true after the given partial value is selected" do
80
+ it 'should be true after the given partial value is selected' do
80
81
  @session.select('Boxers', from: 'Underwear')
81
- expect(@session).to have_select('Underwear', with_selected: ['Boxerbriefs', 'Boxers'])
82
+ expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
82
83
  end
83
84
 
84
- it "should be false after one of the given partial values is unselected" do
85
+ it 'should be false after one of the given partial values is unselected' do
85
86
  @session.unselect('Briefs', from: 'Underwear')
86
- expect(@session).not_to have_select('Underwear', with_selected: ['Boxerbriefs', 'Briefs'])
87
+ expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
87
88
  end
88
89
 
89
90
  it "should be true even when the selected values are invisible, regardless of the select's visibility" do
90
- expect(@session).to have_select('Dessert', visible: false, with_options: ['Pudding', 'Tiramisu'])
91
+ expect(@session).to have_select('Dessert', visible: :hidden, with_options: %w[Pudding Tiramisu])
91
92
  expect(@session).to have_select('Cake', with_selected: ['Chocolate Cake', 'Sponge Cake'])
92
93
  end
93
94
 
94
- it "should support non array partial values" do
95
+ it 'should support non array partial values' do
95
96
  expect(@session).to have_select('Underwear', with_selected: 'Briefs')
96
97
  expect(@session).not_to have_select('Underwear', with_selected: 'Boxers')
97
98
  end
98
99
  end
99
100
 
100
101
  context 'with exact options' do
101
- it "should be true if a field with the given options is on the page" do
102
- expect(@session).to have_select('Region', options: ['Norway', 'Sweden', 'Finland'])
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])
103
104
  expect(@session).to have_select('Tendency', options: [])
104
105
  end
105
106
 
106
- it "should be false if the given field is not on the page" do
107
+ it 'should be false if the given field is not on the page' do
107
108
  expect(@session).not_to have_select('Locale', options: ['Swedish'])
108
109
  expect(@session).not_to have_select('Does not exist', options: ['John'])
109
110
  expect(@session).not_to have_select('City', options: ['London', 'Made up city'])
110
- expect(@session).not_to have_select('Region', options: ['Norway', 'Sweden'])
111
- expect(@session).not_to have_select('Region', options: ['Norway', 'Norway', 'Norway'])
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])
112
113
  end
113
114
 
114
- it "should be true even when the options are invisible, if the select itself is invisible" do
115
- expect(@session).to have_select("Icecream", visible: false, options: ['Chocolate', 'Vanilla', 'Strawberry'])
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])
123
+ end
124
+
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'])
127
+ end
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])
116
145
  end
117
146
  end
118
147
 
119
148
  context 'with partial options' do
120
- it "should be true if a field with the given partial options is on the page" do
121
- expect(@session).to have_select('Region', with_options: ['Norway', 'Sweden'])
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])
122
151
  expect(@session).to have_select('City', with_options: ['London'])
123
152
  end
124
153
 
125
- it "should be false if a field with the given partial options is not on the page" do
154
+ it 'should be false if a field with the given partial options is not on the page' do
126
155
  expect(@session).not_to have_select('Locale', with_options: ['Uruguayan'])
127
156
  expect(@session).not_to have_select('Does not exist', with_options: ['John'])
128
- expect(@session).not_to have_select('Region', with_options: ['Norway', 'Sweden', 'Finland', 'Latvia'])
157
+ expect(@session).not_to have_select('Region', with_options: %w[Norway Sweden Finland Latvia])
129
158
  end
130
159
 
131
- it "should be true even when the options are invisible, if the select itself is invisible" do
132
- 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])
133
162
  end
134
163
  end
135
164
 
136
165
  context 'with multiple option' do
137
- it "should find multiple selects if true" do
166
+ it 'should find multiple selects if true' do
138
167
  expect(@session).to have_select('form_languages', multiple: true)
139
168
  expect(@session).not_to have_select('form_other_title', multiple: true)
140
169
  end
141
170
 
142
- it "should not find multiple selects if false" do
171
+ it 'should not find multiple selects if false' do
143
172
  expect(@session).not_to have_select('form_languages', multiple: false)
144
173
  expect(@session).to have_select('form_other_title', multiple: false)
145
174
  end
146
175
 
147
- it "should find both if not specified" do
176
+ it 'should find both if not specified' do
148
177
  expect(@session).to have_select('form_languages')
149
178
  expect(@session).to have_select('form_other_title')
150
179
  end
151
180
  end
152
181
 
153
- it "should support locator-less usage" do
154
- expect(@session.has_select?(with_options: ['Norway', 'Sweden'])).to eq true
182
+ it 'should raise an error if an invalid option is passed' do
183
+ expect do
184
+ expect(@session).to have_select('form_languages', invalid: true)
185
+ end.to raise_error(ArgumentError, 'Invalid option(s) :invalid, should be one of :above, :below, :left_of, :right_of, :near, :count, :minimum, :maximum, :between, :text, :id, :class, :style, :visible, :obscured, :exact, :exact_text, :normalize_ws, :match, :wait, :filter_set, :focused, :disabled, :name, :placeholder, :options, :enabled_options, :disabled_options, :selected, :with_selected, :multiple, :with_options')
186
+ end
187
+
188
+ it 'should support locator-less usage' do
189
+ expect(@session.has_select?(with_options: %w[Norway Sweden])).to be true
155
190
  expect(@session).to have_select(with_options: ['London'])
156
- expect(@session.has_select?(with_selected: ['Commando', 'Boxerbriefs'])).to eq true
191
+ expect(@session.has_select?(with_selected: %w[Commando Boxerbriefs])).to be true
157
192
  expect(@session).to have_select(with_selected: ['Briefs'])
158
193
  end
159
194
  end
@@ -161,18 +196,18 @@ end
161
196
  Capybara::SpecHelper.spec '#has_no_select?' do
162
197
  before { @session.visit('/form') }
163
198
 
164
- it "should be false if the field is on the page" do
199
+ it 'should be false if the field is on the page' do
165
200
  expect(@session).not_to have_no_select('Locale')
166
201
  expect(@session).not_to have_no_select('form_region')
167
202
  expect(@session).not_to have_no_select('Languages')
168
203
  end
169
204
 
170
- it "should be true if the field is not on the page" do
205
+ it 'should be true if the field is not on the page' do
171
206
  expect(@session).to have_no_select('Monkey')
172
207
  end
173
208
 
174
209
  context 'with selected value' do
175
- it "should be false if a field with the given value is on the page" do
210
+ it 'should be false if a field with the given value is on the page' do
176
211
  expect(@session).not_to have_no_select('form_locale', selected: 'English')
177
212
  expect(@session).not_to have_no_select('Region', selected: 'Norway')
178
213
  expect(@session).not_to have_no_select('Underwear', selected: [
@@ -180,7 +215,7 @@ Capybara::SpecHelper.spec '#has_no_select?' do
180
215
  ])
181
216
  end
182
217
 
183
- it "should be true if the given field is not on the page" do
218
+ it 'should be true if the given field is not on the page' do
184
219
  expect(@session).to have_no_select('Locale', selected: 'Swedish')
185
220
  expect(@session).to have_no_select('Does not exist', selected: 'John')
186
221
  expect(@session).to have_no_select('City', selected: 'Not there')
@@ -191,28 +226,28 @@ Capybara::SpecHelper.spec '#has_no_select?' do
191
226
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
192
227
  ])
193
228
  expect(@session).to have_no_select('Underwear', selected: [
194
- 'Boxerbriefs', 'Briefs','Commando', "Frenchman's Pantalons"
229
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
195
230
  ])
196
231
  end
197
232
 
198
- it "should be false after the given value is selected" do
233
+ it 'should be false after the given value is selected' do
199
234
  @session.select('Swedish', from: 'Locale')
200
235
  expect(@session).not_to have_no_select('Locale', selected: 'Swedish')
201
236
  end
202
237
 
203
- it "should be true after a different value is selected" do
238
+ it 'should be true after a different value is selected' do
204
239
  @session.select('Swedish', from: 'Locale')
205
240
  expect(@session).to have_no_select('Locale', selected: 'English')
206
241
  end
207
242
 
208
- it "should be false after the given values are selected" do
243
+ it 'should be false after the given values are selected' do
209
244
  @session.select('Boxers', from: 'Underwear')
210
245
  expect(@session).not_to have_no_select('Underwear', selected: [
211
246
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
212
247
  ])
213
248
  end
214
249
 
215
- it "should be true after one of the values is unselected" do
250
+ it 'should be true after one of the values is unselected' do
216
251
  @session.unselect('Briefs', from: 'Underwear')
217
252
  expect(@session).to have_no_select('Underwear', selected: [
218
253
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
@@ -221,61 +256,61 @@ Capybara::SpecHelper.spec '#has_no_select?' do
221
256
  end
222
257
 
223
258
  context 'with partial select' do
224
- it "should be false if a field with the given partial values is on the page" do
225
- expect(@session).not_to have_no_select('Underwear', with_selected: ['Boxerbriefs', 'Briefs'])
259
+ it 'should be false if a field with the given partial values is on the page' do
260
+ expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
226
261
  end
227
262
 
228
- it "should be true if a field with the given partial values is not on the page" do
229
- expect(@session).to have_no_select('Underwear', with_selected: ['Boxerbriefs', 'Boxers'])
263
+ it 'should be true if a field with the given partial values is not on the page' do
264
+ expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
230
265
  end
231
266
 
232
- it "should be false after the given partial value is selected" do
267
+ it 'should be false after the given partial value is selected' do
233
268
  @session.select('Boxers', from: 'Underwear')
234
- expect(@session).not_to have_no_select('Underwear', with_selected: ['Boxerbriefs', 'Boxers'])
269
+ expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
235
270
  end
236
271
 
237
- it "should be true after one of the given partial values is unselected" do
272
+ it 'should be true after one of the given partial values is unselected' do
238
273
  @session.unselect('Briefs', from: 'Underwear')
239
- expect(@session).to have_no_select('Underwear', with_selected: ['Boxerbriefs', 'Briefs'])
274
+ expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
240
275
  end
241
276
 
242
- it "should support non array partial values" do
277
+ it 'should support non array partial values' do
243
278
  expect(@session).not_to have_no_select('Underwear', with_selected: 'Briefs')
244
279
  expect(@session).to have_no_select('Underwear', with_selected: 'Boxers')
245
280
  end
246
281
  end
247
282
 
248
283
  context 'with exact options' do
249
- it "should be false if a field with the given options is on the page" do
250
- expect(@session).not_to have_no_select('Region', options: ['Norway', 'Sweden', 'Finland'])
284
+ it 'should be false if a field with the given options is on the page' do
285
+ expect(@session).not_to have_no_select('Region', options: %w[Norway Sweden Finland])
251
286
  end
252
287
 
253
- it "should be true if the given field is not on the page" do
288
+ it 'should be true if the given field is not on the page' do
254
289
  expect(@session).to have_no_select('Locale', options: ['Swedish'])
255
290
  expect(@session).to have_no_select('Does not exist', options: ['John'])
256
291
  expect(@session).to have_no_select('City', options: ['London', 'Made up city'])
257
- expect(@session).to have_no_select('Region', options: ['Norway', 'Sweden'])
258
- expect(@session).to have_no_select('Region', options: ['Norway', 'Norway', 'Norway'])
292
+ expect(@session).to have_no_select('Region', options: %w[Norway Sweden])
293
+ expect(@session).to have_no_select('Region', options: %w[Norway Norway Norway])
259
294
  end
260
295
  end
261
296
 
262
297
  context 'with partial options' do
263
- it "should be false if a field with the given partial options is on the page" do
264
- expect(@session).not_to have_no_select('Region', with_options: ['Norway', 'Sweden'])
298
+ it 'should be false if a field with the given partial options is on the page' do
299
+ expect(@session).not_to have_no_select('Region', with_options: %w[Norway Sweden])
265
300
  expect(@session).not_to have_no_select('City', with_options: ['London'])
266
301
  end
267
302
 
268
- it "should be true if a field with the given partial options is not on the page" do
303
+ it 'should be true if a field with the given partial options is not on the page' do
269
304
  expect(@session).to have_no_select('Locale', with_options: ['Uruguayan'])
270
305
  expect(@session).to have_no_select('Does not exist', with_options: ['John'])
271
- expect(@session).to have_no_select('Region', with_options: ['Norway', 'Sweden', 'Finland', 'Latvia'])
306
+ expect(@session).to have_no_select('Region', with_options: %w[Norway Sweden Finland Latvia])
272
307
  end
273
308
  end
274
309
 
275
- it "should support locator-less usage" do
276
- expect(@session.has_no_select?(with_options: ['Norway', 'Sweden', 'Finland', 'Latvia'])).to eq true
277
- expect(@session).to have_no_select(with_options: ['New London'] )
278
- expect(@session.has_no_select?(with_selected: ['Boxers'])).to eq true
279
- expect(@session).to have_no_select(with_selected: ['Commando', 'Boxers'])
310
+ it 'should support locator-less usage' do
311
+ expect(@session.has_no_select?(with_options: %w[Norway Sweden Finland Latvia])).to be true
312
+ expect(@session).to have_no_select(with_options: ['New London'])
313
+ expect(@session.has_no_select?(id: 'form_underwear', with_selected: ['Boxers'])).to be true
314
+ expect(@session).to have_no_select(id: 'form_underwear', with_selected: %w[Commando Boxers])
280
315
  end
281
316
  end