capybara 3.3.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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +803 -13
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +25 -9
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +17 -3
  9. data/lib/capybara/driver/node.rb +31 -6
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +31 -7
  12. data/lib/capybara/minitest/spec.rb +180 -88
  13. data/lib/capybara/minitest.rb +262 -149
  14. data/lib/capybara/node/actions.rb +202 -116
  15. data/lib/capybara/node/base.rb +34 -19
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +10 -12
  18. data/lib/capybara/node/element.rb +269 -115
  19. data/lib/capybara/node/finders.rb +99 -77
  20. data/lib/capybara/node/matchers.rb +327 -151
  21. data/lib/capybara/node/simple.rb +48 -13
  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 +8 -9
  25. data/lib/capybara/queries/base_query.rb +23 -16
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +1 -0
  28. data/lib/capybara/queries/selector_query.rb +587 -130
  29. data/lib/capybara/queries/sibling_query.rb +8 -6
  30. data/lib/capybara/queries/style_query.rb +6 -2
  31. data/lib/capybara/queries/text_query.rb +28 -14
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +92 -25
  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 +68 -41
  37. data/lib/capybara/rack_test/node.rb +106 -39
  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 +75 -52
  44. data/lib/capybara/rspec/features.rb +7 -7
  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 +141 -339
  60. data/lib/capybara/rspec.rb +2 -0
  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 +27 -25
  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 +73 -25
  88. data/lib/capybara/selector/filters/base.rb +24 -5
  89. data/lib/capybara/selector/filters/expression_filter.rb +3 -3
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -2
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +85 -348
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -447
  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 +255 -143
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
  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 +436 -134
  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 +56 -19
  123. data/lib/capybara/server/checker.rb +9 -3
  124. data/lib/capybara/server/middleware.rb +28 -12
  125. data/lib/capybara/server.rb +33 -10
  126. data/lib/capybara/session/config.rb +34 -10
  127. data/lib/capybara/session/matchers.rb +23 -16
  128. data/lib/capybara/session.rb +230 -170
  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 +121 -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 +127 -40
  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_spec.rb +21 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
  141. data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
  142. data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
  143. data/lib/capybara/spec/session/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 +6 -6
  146. data/lib/capybara/spec/session/check_spec.rb +102 -47
  147. data/lib/capybara/spec/session/choose_spec.rb +58 -32
  148. data/lib/capybara/spec/session/click_button_spec.rb +219 -163
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
  150. data/lib/capybara/spec/session/click_link_spec.rb +77 -54
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +38 -29
  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_spec.rb +8 -8
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -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 +101 -46
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  165. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  166. data/lib/capybara/spec/session/find_link_spec.rb +31 -21
  167. data/lib/capybara/spec/session/find_spec.rb +244 -141
  168. data/lib/capybara/spec/session/first_spec.rb +43 -43
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
  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 +94 -13
  179. data/lib/capybara/spec/session/has_css_spec.rb +272 -132
  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 +44 -4
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
  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_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 +894 -142
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
  199. data/lib/capybara/spec/session/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 +2 -2
  202. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
  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 +85 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +49 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +25 -24
  210. data/lib/capybara/spec/session/title_spec.rb +7 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +68 -49
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  216. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
  217. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
  218. data/lib/capybara/spec/session/window/window_spec.rb +62 -63
  219. data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
  220. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  221. data/lib/capybara/spec/session/within_spec.rb +79 -42
  222. data/lib/capybara/spec/spec_helper.rb +41 -53
  223. data/lib/capybara/spec/test_app.rb +132 -43
  224. data/lib/capybara/spec/views/animated.erb +49 -0
  225. data/lib/capybara/spec/views/form.erb +139 -42
  226. data/lib/capybara/spec/views/frame_child.erb +4 -3
  227. data/lib/capybara/spec/views/frame_one.erb +2 -1
  228. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  229. data/lib/capybara/spec/views/frame_two.erb +1 -1
  230. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  231. data/lib/capybara/spec/views/layout.erb +10 -0
  232. data/lib/capybara/spec/views/obscured.erb +47 -0
  233. data/lib/capybara/spec/views/offset.erb +33 -0
  234. data/lib/capybara/spec/views/path.erb +2 -2
  235. data/lib/capybara/spec/views/popup_one.erb +1 -1
  236. data/lib/capybara/spec/views/popup_two.erb +1 -1
  237. data/lib/capybara/spec/views/react.erb +45 -0
  238. data/lib/capybara/spec/views/scroll.erb +21 -0
  239. data/lib/capybara/spec/views/spatial.erb +31 -0
  240. data/lib/capybara/spec/views/tables.erb +67 -0
  241. data/lib/capybara/spec/views/with_animation.erb +39 -4
  242. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  243. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  244. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  245. data/lib/capybara/spec/views/with_hover.erb +3 -2
  246. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  247. data/lib/capybara/spec/views/with_html.erb +37 -9
  248. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  249. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  250. data/lib/capybara/spec/views/with_js.erb +26 -5
  251. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  252. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  253. data/lib/capybara/spec/views/with_scope.erb +2 -2
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +1 -1
  261. data/lib/capybara/version.rb +1 -1
  262. data/lib/capybara/window.rb +19 -25
  263. data/lib/capybara.rb +126 -111
  264. data/spec/basic_node_spec.rb +59 -34
  265. data/spec/capybara_spec.rb +56 -44
  266. data/spec/counter_spec.rb +35 -0
  267. data/spec/css_builder_spec.rb +101 -0
  268. data/spec/css_splitter_spec.rb +8 -8
  269. data/spec/dsl_spec.rb +79 -52
  270. data/spec/filter_set_spec.rb +9 -9
  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 +45 -7
  274. data/spec/minitest_spec_spec.rb +87 -64
  275. data/spec/per_session_config_spec.rb +6 -6
  276. data/spec/rack_test_spec.rb +172 -116
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +80 -72
  279. data/spec/rspec/features_spec.rb +21 -16
  280. data/spec/rspec/scenarios_spec.rb +10 -6
  281. data/spec/rspec/shared_spec_matchers.rb +407 -365
  282. data/spec/rspec/views_spec.rb +3 -3
  283. data/spec/rspec_matchers_spec.rb +35 -10
  284. data/spec/rspec_spec.rb +63 -41
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +334 -89
  287. data/spec/selenium_spec_chrome.rb +176 -62
  288. data/spec/selenium_spec_chrome_remote.rb +54 -14
  289. data/spec/selenium_spec_edge.rb +41 -8
  290. data/spec/selenium_spec_firefox.rb +228 -0
  291. data/spec/selenium_spec_firefox_remote.rb +94 -0
  292. data/spec/selenium_spec_ie.rb +129 -11
  293. data/spec/selenium_spec_safari.rb +162 -0
  294. data/spec/server_spec.rb +171 -97
  295. data/spec/session_spec.rb +34 -18
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +344 -80
  298. data/spec/spec_helper.rb +124 -2
  299. data/spec/whitespace_normalizer_spec.rb +54 -0
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +326 -28
  302. data/lib/capybara/rspec/compound.rb +0 -94
  303. data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
  304. data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
  305. data/lib/capybara/spec/session/has_style_spec.rb +0 -25
  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 -167
