capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  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 +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -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 +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +85 -8
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +460 -170
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -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/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +126 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +135 -44
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  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 +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +958 -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 +65 -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 +119 -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 +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -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 +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -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 +46 -11
  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.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
data/spec/dsl_spec.rb CHANGED
@@ -7,11 +7,24 @@ class TestClass
7
7
  include Capybara::DSL
8
8
  end
9
9
 
10
- Capybara::SpecHelper.run_specs TestClass.new, "DSL", capybara_skip: %i[
11
- js modals screenshot frames windows send_keys server hover about_scheme psc
12
- ]
10
+ Capybara::SpecHelper.run_specs TestClass.new, 'DSL', capybara_skip: %i[
11
+ js modals screenshot frames windows send_keys server hover about_scheme psc download css driver scroll spatial html_validation shadow_dom active_element
12
+ ] do |example|
13
+ case example.metadata[:full_description]
14
+ when /has_css\? should support case insensitive :class and :id options/
15
+ pending "Nokogiri doesn't support case insensitive CSS attribute matchers"
16
+ when /#click_button should follow permanent redirects that maintain method/
17
+ pending "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
18
+ when /#attach_file with multipart form should send prior hidden field if no file submitted/
19
+ skip 'Rack-test < 2 needs an empty file to detect multipart form' if Gem.loaded_specs['rack-test'].version < Gem::Version.new('2.0.0')
20
+ end
21
+ end
13
22
 
14
23
  RSpec.describe Capybara::DSL do
24
+ before do
25
+ Capybara.use_default_driver
26
+ end
27
+
15
28
  after do
16
29
  Capybara.session_name = nil
17
30
  Capybara.default_driver = nil
@@ -21,42 +34,42 @@ RSpec.describe Capybara::DSL do
21
34
  end
22
35
 
23
36
  describe '#default_driver' do
24
- it "should default to rack_test" do
37
+ it 'should default to rack_test' do
25
38
  expect(Capybara.default_driver).to eq(:rack_test)
26
39
  end
27
40
 
28
- it "should be changeable" do
41
+ it 'should be changeable' do
29
42
  Capybara.default_driver = :culerity
30
43
  expect(Capybara.default_driver).to eq(:culerity)
31
44
  end
32
45
  end
33
46
 
34
47
  describe '#current_driver' do
35
- it "should default to the default driver" do
48
+ it 'should default to the default driver' do
36
49
  expect(Capybara.current_driver).to eq(:rack_test)
37
50
  Capybara.default_driver = :culerity
38
51
  expect(Capybara.current_driver).to eq(:culerity)
39
52
  end
40
53
 
41
- it "should be changeable" do
54
+ it 'should be changeable' do
42
55
  Capybara.current_driver = :culerity
43
56
  expect(Capybara.current_driver).to eq(:culerity)
44
57
  end
45
58
  end
46
59
 
47
60
  describe '#javascript_driver' do
48
- it "should default to selenium" do
61
+ it 'should default to selenium' do
49
62
  expect(Capybara.javascript_driver).to eq(:selenium)
50
63
  end
51
64
 
52
- it "should be changeable" do
65
+ it 'should be changeable' do
53
66
  Capybara.javascript_driver = :culerity
54
67
  expect(Capybara.javascript_driver).to eq(:culerity)
55
68
  end
56
69
  end
57
70
 
58
71
  describe '#use_default_driver' do
59
- it "should restore the default driver" do
72
+ it 'should restore the default driver' do
60
73
  Capybara.current_driver = :culerity
61
74
  Capybara.use_default_driver
62
75
  expect(Capybara.current_driver).to eq(:rack_test)
@@ -65,7 +78,7 @@ RSpec.describe Capybara::DSL do
65
78
 
66
79
  describe '#using_driver' do
67
80
  before do
68
- expect(Capybara.current_driver).not_to eq(:selenium)
81
+ expect(Capybara.current_driver).not_to eq(:selenium) # rubocop:disable RSpec/ExpectInHook
69
82
  end
70
83
 
71
84
  it 'should set the driver using Capybara.current_driver=' do
@@ -84,8 +97,8 @@ RSpec.describe Capybara::DSL do
84
97
  it 'should reset the driver even if an exception occurs' do
