capybara 3.0.0 → 3.36.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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +777 -10
  4. data/License.txt +1 -1
  5. data/README.md +75 -58
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +34 -9
  10. data/lib/capybara/dsl.rb +14 -6
  11. data/lib/capybara/helpers.rb +52 -7
  12. data/lib/capybara/minitest/spec.rb +173 -84
  13. data/lib/capybara/minitest.rb +250 -144
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +34 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +339 -113
  19. data/lib/capybara/node/finders.rb +95 -82
  20. data/lib/capybara/node/matchers.rb +338 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +9 -10
  24. data/lib/capybara/queries/base_query.rb +25 -18
  25. data/lib/capybara/queries/current_path_query.rb +16 -6
  26. data/lib/capybara/queries/match_query.rb +11 -0
  27. data/lib/capybara/queries/selector_query.rb +600 -103
  28. data/lib/capybara/queries/sibling_query.rb +9 -7
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +40 -22
  31. data/lib/capybara/queries/title_query.rb +2 -2
  32. data/lib/capybara/rack_test/browser.rb +47 -28
  33. data/lib/capybara/rack_test/driver.rb +12 -3
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +53 -50
  36. data/lib/capybara/rack_test/node.rb +114 -37
  37. data/lib/capybara/rails.rb +1 -1
  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 +86 -52
  43. data/lib/capybara/rspec/features.rb +8 -10
  44. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  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 +138 -316
  59. data/lib/capybara/rspec.rb +3 -2
  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 +89 -12
  63. data/lib/capybara/selector/definition/button.rb +68 -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 +279 -0
  85. data/lib/capybara/selector/filter.rb +1 -0
  86. data/lib/capybara/selector/filter_set.rb +72 -27
  87. data/lib/capybara/selector/filters/base.rb +45 -2
  88. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +85 -200
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +226 -537
  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 +296 -238
  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 +436 -166
  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 +69 -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 +58 -67
  127. data/lib/capybara/session/config.rb +38 -6
  128. data/lib/capybara/session/matchers.rb +26 -19
  129. data/lib/capybara/session.rb +258 -190
  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 +122 -8
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +135 -42
  138. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  140. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  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.rb → assert_text_spec.rb} +62 -38
  144. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +120 -72
  146. data/lib/capybara/spec/session/body_spec.rb +11 -13
  147. data/lib/capybara/spec/session/check_spec.rb +111 -51
  148. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  149. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  151. data/lib/capybara/spec/session/click_link_spec.rb +78 -55
  152. data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
  153. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -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 +8 -6
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  163. data/lib/capybara/spec/session/fill_in_spec.rb +104 -44
  164. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  166. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  167. data/lib/capybara/spec/session/find_link_spec.rb +32 -14
  168. data/lib/capybara/spec/session/find_spec.rb +236 -141
  169. data/lib/capybara/spec/session/first_spec.rb +44 -43
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +44 -19
  174. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +18 -18
  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 +92 -12
  180. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +48 -33
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +30 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +26 -24
  185. data/lib/capybara/spec/session/has_select_spec.rb +75 -47
  186. data/lib/capybara/spec/session/has_selector_spec.rb +102 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +170 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +108 -52
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +871 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +52 -37
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  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 +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +40 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +59 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +10 -7
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +69 -44
  223. data/lib/capybara/spec/spec_helper.rb +41 -53
  224. data/lib/capybara/spec/test_app.rb +79 -40
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +134 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +43 -10
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  256. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  257. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  258. data/lib/capybara/spec/views/with_windows.erb +1 -1
  259. data/lib/capybara/spec/views/within_frames.erb +1 -1
  260. data/lib/capybara/version.rb +1 -1
  261. data/lib/capybara/window.rb +31 -25
  262. data/lib/capybara.rb +120 -100
  263. data/spec/basic_node_spec.rb +59 -34
  264. data/spec/capybara_spec.rb +54 -52
  265. data/spec/css_builder_spec.rb +101 -0
  266. data/spec/css_splitter_spec.rb +38 -0
  267. data/spec/dsl_spec.rb +80 -53
  268. data/spec/filter_set_spec.rb +24 -7
  269. data/spec/fixtures/certificate.pem +25 -0
  270. data/spec/fixtures/key.pem +27 -0
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +38 -5
  274. data/spec/minitest_spec_spec.rb +88 -62
  275. data/spec/per_session_config_spec.rb +5 -5
  276. data/spec/rack_test_spec.rb +169 -115
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +86 -33
  279. data/spec/rspec/features_spec.rb +26 -23
  280. data/spec/rspec/scenarios_spec.rb +8 -4
  281. data/spec/rspec/shared_spec_matchers.rb +393 -363
  282. data/spec/rspec/views_spec.rb +4 -3
  283. data/spec/rspec_matchers_spec.rb +10 -10
  284. data/spec/rspec_spec.rb +109 -85
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +391 -61
  287. data/spec/selenium_spec_chrome.rb +180 -41
  288. data/spec/selenium_spec_chrome_remote.rb +101 -0
  289. data/spec/selenium_spec_edge.rb +28 -8
  290. data/spec/selenium_spec_firefox.rb +211 -0
  291. data/spec/selenium_spec_firefox_remote.rb +80 -0
  292. data/spec/selenium_spec_ie.rb +127 -11
  293. data/spec/selenium_spec_safari.rb +156 -0
  294. data/spec/server_spec.rb +177 -78
  295. data/spec/session_spec.rb +52 -16
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +455 -123
  298. data/spec/spec_helper.rb +91 -2
  299. data/spec/xpath_builder_spec.rb +93 -0
  300. metadata +343 -42
  301. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  302. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  303. data/.yard/yard_extensions.rb +0 -78
  304. data/lib/capybara/rspec/compound.rb +0 -90
  305. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -143