@@ -4,109 +4,121 @@ require 'spec_helper'
4
4
 
5
5
  RSpec.describe Capybara do
6
6
  describe 'default_max_wait_time' do
7
- after do
8
- Capybara.default_max_wait_time = @previous_default_time
7
+ before { @previous_default_time = described_class.default_max_wait_time }
8
+
9
+ after { described_class.default_max_wait_time = @previous_default_time } # rubocop:disable RSpec/InstanceVariable
10
+
11
+ it 'should be changeable' do
12
+ expect(described_class.default_max_wait_time).not_to eq(5)
13
+ described_class.default_max_wait_time = 5
14
+ expect(described_class.default_max_wait_time).to eq(5)
9
15
  end
16
+ end
17
+
18
+ describe 'default_retry_interval' do
19
+ before { @previous_default_interval = described_class.default_retry_interval }
20
+
21
+ after { described_class.default_retry_interval = @previous_default_interval } # rubocop:disable RSpec/InstanceVariable
10
22
 
11
- it "should be changeable" do
12
- @previous_default_time = Capybara.default_max_wait_time
13
- Capybara.default_max_wait_time = 5
14
- expect(Capybara.default_max_wait_time).to eq(5)
23
+ it 'should be changeable' do
24
+ expect(described_class.default_retry_interval).not_to eq(0.1)
25
+ described_class.default_retry_interval = 0.1
26
+ expect(described_class.default_retry_interval).to eq(0.1)
15
27
  end
16
28
  end