85
98
  driver_before_block = Capybara.current_driver
86
99
  begin
87
- Capybara.using_driver(:selenium) { raise "ohnoes!" }
88
- rescue Exception # rubocop:disable Lint/RescueException
100
+ Capybara.using_driver(:selenium) { raise 'ohnoes!' }
101
+ rescue Exception # rubocop:disable Lint/RescueException,Lint/SuppressedException
89
102
  end
90
103
  expect(Capybara.current_driver).to eq(driver_before_block)
91
104
  end
@@ -104,20 +117,17 @@ RSpec.describe Capybara::DSL do
104
117
  it 'should yield the passed block' do
105
118
  called = false
106
119
  Capybara.using_driver(:selenium) { called = true }
107
- expect(called).to eq(true)
120
+ expect(called).to be(true)
108
121
  end
109
122
  end
110
123
 
124
+ # rubocop:disable RSpec/InstanceVariable
111
125
  describe '#using_wait_time' do
112
- before do
113
- @previous_wait_time = Capybara.default_max_wait_time
114
- end
126
+ before { @previous_wait_time = Capybara.default_max_wait_time }
115
127
 
116
- after do
117
- Capybara.default_max_wait_time = @previous_wait_time
118
- end
128
+ after { Capybara.default_max_wait_time = @previous_wait_time }
119
129
 
120
- it "should switch the wait time and switch it back" do
130
+ it 'should switch the wait time and switch it back' do
121
131
  in_block = nil
122
132
  Capybara.using_wait_time 6 do
123
133
  in_block = Capybara.default_max_wait_time
@@ -126,40 +136,41 @@ RSpec.describe Capybara::DSL do
126
136
  expect(Capybara.default_max_wait_time).to eq(@previous_wait_time)
127
137
  end
128
138
 
129
- it "should ensure wait time is reset" do
139
+ it 'should ensure wait time is reset' do
130
140
  expect do
131
141
  Capybara.using_wait_time 6 do
132
- raise "hell"
142
+ raise 'hell'
133
143
  end
134
- end.to raise_error(RuntimeError, "hell")
144
+ end.to raise_error(RuntimeError, 'hell')
135
145
  expect(Capybara.default_max_wait_time).to eq(@previous_wait_time)
136
146
  end
137
147
  end
148
+ # rubocop:enable RSpec/InstanceVariable
138
149
 
139
150
  describe '#app' do
140
- it "should be changeable" do
141
- Capybara.app = "foobar"
151
+ it 'should be changeable' do
152
+ Capybara.app = 'foobar'
142
153
  expect(Capybara.app).to eq('foobar')
143
154
  end
144
155
  end
145
156
 
146
157
  describe '#current_session' do
147
- it "should choose a session object of the current driver type" do
158
+ it 'should choose a session object of the current driver type' do
148
159
  expect(Capybara.current_session).to be_a(Capybara::Session)
149
160
  end
150
161
 
151
- it "should use #app as the application" do
162
+ it 'should use #app as the application' do
152
163
  Capybara.app = proc {}
153
164
  expect(Capybara.current_session.app).to eq(Capybara.app)
154
165
  end
155
166
 
156
- it "should change with the current driver" do
167
+ it 'should change with the current driver' do
157
168
  expect(Capybara.current_session.mode).to eq(:rack_test)
158
169
  Capybara.current_driver = :selenium
159
170
  expect(Capybara.current_session.mode).to eq(:selenium)
160
171
  end
161
172
 
162
- it "should be persistent even across driver changes" do
173
+ it 'should be persistent even across driver changes' do
163
174
  object_id = Capybara.current_session.object_id
164
175
  expect(Capybara.current_session.object_id).to eq(object_id)
165
176
  Capybara.current_driver = :selenium
@@ -170,7 +181,7 @@ RSpec.describe Capybara::DSL do
170
181
  expect(Capybara.current_session.object_id).to eq(object_id)
171
182
  end
172
183
 
173
- it "should change when changing application" do
184
+ it 'should change when changing application' do
174
185
  object_id = Capybara.current_session.object_id
175
186
  expect(Capybara.current_session.object_id).to eq(object_id)
176
187
  Capybara.app = proc {}