@@ -5,19 +5,31 @@ Capybara::SpecHelper.spec '#has_link?' do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- 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
9
9
  expect(@session).to have_link('foo')
10
10
  expect(@session).to have_link('awesome title')
11
11
  expect(@session).to have_link('A link', href: '/with_simple_html')
12
12
  expect(@session).to have_link(:'A link', href: :'/with_simple_html')
13
- expect(@session).to have_link('A link', href: /\/with_simple_html/)
13
+ expect(@session).to have_link('A link', href: %r{/with_simple_html})
14
14
  end
15
15
 
16
- 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
17
17
  expect(@session).not_to have_link('monkey')
18
18
  expect(@session).not_to have_link('A link', href: '/nonexistent-href')
19
19
  expect(@session).not_to have_link('A link', href: /nonexistent/)
20
20
  end
21
+
22
+ context 'with focused:', requires: [:active_element] do
23
+ it 'should be true if the given link is on the page and has focus' do
24
+ @session.send_keys(:tab)
25
+
26
+ expect(@session).to have_link('labore', focused: true)
27
+ end
28
+
29
+ it 'should be false if the given link is on the page and does not have focus' do
30
+ expect(@session).to have_link('labore', focused: false)
31
+ end
32
+ end
21
33
  end
22
34
 
23
35
  Capybara::SpecHelper.spec '#has_no_link?' do
@@ -25,15 +37,27 @@ Capybara::SpecHelper.spec '#has_no_link?' do
25
37
  @session.visit('/with_html')
26
38
  end
27
39
 
28
- it "should be false if the given link is on the page" do
40
+ it 'should be false if the given link is on the page' do
29
41
  expect(@session).not_to have_no_link('foo')
30
42
  expect(@session).not_to have_no_link('awesome title')
31
43
  expect(@session).not_to have_no_link('A link', href: '/with_simple_html')
32
44
  end
33
45
 
34
- it "should be true if the given link is not on the page" do
46
+ it 'should be true if the given link is not on the page' do
35
47
  expect(@session).to have_no_link('monkey')
36
48
  expect(@session).to have_no_link('A link', href: '/nonexistent-href')
37
- expect(@session).to have_no_link('A link', href: /\/nonexistent-href/)
49
+ expect(@session).to have_no_link('A link', href: %r{/nonexistent-href})
50
+ end
51
+
52
+ context 'with focused:', requires: [:active_element] do
53
+ it 'should be true if the given link is on the page and has focus' do
54
+ expect(@session).to have_no_link('labore', focused: true)
55
+ end
56
+
57
+ it 'should be false if the given link is on the page and does not have focus' do
58
+ @session.send_keys(:tab)
59
+
60
+ expect(@session).to have_no_link('labore', focused: false)
61
+ end
38
62
  end
39
63
  end
@@ -1,32 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#have_none_of_selectors' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  end
5
7
 