17
29
 
18
30
  describe '.register_driver' do
19
- it "should add a new driver" do
20
- Capybara.register_driver :schmoo do |app|
31
+ it 'should add a new driver' do
32
+ described_class.register_driver :schmoo do |app|
21
33
  Capybara::RackTest::Driver.new(app)
22
34
  end
23
35
  session = Capybara::Session.new(:schmoo, TestApp)
24
36
  session.visit('/')
25
- expect(session.body).to include("Hello world!")
37
+ expect(session.body).to include('Hello world!')
26
38
  end
27
39
  end
28
40
 
29
41
  describe '.register_server' do
30
- it "should add a new server" do
31
- Capybara.register_server :blob do |_app, _port, _host|
42
+ it 'should add a new server' do
43
+ described_class.register_server :blob do |_app, _port, _host|
32
44
  # do nothing
33
45
  end
34
46
 
35
- expect(Capybara.servers).to have_key(:blob)
47
+ expect(described_class.servers[:blob]).to be_truthy
36
48
  end
37
49
  end
38
50
 
39
- describe ".server" do
51
+ describe '.server' do
40
52
  after do
41
- Capybara.server = :default
53
+ described_class.server = :default
42
54
  end
43
55
 
44
- it "should default to a proc that calls run_default_server" do
56
+ it 'should default to a proc that calls run_default_server' do
45
57
  mock_app = Object.new
46
- allow(Capybara).to receive(:run_default_server).and_return(true)
47
- Capybara.server.call(mock_app, 8000)
48
- expect(Capybara).to have_received(:run_default_server).with(mock_app, 8000)
58
+ allow(described_class).to receive(:run_default_server).and_return(true)
59
+ described_class.server.call(mock_app, 8000)
60
+ expect(described_class).to have_received(:run_default_server).with(mock_app, 8000)
49
61
  end
50
62
 
51
- it "should return a custom server proc" do
63
+ it 'should return a custom server proc' do
52
64
  server = ->(_app, _port) {}
53
- Capybara.register_server :custom, &server
54
- Capybara.server = :custom
55
- expect(Capybara.server).to eq(server)
65
+ described_class.register_server :custom, &server
66
+ described_class.server = :custom
67
+ expect(described_class.server).to eq(server)
56
68
  end
57
69
 
58
- it "should have :webrick registered" do
59
- expect(Capybara.servers[:webrick]).not_to be_nil
70
+ it 'should have :webrick registered' do
71
+ expect(described_class.servers[:webrick]).not_to be_nil
60
72
  end
61
73
 
62
- it "should have :puma registered" do
63
- expect(Capybara.servers[:puma]).not_to be_nil
74
+ it 'should have :puma registered' do
75
+ expect(described_class.servers[:puma]).not_to be_nil
64
76
  end
65
77
  end
66
78
 
67
- describe "server=" do
79
+ describe 'server=' do
68
80
  after do
69
- Capybara.server = :default
81
+ described_class.server = :default
70
82
  end
71
83
 
72
- it "accepts a proc" do
84
+ it 'accepts a proc' do
73
85
  server = ->(_app, _port) {}
74
- Capybara.server = server
75
- expect(Capybara.server).to eq server
86
+ described_class.server = server
87
+ expect(described_class.server).to eq server
76
88
  end
77
89
  end
78
90
 
79
91
  describe 'app_host' do
80
92
  after do
81
- Capybara.app_host = nil
93
+ described_class.app_host = nil
82
94
  end
83
95
 
84
- it "should warn if not a valid URL" do
85
- expect { Capybara.app_host = "www.example.com" }.to raise_error(ArgumentError, /Capybara\.app_host should be set to a url/)
96
+ it 'should warn if not a valid URL' do
97
+ expect { described_class.app_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.app_host should be set to a url/)
86
98
  end
87
99
 
88
- it "should not warn if a valid URL" do
89
- expect { Capybara.app_host = "http://www.example.com" }.not_to raise_error
100
+ it 'should not warn if a valid URL' do
101
+ expect { described_class.app_host = 'http://www.example.com' }.not_to raise_error
90
102
  end
91
103
 
92
- it "should not warn if nil" do
93
- expect { Capybara.app_host = nil }.not_to raise_error
104
+ it 'should not warn if nil' do
105
+ expect { described_class.app_host = nil }.not_to raise_error
94
106
  end
95
107
  end
96
108
 