@@ -178,7 +189,7 @@ RSpec.describe Capybara::DSL do
178
189
  expect(Capybara.current_session.app).to eq(Capybara.app)
179
190
  end
180
191
 
181
- it "should change when the session name changes" do
192
+ it 'should change when the session name changes' do
182
193
  object_id = Capybara.current_session.object_id
183
194
  Capybara.session_name = :administrator
184
195
  expect(Capybara.session_name).to eq(:administrator)
@@ -189,8 +200,8 @@ RSpec.describe Capybara::DSL do
189
200
  end
190
201
  end
191
202
 
192
- describe "#using_session" do
193
- it "should change the session name for the duration of the block" do
203
+ describe '#using_session' do
204
+ it 'should change the session name for the duration of the block' do
194
205
  expect(Capybara.session_name).to eq(:default)
195
206
  Capybara.using_session(:administrator) do
196
207
  expect(Capybara.session_name).to eq(:administrator)
@@ -198,23 +209,23 @@ RSpec.describe Capybara::DSL do
198
209
  expect(Capybara.session_name).to eq(:default)
199
210
  end
200
211
 
201
- it "should reset the session to the default, even if an exception occurs" do
212
+ it 'should reset the session to the default, even if an exception occurs' do
202
213
  begin
203
214
  Capybara.using_session(:raise) do
204
215
  raise
205
216
  end
206
- rescue Exception # rubocop:disable Lint/RescueException
217
+ rescue Exception # rubocop:disable Lint/RescueException,Lint/SuppressedException
207
218
  end
208
219
  expect(Capybara.session_name).to eq(:default)
209
220
  end
210
221
 
211
- it "should yield the passed block" do
222
+ it 'should yield the passed block' do
212
223
  called = false
213
224
  Capybara.using_session(:administrator) { called = true }
214
- expect(called).to eq(true)
225
+ expect(called).to be(true)
215
226
  end
216
227
 
217
- it "should be nestable" do
228
+ it 'should be nestable' do
218
229
  Capybara.using_session(:outer) do
219
230
  expect(Capybara.session_name).to eq(:outer)
220
231
  Capybara.using_session(:inner) do
@@ -224,39 +235,57 @@ RSpec.describe Capybara::DSL do
224
235
  end
225
236
  expect(Capybara.session_name).to eq(:default)
226
237
  end
238
+
239
+ it 'should allow a session object' do
240
+ original_session = Capybara.current_session
241
+ new_session = Capybara::Session.new(:rack_test, proc {})
242
+ Capybara.using_session(new_session) do
243
+ expect(Capybara.current_session).to eq(new_session)
244
+ end
245
+ expect(Capybara.current_session).to eq(original_session)
246
+ end
247
+
248
+ it 'should pass the new session if block accepts' do
249
+ original_session = Capybara.current_session
250
+ Capybara.using_session(:administrator) do |admin_session, prev_session|
251
+ expect(admin_session).to be(Capybara.current_session)
252
+ expect(prev_session).to be(original_session)
253
+ expect(prev_session).not_to be(admin_session)
254
+ end
255
+ end
227
256
  end
228
257
 
229
- describe "#session_name" do
230
- it "should default to :default" do
258
+ describe '#session_name' do
259
+ it 'should default to :default' do
231
260
  expect(Capybara.session_name).to eq(:default)
232
261
  end
233
262
  end
234
263
 
235
264
  describe 'the DSL' do
236
- before do
237
- @session = Class.new { include Capybara::DSL }.new
238
- end
265
+ let(:session) { Class.new { include Capybara::DSL }.new }
239
266
 
240
- it "should be possible to include it in another class" do
241
- @session.visit('/with_html')
242
- @session.click_link('ullamco')
243
- expect(@session.body).to include('Another World')
267
+ it 'should be possible to include it in another class' do
268
+ session.visit('/with_html')
269
+ session.click_link('ullamco')
270
+ expect(session.body).to include('Another World')
244
271
  end
245
272
 
246
273
  it "should provide a 'page' shortcut for more expressive tests" do
247
- @session.page.visit('/with_html')
248
- @session.page.click_link('ullamco')
249
- expect(@session.page.body).to include('Another World')
274
+ session.page.visit('/with_html')
275
+ session.page.click_link('ullamco')
276
+ expect(session.page.body).to include('Another World')
250
277
  end