6
- it "should be false if any of the given locators are on the page" do
8
+ it 'should be false if any of the given locators are on the page' do
7
9
  expect do
8
- expect(@session).to have_none_of_selectors(:xpath, "//p", "//a")
10
+ expect(@session).to have_none_of_selectors(:xpath, '//p', '//a')
9
11
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
10
12
  expect do
11
- expect(@session).to have_none_of_selectors(:css, "p a#foo")
13
+ expect(@session).to have_none_of_selectors(:css, 'p a#foo')
12
14
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
13
15
  end
14
16
 
15
- it "should be true if none of the given locators are on the page" do
16
- expect(@session).to have_none_of_selectors(:xpath, "//abbr", "//td")
17
- expect(@session).to have_none_of_selectors(:css, "p a#doesnotexist", "abbr")
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')
18
20
  end
19
21
 
20
- it "should use default selector" do
22
+ it 'should use default selector' do
21
23
  Capybara.default_selector = :css
22
- expect(@session).to have_none_of_selectors("p a#doesnotexist", "abbr")
24
+ expect(@session).to have_none_of_selectors('p a#doesnotexist', 'abbr')
23
25
  expect do
24
- expect(@session).to have_none_of_selectors("abbr", "p a#foo")
26
+ expect(@session).to have_none_of_selectors('abbr', 'p a#foo')
25
27
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
26
28
  end
27
29
 
28
- context "should respect scopes" do
29
- it "when used with `within`" do
30
+ context 'should respect scopes' do
31
+ it 'when used with `within`' do
30
32
  @session.within "//p[@id='first']" do
31
33
  expect do
32
34
  expect(@session).to have_none_of_selectors(".//a[@id='foo']")
@@ -35,7 +37,7 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do
35
37
  end
36
38
  end
37
39
 
38
- it "when called on an element" do
40
+ it 'when called on an element' do
39
41
  el = @session.find "//p[@id='first']"
40
42
  expect do
41
43
  expect(el).to have_none_of_selectors(".//a[@id='foo']")
@@ -44,33 +46,33 @@ Capybara::SpecHelper.spec '#have_none_of_selectors' do
44
46
  end
45
47
  end
46
48
 
47
- context "with options" do
48
- it "should apply the options to all locators" do
49
+ context 'with options' do
50
+ it 'should apply the options to all locators' do
49
51
  expect do
50
- expect(@session).to have_none_of_selectors("//p//a", text: "Redirect")
52
+ expect(@session).to have_none_of_selectors('//p//a', text: 'Redirect')
51
53
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
52
- expect(@session).to have_none_of_selectors("//p", text: "Doesnotexist")
54
+ expect(@session).to have_none_of_selectors('//p', text: 'Doesnotexist')
53
55
  end
54
56
 
55
- it "should discard all matches where the given regexp is matched" do
57
+ it 'should discard all matches where the given regexp is matched' do
56
58
  expect do
57
- expect(@session).to have_none_of_selectors("//p//a", text: /re[dab]i/i, count: 1)
59
+ expect(@session).to have_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1)
58
60
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
59
- expect(@session).to have_none_of_selectors("//p//a", text: /Red$/)
61
+ expect(@session).to have_none_of_selectors('//p//a', text: /Red$/)
60
62
  end
61
63
  end
62
64
 
63
- context "with wait", requires: [:js] do
64
- it "should not find elements if they appear after given wait duration" do
65
+ context 'with wait', requires: [:js] do
66
+ it 'should not find elements if they appear after given wait duration' do
65
67
  @session.visit('/with_js')
66
68
  @session.click_link('Click me')
67
- expect(@session).to have_none_of_selectors(:css, "#new_field", "a#has-been-clicked", wait: 0.1)
69
+ expect(@session).to have_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
68
70
  end
69
71
  end
70
72
 
71
- it "cannot be negated" do
73
+ it 'cannot be negated' do
72
74
  expect do
73
- expect(@session).not_to have_none_of_selectors(:css, "p a#foo", "h2#h2one", "h2#h2two")
75
+ expect(@session).not_to have_none_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
74
76
  end.to raise_error ArgumentError
75
77
  end
76
78
  end
@@ -3,19 +3,19 @@
3
3
  Capybara::SpecHelper.spec '#has_select?' do
4
4
  before { @session.visit('/form') }
5
5
 
6
- 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
7
7
  expect(@session).to have_select('Locale')