97
109
  describe 'default_host' do
98
110
  around do |test|
99
- old_default = Capybara.default_host
111
+ old_default = described_class.default_host
100
112
  test.run
101
- Capybara.default_host = old_default
113
+ described_class.default_host = old_default
102
114
  end
103
115
 
104
- it "should raise if not a valid URL" do
105
- expect { Capybara.default_host = "www.example.com" }.to raise_error(ArgumentError, /Capybara\.default_host should be set to a url/)
116
+ it 'should raise if not a valid URL' do
117
+ expect { described_class.default_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.default_host should be set to a url/)
106
118
  end
107
119
 
108
- it "should not warn if a valid URL" do
109
- expect { Capybara.default_host = "http://www.example.com" }.not_to raise_error
120
+ it 'should not warn if a valid URL' do
121
+ expect { described_class.default_host = 'http://www.example.com' }.not_to raise_error
110
122
  end
111
123
  end
112
124
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Capybara::Server::Middleware::Counter do
6
+ let(:counter) { described_class.new }
7
+ let(:uri) { '/example' }
8
+
9
+ describe '#increment' do
10
+ it 'successfully' do
11
+ counter.increment(uri)
12
+ expect(counter).to be_positive
13
+ end
14
+ end
15
+
16
+ describe '#decrement' do
17
+ before do
18
+ counter.increment(uri)
19
+ end
20
+
21
+ context 'successfully' do
22
+ it 'with same uri' do
23
+ expect(counter).to be_positive
24
+ counter.decrement(uri)
25
+ expect(counter).not_to be_positive
26
+ end
27
+
28
+ it 'with changed uri' do
29
+ expect(counter).to be_positive
30
+ counter.decrement('/')
31
+ expect(counter).not_to be_positive
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ # rubocop:disable RSpec/InstanceVariable
6
+ RSpec.describe Capybara::Selector::CSSBuilder do
7
+ let :builder do
8
+ described_class.new(@css)
9
+ end
10
+
11
+ context 'add_attribute_conditions' do
12
+ it 'adds a single string condition to a single selector' do
13
+ @css = 'div'
14
+ selector = builder.add_attribute_conditions(random: 'abc')
15
+ expect(selector).to eq %(div[random='abc'])
16
+ end
17
+
18
+ it 'adds multiple string conditions to a single selector' do
19
+ @css = 'div'
20
+ selector = builder.add_attribute_conditions(random: 'abc', other: 'def')
21
+ expect(selector).to eq %(div[random='abc'][other='def'])
22
+ end
23
+
24
+ it 'adds a single string condition to a multiple selector' do
25
+ @css = 'div, ul'
26
+ selector = builder.add_attribute_conditions(random: 'abc')
27
+ expect(selector).to eq %(div[random='abc'], ul[random='abc'])
28
+ end
29
+
30
+ it 'adds multiple string conditions to a multiple selector' do
31
+ @css = 'div, ul'
32
+ selector = builder.add_attribute_conditions(random: 'abc', other: 'def')
33
+ expect(selector).to eq %(div[random='abc'][other='def'], ul[random='abc'][other='def'])
34
+ end
35
+
36
+ it 'adds simple regexp conditions to a single selector' do
37
+ @css = 'div'
38
+ selector = builder.add_attribute_conditions(random: /abc/, other: /def/)
39
+ expect(selector).to eq %(div[random*='abc'][other*='def'])
40
+ end
41
+
42
+ it 'adds wildcard regexp conditions to a single selector' do
43
+ @css = 'div'
44
+ selector = builder.add_attribute_conditions(random: /abc.*def/, other: /def.*ghi/)
45
+ expect(selector).to eq %(div[random*='abc'][random*='def'][other*='def'][other*='ghi'])
46
+ end
47
+
48
+ it 'adds alternated regexp conditions to a single selector' do
49
+ @css = 'div'
50
+ selector = builder.add_attribute_conditions(random: /abc|def/, other: /def|ghi/)
51
+ expect(selector).to eq %(div[random*='abc'][other*='def'], div[random*='abc'][other*='ghi'], div[random*='def'][other*='def'], div[random*='def'][other*='ghi'])
52
+ end
53
+
54
+ it 'adds alternated regexp conditions to a multiple selector' do
55
+ @css = 'div,ul'
56
+ selector = builder.add_attribute_conditions(other: /def.*ghi|jkl/)
57
+ expect(selector).to eq %(div[other*='def'][other*='ghi'], div[other*='jkl'], ul[other*='def'][other*='ghi'], ul[other*='jkl'])
58
+ end
59
+
60
+ it "returns original selector when regexp can't be substringed" do
61
+ @css = 'div'
62
+ selector = builder.add_attribute_conditions(other: /.+/)
63
+ expect(selector).to eq 'div'
64
+ end
65
+
66
+ context ':class' do
67
+ it 'handles string with CSS .' do
68
+ @css = 'a'
69
+ selector = builder.add_attribute_conditions(class: 'my_class')
70
+ expect(selector).to eq 'a.my_class'
71
+ end
72
+
73
+ it 'handles negated string with CSS .' do
74
+ @css = 'a'
75
+ selector = builder.add_attribute_conditions(class: '!my_class')
76
+ expect(selector).to eq 'a:not(.my_class)'
77
+ end
78
+
79
+ it 'handles array of string with CSS .' do
80
+ @css = 'a'
81
+ selector = builder.add_attribute_conditions(class: %w[my_class my_other_class])
82
+ expect(selector).to eq 'a.my_class.my_other_class'
83
+ end
84
+
85
+ it 'handles array of string with CSS . when negated included' do
86
+ @css = 'a'
87
+ selector = builder.add_attribute_conditions(class: %w[my_class !my_other_class])
88
+ expect(selector).to eq 'a.my_class:not(.my_other_class)'
89
+ end
90
+ end
91
+
92
+ context ':id' do
93
+ it 'handles string with CSS #' do
94
+ @css = 'ul'
95
+ selector = builder.add_attribute_conditions(id: 'my_id')
96
+ expect(selector).to eq 'ul#my_id'
97
+ end
98
+ end
99
+ end
100
+ end
101
+ # rubocop:enable RSpec/InstanceVariable
@@ -4,33 +4,33 @@ require 'spec_helper'
4
4
 