251
278
 
252
279
  it "should provide an 'using_session' shortcut" do
253
- expect(Capybara).to receive(:using_session).with(:name)
254
- @session.using_session(:name)
280
+ allow(Capybara).to receive(:using_session)
281
+ session.using_session(:name)
282
+ expect(Capybara).to have_received(:using_session).with(:name)
255
283
  end
256
284
 
257
285
  it "should provide a 'using_wait_time' shortcut" do
258
- expect(Capybara).to receive(:using_wait_time).with(6)
259
- @session.using_wait_time(6)
286
+ allow(Capybara).to receive(:using_wait_time)
287
+ session.using_wait_time(6)
288
+ expect(Capybara).to have_received(:using_wait_time).with(6)
260
289
  end
261
290
  end
262
291
  end
@@ -4,12 +4,12 @@ require 'spec_helper'
4
4
 
5
5
  RSpec.describe Capybara::Selector::FilterSet do
6
6
  after do
7
- Capybara::Selector::FilterSet.remove(:test)
7
+ described_class.remove(:test)
8
8
  end
9
9
 
10
- it "allows node filters" do
11
- fs = Capybara::Selector::FilterSet.add(:test) do
12
- filter(:node_test, :boolean) { |_node, _value| true }
10
+ it 'allows node filters' do
11
+ fs = described_class.add(:test) do
12
+ node_filter(:node_test, :boolean) { |_node, _value| true }
13
13
  expression_filter(:expression_test, :boolean) { |_expr, _value| true }
14
14
  end
15
15
 
@@ -17,13 +17,30 @@ RSpec.describe Capybara::Selector::FilterSet do
17
17
  expect(fs.node_filters.keys).not_to include(:expression_test)
18
18
  end
19
19
 
20
- it "allows expression filters" do
21
- fs = Capybara::Selector::FilterSet.add(:test) do
22
- filter(:node_test, :boolean) { |_node, _value| true }
20
+ it 'allows expression filters' do
21
+ fs = described_class.add(:test) do
22
+ node_filter(:node_test, :boolean) { |_node, _value| true }
23
23
  expression_filter(:expression_test, :boolean) { |_expr, _value| true }
24
24
  end
25
25
 
26
26
  expect(fs.expression_filters.keys).to include(:expression_test)
27
27
  expect(fs.expression_filters.keys).not_to include(:node_test)
28
28
  end
29
+
30
+ it 'allows node filter and expression filter with the same name' do
31
+ fs = described_class.add(:test) do
32
+ node_filter(:test, :boolean) { |_node, _value| true }
33
+ expression_filter(:test, :boolean) { |_expr, _value| true }
34
+ end
35
+
36
+ expect(fs.expression_filters[:test]).not_to eq fs.node_filters[:test]
37
+ end
38
+
39
+ it 'allows `filter` as an alias of `node_filter`' do
40
+ fs = described_class.add(:test) do
41
+ filter(:node_test, :boolean) { |_node, _value| true }
42
+ end
43
+
44
+ expect(fs.node_filters.keys).to include(:node_test)
45
+ end
29
46
  end