8
8
  expect(@session).to have_select('form_region')
9
9
  expect(@session).to have_select('Languages')
10
10
  expect(@session).to have_select(:Languages)
11
11
  end
12
12
 
13
- 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
14
14
  expect(@session).not_to have_select('Monkey')
15
15
  end
16
16
 
17
17
  context 'with selected value' do
18
- 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
19
19
  expect(@session).to have_select('form_locale', selected: 'English')
20
20
  expect(@session).to have_select('Region', selected: 'Norway')
21
21
  expect(@session).to have_select('Underwear', selected: [
@@ -23,7 +23,7 @@ Capybara::SpecHelper.spec '#has_select?' do
23
23
  ])
24
24
  end
25
25
 
26
- 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
27
27
  expect(@session).not_to have_select('Locale', selected: 'Swedish')
28
28
  expect(@session).not_to have_select('Does not exist', selected: 'John')
29
29
  expect(@session).not_to have_select('City', selected: 'Not there')
@@ -38,24 +38,24 @@ Capybara::SpecHelper.spec '#has_select?' do
38
38
  ])
39
39
  end
40
40
 
41
- it "should be true after the given value is selected" do
41
+ it 'should be true after the given value is selected' do
42
42
  @session.select('Swedish', from: 'Locale')
43
43
  expect(@session).to have_select('Locale', selected: 'Swedish')
44
44
  end
45
45
 
46
- it "should be false after a different value is selected" do
46
+ it 'should be false after a different value is selected' do
47
47
  @session.select('Swedish', from: 'Locale')
48
48
  expect(@session).not_to have_select('Locale', selected: 'English')
49
49
  end
50
50
 
51
- it "should be true after the given values are selected" do
51
+ it 'should be true after the given values are selected' do
52
52
  @session.select('Boxers', from: 'Underwear')
53
53
  expect(@session).to have_select('Underwear', selected: [
54
54
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
55
55
  ])
56
56
  end
57
57
 
58
- 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
59
59
  @session.unselect('Briefs', from: 'Underwear')
60
60
  expect(@session).not_to have_select('Underwear', selected: [
61
61
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
@@ -63,48 +63,48 @@ Capybara::SpecHelper.spec '#has_select?' do
63
63
  end
64
64
 
65
65
  it "should be true even when the selected option invisible, regardless of the select's visibility" do
66
- expect(@session).to have_select('Icecream', visible: false, selected: 'Chocolate')
66
+ expect(@session).to have_select('Icecream', visible: :hidden, selected: 'Chocolate')
67
67
  expect(@session).to have_select('Sorbet', selected: 'Vanilla')
68
68
  end
69
69
  end
70
70
 
71
71
  context 'with partial select' do
72
- it "should be true if a field with the given partial values is on the page" do
72
+ it 'should be true if a field with the given partial values is on the page' do
73
73
  expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
74
74
  end
75
75
 
76
- it "should be false if a field with the given partial values is not on the page" do
76
+ it 'should be false if a field with the given partial values is not on the page' do
77
77
  expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
78
78
  end
79
79
 
80
- 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
81
81
  @session.select('Boxers', from: 'Underwear')
82
82
  expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
83
83
  end
84
84
 
85
- 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
86
86
  @session.unselect('Briefs', from: 'Underwear')
87
87
  expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
88
88
  end
89
89
 
90
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: false, with_options: %w[Pudding Tiramisu])
91
+ expect(@session).to have_select('Dessert', visible: :hidden, with_options: %w[Pudding Tiramisu])
92
92
  expect(@session).to have_select('Cake', with_selected: ['Chocolate Cake', 'Sponge Cake'])
93
93
  end
94
94
 
95
- it "should support non array partial values" do
95
+ it 'should support non array partial values' do
96
96
  expect(@session).to have_select('Underwear', with_selected: 'Briefs')
97
97
  expect(@session).not_to have_select('Underwear', with_selected: 'Boxers')
98
98
  end
99
99
  end
100
100
 
101
101
  context 'with exact options' do
102
- it "should be true if a field with the given options is on the page" do
102
+ it 'should be true if a field with the given options is on the page' do
103
103
  expect(@session).to have_select('Region', options: %w[Norway Sweden Finland])
104
104
  expect(@session).to have_select('Tendency', options: [])
105
105
  end
106
106
 
107
- 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
108
108
  expect(@session).not_to have_select('Locale', options: ['Swedish'])
109
109
  expect(@session).not_to have_select('Does not exist', options: ['John'])
110
110
  expect(@session).not_to have_select('City', options: ['London', 'Made up city'])
@@ -112,46 +112,74 @@ Capybara::SpecHelper.spec '#has_select?' do
112
112
  expect(@session).not_to have_select('Region', options: %w[Norway Norway Norway])
113
113
  end
114
114
 
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: false, options: %w[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])
117
145
  end