5
5
  RSpec.describe Capybara::Selector::CSS::Splitter do
6
6
  let :splitter do
7
- ::Capybara::Selector::CSS::Splitter.new
7
+ described_class.new
8
8
  end
9
9
 
10
- context "split not needed" do
11
- it "normal CSS selector" do
10
+ context 'split not needed' do
11
+ it 'normal CSS selector' do
12
12
  css = 'div[id="abc"]'
13
13
  expect(splitter.split(css)).to eq [css]
14
14
  end
15
15
 
16
- it "comma in strings" do
16
+ it 'comma in strings' do
17
17
  css = 'div[id="a,bc"]'
18
18
  expect(splitter.split(css)).to eq [css]
19
19
  end
20
20
 
21
- it "comma in pseudo-selector" do
21
+ it 'comma in pseudo-selector' do
22
22
  css = 'div.class1:not(.class1, .class2)'
23
23
  expect(splitter.split(css)).to eq [css]
24
24
  end
25
25
  end
26
26
 
27
- context "split needed" do
28
- it "root level comma" do
27
+ context 'split needed' do
28
+ it 'root level comma' do
29
29
  css = 'div.class1, span, p.class2'
30
30
  expect(splitter.split(css)).to eq ['div.class1', 'span', 'p.class2']
31
31
  end
32
32
 
33
- it "root level comma when quotes and pseudo selectors" do
33
+ it 'root level comma when quotes and pseudo selectors' do
34
34
  css = 'div.class1[id="abc\\"def,ghi"]:not(.class3, .class4), span[id=\'a"c\\\'de\'], section, #abc\\,def'
35
35
  expect(splitter.split(css)).to eq ['div.class1[id="abc\\"def,ghi"]:not(.class3, .class4)', 'span[id=\'a"c\\\'de\']', 'section', '#abc\\,def']
36
36
  end
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 download css
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)
@@ -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,40 +235,56 @@ 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
280
  allow(Capybara).to receive(:using_session)
254
- @session.using_session(:name)
281
+ session.using_session(:name)
255
282
  expect(Capybara).to have_received(:using_session).with(:name)
256
283
  end
257
284
 
258
285
  it "should provide a 'using_wait_time' shortcut" do
259
286
  allow(Capybara).to receive(:using_wait_time)
260
- @session.using_wait_time(6)
287
+ session.using_wait_time(6)
261
288
  expect(Capybara).to have_received(:using_wait_time).with(6)
262
289
  end
263
290
  end