@@ -0,0 +1,25 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIEITCCAwmgAwIBAgIJALROkwd1gZHQMA0GCSqGSIb3DQEBBQUAMGgxCzAJBgNV
3
+ BAYTAlVTMQswCQYDVQQIEwJDQTERMA8GA1UEChMIQ2FweWJhcmExFjAUBgNVBAMT
4
+ DWNhcHliYXJhLnRlc3QxITAfBgkqhkiG9w0BCQEWEnR3YWxwb2xlQGdtYWlsLmNv
5
+ bTAeFw0xODA1MDEyMDI5NDVaFw0yODA0MjgyMDI5NDVaMGgxCzAJBgNVBAYTAlVT
6
+ MQswCQYDVQQIEwJDQTERMA8GA1UEChMIQ2FweWJhcmExFjAUBgNVBAMTDWNhcHli
7
+ YXJhLnRlc3QxITAfBgkqhkiG9w0BCQEWEnR3YWxwb2xlQGdtYWlsLmNvbTCCASIw
8
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL7icqMv9uApxRXlcIQ3hSEfmULk
9
+ 7CLT1aUAjEmTiqy8TkFqOeSuA3elnbVBhOW+emrb1uUyje20LvEOHbqYYw90ezlV
10
+ jqNWUapawqjxb+q7KVNpA5uDCtOHIC/1Z1kxQ+yZP/8St4SvnLGUMsUhu0h+ywJa
11
+ iGZ2xy8wdfjABUiUImRESdNkT7Xs0wxQGY0/FZ4K5Sec4kroOuvdxKKhyf5Js5xS
12
+ NRv2tXSMWlKHbYEvYzsVtFgv/4GjqN4wVvbfJmsS8thcyrSYSMN7eE0R6dcbJaLM
13
+ P/GTiw669zPJP164K84QoabLClgwyG+7mqjm7jutq9qXipwyrGsf/WR5fkUCAwEA
14
+ AaOBzTCByjAdBgNVHQ4EFgQU4ut9c0oB2OGMlN/nvn0Y7twBzJowgZoGA1UdIwSB
15
+ kjCBj4AU4ut9c0oB2OGMlN/nvn0Y7twBzJqhbKRqMGgxCzAJBgNVBAYTAlVTMQsw
16
+ CQYDVQQIEwJDQTERMA8GA1UEChMIQ2FweWJhcmExFjAUBgNVBAMTDWNhcHliYXJh
17
+ LnRlc3QxITAfBgkqhkiG9w0BCQEWEnR3YWxwb2xlQGdtYWlsLmNvbYIJALROkwd1
18
+ gZHQMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAANtqdDrdehBt20s
19
+ IVOsVzOp+tJI8pn6G62WJcZWGsvLLfx6Y6eJSP24r5NW4v39cqCgE76J2znzKxeo
20
+ VIShAJ1SLodR0GwzFGsl3TVKVoce6gBWZNXgkZyJTNqKGWeme8CH1EG3TqYlcybt
21
+ EXWLQ6wKndD+uHJIfqUy7HfaUv+TghJGLkv8QYqcAWILQko4xqZ1NULDQ2uhjxei
22
+ oaQlK9teHlVaH87dONesAg3f5rh9j6nvzGiC/T8ycdEhn/DxJMxRS2+mVZqKkk7U
23
+ 60+e9Foc6qTW8UaMShIFYMspoRnr9baBxzxh9V9LZznwqVTf3vuEIck2l2j2KL/R
24
+ SOBenCM=
25
+ -----END CERTIFICATE-----
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEogIBAAKCAQEAvuJyoy/24CnFFeVwhDeFIR+ZQuTsItPVpQCMSZOKrLxOQWo5
3
+ 5K4Dd6WdtUGE5b56atvW5TKN7bQu8Q4duphjD3R7OVWOo1ZRqlrCqPFv6rspU2kD
4
+ m4MK04cgL/VnWTFD7Jk//xK3hK+csZQyxSG7SH7LAlqIZnbHLzB1+MAFSJQiZERJ
5
+ 02RPtezTDFAZjT8VngrlJ5ziSug6693EoqHJ/kmznFI1G/a1dIxaUodtgS9jOxW0
6
+ WC//gaOo3jBW9t8maxLy2FzKtJhIw3t4TRHp1xslosw/8ZOLDrr3M8k/XrgrzhCh
7
+ pssKWDDIb7uaqObuO62r2peKnDKsax/9ZHl+RQIDAQABAoIBABhZepYmgC+IJIPu
8
+ iLPVAT6AcWR/H0AyFYa+0yZvk7kFLFZb3pa1O+v/TGbavMEx0xvef0Mtd71ixrop
9
+ OtGarshB65Ycu91KHZDFkx9J7STcSyFAvB0SUkc5bXmwrEZMaoW75tX65T4fyLU+
10
+ WlubOfC9e9gJBG1NqYrze5kHpaTkR8pBaSxECns5y2HLaMvs1t1kK7snqtGHFRAb
11
+ deAUl0ONENaO6PF797yM3bsIEgnljdKvaVP3kYq/eAzH4jyw+qG/xq0bZ+nalJzM
12
+ IL7xRSR/Yak7WZ3QUh99t3dng/z3De4yvhBLq/mc2mIVvt7aERPo/aDG4SrmQ9Jw
13
+ f1GUT+ECgYEA+i96w2zPHkq0djuuhNaa/R0vybD9hVCdB7enQ8skBzQAQyhp9X9W
14
+ by38VAbFRVIMrzdfbvwSFrE3Nd9BvyLWl16G+MVu+hq0jhM9p44a62vXvfgQmfFh
15
+ iXyGkzCTufeLEzOFnP8S+ezacodK1hbQTjllUndn6NUhXcbfozTPfx8CgYEAw1Il
16
+ xqfU7NkVX6UP/FvTx9aBKqwrD8YOPn9nj26Q45zVbmHJZZIvywlsMDCiJ6JJawEa
17
+ GSkiZTDpypEvS/2UtLEY0zfbSbQGkBTnagHIFAuVh0AD1EP+kCcnrxA5Vjr8v0WE
18
+ B0HBfMgoZxa8rmHMpPhrlCCo1ectRgu+dgzEKhsCgYAQ17lwBpc69tSHUSVClCAD
19
+ AkABWAT5QKARsO91xOs8AOgznTjk6hmrinD+RyZosEliUlv+YMHm/S82VT1b3MCN
20
+ mDOF8+SwubOGDQ2NhieRycTQaS7U7kcetl9o8VBAqMWYGVPZaeKhKKzcIPeMyiRj
21
+ 38FOd/Nq3U5NveG4XwnJCQKBgGrzmnfTAsbGf+uliMFYzviIPqZNLC8w9i/Gt8BU
22
+ fMYF5ODSbuNNTxpQiItCtigZtzX+nnnUil76j6o6IbnsmvbuWneeCFetWkKfD7B+
23
+ VT6UsUYkCXS73rK0nghATAUpu6hIumj22qonN+hrDNo390UGOnIcCBdIxQOr/pjJ
24
+ mMitAoGAB3tFzlzZHpCE38IqdHL7CKIML9cYJSOm07nFIEUAKN2bUHGsvMH/tMS1
25
+ I3hyeHxMmYCrOLn7xLqiOVgRjbYS9JiQVdDojqeSvvnLCtY9/lHWi50pqbPfwyfK
26
+ Og6QoFyxjBEsoSilc6dai58VTO6ufhoJXbXX9PcIl7le4dVPnzE=
27
+ -----END RSA PRIVATE KEY-----
@@ -4,10 +4,10 @@ require 'spec_helper'
4
4
  require 'selenium-webdriver'