118
146
  end
119
147
 
120
148
  context 'with partial options' do
121
- it "should be true if a field with the given partial options is on the page" do
149
+ it 'should be true if a field with the given partial options is on the page' do
122
150
  expect(@session).to have_select('Region', with_options: %w[Norway Sweden])
123
151
  expect(@session).to have_select('City', with_options: ['London'])
124
152
  end
125
153
 
126
- 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
127
155
  expect(@session).not_to have_select('Locale', with_options: ['Uruguayan'])
128
156
  expect(@session).not_to have_select('Does not exist', with_options: ['John'])
129
157
  expect(@session).not_to have_select('Region', with_options: %w[Norway Sweden Finland Latvia])
130
158
  end
131
159
 
132
- it "should be true even when the options are invisible, if the select itself is invisible" do
133
- expect(@session).to have_select("Icecream", visible: false, with_options: %w[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])
134
162
  end
135
163
  end
136
164
 
137
165
  context 'with multiple option' do
138
- it "should find multiple selects if true" do
166
+ it 'should find multiple selects if true' do
139
167
  expect(@session).to have_select('form_languages', multiple: true)
140
168
  expect(@session).not_to have_select('form_other_title', multiple: true)
141
169
  end
142
170
 
143
- it "should not find multiple selects if false" do
171
+ it 'should not find multiple selects if false' do
144
172
  expect(@session).not_to have_select('form_languages', multiple: false)
145
173
  expect(@session).to have_select('form_other_title', multiple: false)
146
174
  end
147
175
 
148
- it "should find both if not specified" do
176
+ it 'should find both if not specified' do
149
177
  expect(@session).to have_select('form_languages')
150
178
  expect(@session).to have_select('form_other_title')
151
179
  end
152
180
  end
153
181
 
154
- it "should support locator-less usage" do
182
+ it 'should support locator-less usage' do
155
183
  expect(@session.has_select?(with_options: %w[Norway Sweden])).to eq true
156
184
  expect(@session).to have_select(with_options: ['London'])
157
185
  expect(@session.has_select?(with_selected: %w[Commando Boxerbriefs])).to eq true
@@ -162,18 +190,18 @@ end
162
190
  Capybara::SpecHelper.spec '#has_no_select?' do
163
191
  before { @session.visit('/form') }
164
192
 
165
- 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
166
194
  expect(@session).not_to have_no_select('Locale')
167
195
  expect(@session).not_to have_no_select('form_region')
168
196
  expect(@session).not_to have_no_select('Languages')
169
197
  end
170
198
 
171
- 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
172
200
  expect(@session).to have_no_select('Monkey')
173
201
  end
174
202
 
175
203
  context 'with selected value' do
176
- it "should be false if a field with the given value is on the page" do
204
+ it 'should be false if a field with the given value is on the page' do
177
205
  expect(@session).not_to have_no_select('form_locale', selected: 'English')
178
206
  expect(@session).not_to have_no_select('Region', selected: 'Norway')
179
207
  expect(@session).not_to have_no_select('Underwear', selected: [
@@ -181,7 +209,7 @@ Capybara::SpecHelper.spec '#has_no_select?' do
181
209
  ])
182
210
  end
183
211
 
184
- it "should be true if the given field is not on the page" do
212
+ it 'should be true if the given field is not on the page' do
185
213
  expect(@session).to have_no_select('Locale', selected: 'Swedish')
186
214
  expect(@session).to have_no_select('Does not exist', selected: 'John')
187
215
  expect(@session).to have_no_select('City', selected: 'Not there')
@@ -196,24 +224,24 @@ Capybara::SpecHelper.spec '#has_no_select?' do
196
224
  ])
197
225
  end
198
226
 
199
- it "should be false after the given value is selected" do
227
+ it 'should be false after the given value is selected' do
200
228
  @session.select('Swedish', from: 'Locale')