5
5
 
6
6
  RSpec.describe Capybara::Selenium::Driver do
7
- it "should exit with a non-zero exit status" do
8
- options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
9
- browser = Capybara::Selenium::Driver.new(TestApp, options).browser
10
- expect(browser).to be
11
- expect(true).to eq(false)
7
+ it 'should exit with a non-zero exit status' do
8
+ options = { browser: ENV.fetch('SELENIUM_BROWSER', :firefox).to_sym }
9
+ browser = described_class.new(TestApp, options).browser
10
+ expect(browser).to be_truthy
11
+ expect(true).to be(false) # rubocop:disable RSpec/ExpectActual
12
12
  end
13
13
  end
@@ -4,10 +4,10 @@ require 'spec_helper'
4
4
  require 'selenium-webdriver'
5
5
 
6
6
  RSpec.describe Capybara::Selenium::Driver do
7
- it "should exit with a zero exit status" do
8
- options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
9
- browser = Capybara::Selenium::Driver.new(TestApp, options).browser
10
- expect(browser).to be
11
- expect(true).to eq(true)
7
+ it 'should exit with a zero exit status' do
8
+ options = { browser: ENV.fetch('SELENIUM_BROWSER', :firefox).to_sym }
9
+ browser = described_class.new(TestApp, **options).browser
10
+ expect(browser).to be_truthy
11
+ expect(true).to be(true) # rubocop:disable RSpec/ExpectActual,RSpec/IdenticalEqualityAssertion
12
12
  end
13
13
  end
@@ -15,8 +15,12 @@ class MinitestTest < Minitest::Test
15
15
  Capybara.reset_sessions!
16
16
  end
17
17
 
18
+ def self.test_order
19
+ :sorted
20
+ end
21
+
18
22
  def test_assert_text