201
229
  expect(@session).not_to have_no_select('Locale', selected: 'Swedish')
202
230
  end
203
231
 
204
- it "should be true after a different value is selected" do
232
+ it 'should be true after a different value is selected' do
205
233
  @session.select('Swedish', from: 'Locale')
206
234
  expect(@session).to have_no_select('Locale', selected: 'English')
207
235
  end
208
236
 
209
- it "should be false after the given values are selected" do
237
+ it 'should be false after the given values are selected' do
210
238
  @session.select('Boxers', from: 'Underwear')
211
239
  expect(@session).not_to have_no_select('Underwear', selected: [
212
240
  'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
213
241
  ])
214
242
  end
215
243
 
216
- it "should be true after one of the values is unselected" do
244
+ it 'should be true after one of the values is unselected' do
217
245
  @session.unselect('Briefs', from: 'Underwear')
218
246
  expect(@session).to have_no_select('Underwear', selected: [
219
247
  'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
@@ -222,36 +250,36 @@ Capybara::SpecHelper.spec '#has_no_select?' do
222
250
  end
223
251
 
224
252
  context 'with partial select' do
225
- it "should be false if a field with the given partial values is on the page" do
253
+ it 'should be false if a field with the given partial values is on the page' do
226
254
  expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
227
255
  end
228
256
 
229
- it "should be true if a field with the given partial values is not on the page" do
257
+ it 'should be true if a field with the given partial values is not on the page' do
230
258
  expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
231
259
  end
232
260
 
233
- it "should be false after the given partial value is selected" do
261
+ it 'should be false after the given partial value is selected' do
234
262
  @session.select('Boxers', from: 'Underwear')
235
263
  expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
236
264
  end
237
265
 
238
- it "should be true after one of the given partial values is unselected" do
266
+ it 'should be true after one of the given partial values is unselected' do
239
267
  @session.unselect('Briefs', from: 'Underwear')
240
268
  expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
241
269
  end
242
270
 
243
- it "should support non array partial values" do
271
+ it 'should support non array partial values' do
244
272
  expect(@session).not_to have_no_select('Underwear', with_selected: 'Briefs')
245
273
  expect(@session).to have_no_select('Underwear', with_selected: 'Boxers')
246
274
  end
247
275
  end
248
276
 
249
277
  context 'with exact options' do
250
- it "should be false if a field with the given options is on the page" do
278
+ it 'should be false if a field with the given options is on the page' do
251
279
  expect(@session).not_to have_no_select('Region', options: %w[Norway Sweden Finland])
252
280
  end
253
281
 
254
- it "should be true if the given field is not on the page" do
282
+ it 'should be true if the given field is not on the page' do
255
283
  expect(@session).to have_no_select('Locale', options: ['Swedish'])
256
284
  expect(@session).to have_no_select('Does not exist', options: ['John'])
257
285
  expect(@session).to have_no_select('City', options: ['London', 'Made up city'])
@@ -261,22 +289,22 @@ Capybara::SpecHelper.spec '#has_no_select?' do
261
289
  end
262
290
 
263
291
  context 'with partial options' do
264
- it "should be false if a field with the given partial options is on the page" do
292
+ it 'should be false if a field with the given partial options is on the page' do
265
293
  expect(@session).not_to have_no_select('Region', with_options: %w[Norway Sweden])
266
294
  expect(@session).not_to have_no_select('City', with_options: ['London'])
267
295
  end
268
296
 
269
- it "should be true if a field with the given partial options is not on the page" do
297
+ it 'should be true if a field with the given partial options is not on the page' do
270
298
  expect(@session).to have_no_select('Locale', with_options: ['Uruguayan'])
271
299
  expect(@session).to have_no_select('Does not exist', with_options: ['John'])
272
300
  expect(@session).to have_no_select('Region', with_options: %w[Norway Sweden Finland Latvia])
273
301
  end
274
302
  end
275
303
 
276
- it "should support locator-less usage" do
304
+ it 'should support locator-less usage' do
277
305
  expect(@session.has_no_select?(with_options: %w[Norway Sweden Finland Latvia])).to eq true
278
306
  expect(@session).to have_no_select(with_options: ['New London'])
279
- expect(@session.has_no_select?(with_selected: ['Boxers'])).to eq true
280
- expect(@session).to have_no_select(with_selected: %w[Commando Boxers])
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])
281
309
  end
282
310
  end