19
- assert_text('Form')
23
+ assert_text('Form', normalize_ws: false)
20
24
  assert_no_text('Not on the page')
21
25
  refute_text('Also Not on the page')
22
26
  end
@@ -30,15 +34,16 @@ class MinitestTest < Minitest::Test
30
34
 
31
35
  def test_assert_current_path
32
36
  assert_current_path('/form')
37
+ assert_current_path('/form') { |url| url.query.nil? }
33
38
  assert_no_current_path('/not_form')
34
39
  refute_current_path('/not_form')
35
40
  end
36
41
 
37
42
  def test_assert_xpath
38
43
  assert_xpath('.//select[@id="form_title"]')
39
- assert_xpath('.//select', count: 1) { |el| el[:id] == "form_title" }
44
+ assert_xpath('.//select', count: 1) { |el| el[:id] == 'form_title' }
40
45
  assert_no_xpath('.//select[@id="not_form_title"]')
41
- assert_no_xpath('.//select') { |el| el[:id] == "not_form_title" }
46
+ assert_no_xpath('.//select') { |el| el[:id] == 'not_form_title' }
42
47
  refute_xpath('.//select[@id="not_form_title"]')
43
48
  end
44
49
 
@@ -47,6 +52,21 @@ class MinitestTest < Minitest::Test
47
52
  assert_no_css('select#not_form_title')
48
53
  end
49
54
 
55
+ def test_assert_selector
56
+ assert_selector(:css, 'select#form_title')
57
+ assert_selector(:xpath, './/select[@id="form_title"]')
58
+ assert_no_selector(:css, 'select#not_form_title')
59
+ assert_no_selector(:xpath, './/select[@id="not_form_title"]')
60
+ refute_selector(:css, 'select#not_form_title')
61
+ end
62
+
63
+ def test_assert_element
64
+ visit('/with_html')
65
+ assert_element('a', text: 'A link')
66
+ assert_element(count: 1) { |el| el.text == 'A link' }
67
+ assert_no_element(text: 'Not on page')
68
+ end
69
+
50
70
  def test_assert_link
51
71
  visit('/with_html')
52
72
  assert_link('A link')
@@ -97,6 +117,10 @@ class MinitestTest < Minitest::Test
97
117
  assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
98
118
  end
99
119
 
120
+ def test_assert_any_of_selectors
121
+ assert_any_of_selectors(:css, 'input#not_on_page', 'select#form_other_title')
122
+ end
123
+
100
124
  def test_assert_matches_selector
101
125
  assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
102
126
  assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
@@ -112,6 +136,22 @@ class MinitestTest < Minitest::Test
112
136
  assert_matches_xpath(find(:select, 'form_title'), './/select[@id="form_title"]')
113
137
  refute_matches_xpath(find(:select, 'form_title'), './/select[@id="form_other_title"]')
114
138
  end
139
+
140
+ def test_assert_matches_style
141
+ skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
142
+ visit('/with_html')
143
+ assert_matches_style(find(:css, '#second'), display: 'inline')
144
+ end
145
+
146
+ def test_assert_ancestor
147
+ option = find(:option, 'Finnish')
148
+ assert_ancestor(option, :css, '#form_locale')
149
+ end
150
+
151
+ def test_assert_sibling
152
+ option = find(:css, '#form_title').find(:option, 'Mrs')
153
+ assert_sibling(option, :option, 'Mr')
154
+ end
115
155
  end
116
156
 
117
157
  RSpec.describe 'capybara/minitest' do
@@ -120,12 +160,16 @@ RSpec.describe 'capybara/minitest' do
120
160
  Capybara.app = TestApp
121
161
  end
122
162
 
123
- it "should support minitest" do
163
+ after do
164
+ Capybara.use_default_driver
165
+ end
166
+
167
+ it 'should support minitest' do
124
168
  output = StringIO.new
125
169
  reporter = Minitest::SummaryReporter.new(output)
126
170
  reporter.start
127
171
  MinitestTest.run reporter, {}
128
172
  reporter.report
129
- expect(output.string).to include("17 runs, 44 assertions, 0 failures, 0 errors, 0 skips")
173
+ expect(output.string).to include('23 runs, 56 assertions, 0 failures, 0 errors, 1 skips')
130
174
  end
131
175
  end