capybara 3.32.2

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 (313) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/History.md +1813 -0
  4. data/License.txt +22 -0
  5. data/README.md +1099 -0
  6. data/lib/capybara.rb +511 -0
  7. data/lib/capybara/config.rb +94 -0
  8. data/lib/capybara/cucumber.rb +27 -0
  9. data/lib/capybara/driver/base.rb +170 -0
  10. data/lib/capybara/driver/node.rb +139 -0
  11. data/lib/capybara/dsl.rb +65 -0
  12. data/lib/capybara/helpers.rb +108 -0
  13. data/lib/capybara/minitest.rb +386 -0
  14. data/lib/capybara/minitest/spec.rb +264 -0
  15. data/lib/capybara/node/actions.rb +420 -0
  16. data/lib/capybara/node/base.rb +143 -0
  17. data/lib/capybara/node/document.rb +48 -0
  18. data/lib/capybara/node/document_matchers.rb +67 -0
  19. data/lib/capybara/node/element.rb +606 -0
  20. data/lib/capybara/node/finders.rb +325 -0
  21. data/lib/capybara/node/matchers.rb +883 -0
  22. data/lib/capybara/node/simple.rb +208 -0
  23. data/lib/capybara/queries/ancestor_query.rb +27 -0
  24. data/lib/capybara/queries/base_query.rb +106 -0
  25. data/lib/capybara/queries/current_path_query.rb +51 -0
  26. data/lib/capybara/queries/match_query.rb +26 -0
  27. data/lib/capybara/queries/selector_query.rb +710 -0
  28. data/lib/capybara/queries/sibling_query.rb +26 -0
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +110 -0
  31. data/lib/capybara/queries/title_query.rb +39 -0
  32. data/lib/capybara/rack_test/browser.rb +140 -0
  33. data/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/lib/capybara/rack_test/driver.rb +109 -0
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +127 -0
  37. data/lib/capybara/rack_test/node.rb +325 -0
  38. data/lib/capybara/rails.rb +16 -0
  39. data/lib/capybara/registrations/drivers.rb +36 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
  41. data/lib/capybara/registrations/servers.rb +44 -0
  42. data/lib/capybara/result.rb +190 -0
  43. data/lib/capybara/rspec.rb +29 -0
  44. data/lib/capybara/rspec/features.rb +23 -0
  45. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/lib/capybara/rspec/matchers.rb +201 -0
  47. data/lib/capybara/rspec/matchers/base.rb +111 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +38 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/selector.rb +233 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
  63. data/lib/capybara/selector/css.rb +102 -0
  64. data/lib/capybara/selector/definition.rb +276 -0
  65. data/lib/capybara/selector/definition/button.rb +51 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +27 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +46 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/filter.rb +5 -0
  87. data/lib/capybara/selector/filter_set.rb +124 -0
  88. data/lib/capybara/selector/filters/base.rb +77 -0
  89. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  93. data/lib/capybara/selector/selector.rb +147 -0
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  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 +496 -0
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -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 +78 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +34 -0
  111. data/lib/capybara/selenium/node.rb +610 -0
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +131 -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 +47 -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.rb +126 -0
  124. data/lib/capybara/server/animation_disabler.rb +58 -0
  125. data/lib/capybara/server/checker.rb +44 -0
  126. data/lib/capybara/server/middleware.rb +69 -0
  127. data/lib/capybara/session.rb +942 -0
  128. data/lib/capybara/session/config.rb +124 -0
  129. data/lib/capybara/session/matchers.rb +87 -0
  130. data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  131. data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  132. data/lib/capybara/spec/fixtures/no_extension +1 -0
  133. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  134. data/lib/capybara/spec/public/jquery-ui.js +13 -0
  135. data/lib/capybara/spec/public/jquery.js +5 -0
  136. data/lib/capybara/spec/public/offset.js +6 -0
  137. data/lib/capybara/spec/public/test.js +268 -0
  138. data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  139. data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  140. data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  141. data/lib/capybara/spec/session/all_spec.rb +278 -0
  142. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
  150. data/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/lib/capybara/spec/session/check_spec.rb +235 -0
  152. data/lib/capybara/spec/session/choose_spec.rb +121 -0
  153. data/lib/capybara/spec/session/click_button_spec.rb +506 -0
  154. data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
  155. data/lib/capybara/spec/session/click_link_spec.rb +229 -0
  156. data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/lib/capybara/spec/session/current_url_spec.rb +115 -0
  158. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
  168. data/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/lib/capybara/spec/session/find_link_spec.rb +70 -0
  172. data/lib/capybara/spec/session/find_spec.rb +531 -0
  173. data/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  178. data/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  183. data/lib/capybara/spec/session/has_button_spec.rb +69 -0
  184. data/lib/capybara/spec/session/has_css_spec.rb +374 -0
  185. data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
  186. data/lib/capybara/spec/session/has_field_spec.rb +349 -0
  187. data/lib/capybara/spec/session/has_link_spec.rb +39 -0
  188. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  189. data/lib/capybara/spec/session/has_select_spec.rb +310 -0
  190. data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
  191. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  192. data/lib/capybara/spec/session/has_table_spec.rb +198 -0
  193. data/lib/capybara/spec/session/has_text_spec.rb +394 -0
  194. data/lib/capybara/spec/session/has_title_spec.rb +71 -0
  195. data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  196. data/lib/capybara/spec/session/headers_spec.rb +8 -0
  197. data/lib/capybara/spec/session/html_spec.rb +47 -0
  198. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  199. data/lib/capybara/spec/session/node_spec.rb +1292 -0
  200. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  201. data/lib/capybara/spec/session/refresh_spec.rb +33 -0
  202. data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
  203. data/lib/capybara/spec/session/response_code_spec.rb +8 -0
  204. data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  205. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  206. data/lib/capybara/spec/session/save_page_spec.rb +110 -0
  207. data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  208. data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  209. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  210. data/lib/capybara/spec/session/select_spec.rb +229 -0
  211. data/lib/capybara/spec/session/selectors_spec.rb +98 -0
  212. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  213. data/lib/capybara/spec/session/source_spec.rb +0 -0
  214. data/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/lib/capybara/spec/session/visit_spec.rb +204 -0
  219. data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/lib/capybara/spec/session/within_spec.rb +199 -0
  228. data/lib/capybara/spec/spec_helper.rb +134 -0
  229. data/lib/capybara/spec/test_app.rb +226 -0
  230. data/lib/capybara/spec/views/animated.erb +49 -0
  231. data/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/lib/capybara/spec/views/form.erb +685 -0
  234. data/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  241. data/lib/capybara/spec/views/obscured.erb +47 -0
  242. data/lib/capybara/spec/views/offset.erb +32 -0
  243. data/lib/capybara/spec/views/path.erb +13 -0
  244. data/lib/capybara/spec/views/popup_one.erb +9 -0
  245. data/lib/capybara/spec/views/popup_two.erb +9 -0
  246. data/lib/capybara/spec/views/postback.erb +14 -0
  247. data/lib/capybara/spec/views/react.erb +45 -0
  248. data/lib/capybara/spec/views/scroll.erb +20 -0
  249. data/lib/capybara/spec/views/spatial.erb +31 -0
  250. data/lib/capybara/spec/views/tables.erb +130 -0
  251. data/lib/capybara/spec/views/with_animation.erb +74 -0
  252. data/lib/capybara/spec/views/with_base_tag.erb +11 -0
  253. data/lib/capybara/spec/views/with_count.erb +8 -0
  254. data/lib/capybara/spec/views/with_dragula.erb +22 -0
  255. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  256. data/lib/capybara/spec/views/with_hover.erb +24 -0
  257. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  258. data/lib/capybara/spec/views/with_html.erb +208 -0
  259. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  260. data/lib/capybara/spec/views/with_html_entities.erb +2 -0
  261. data/lib/capybara/spec/views/with_js.erb +160 -0
  262. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  263. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  264. data/lib/capybara/spec/views/with_scope.erb +42 -0
  265. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  266. data/lib/capybara/spec/views/with_simple_html.erb +2 -0
  267. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  268. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  269. data/lib/capybara/spec/views/with_title.erb +5 -0
  270. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  271. data/lib/capybara/spec/views/with_windows.erb +54 -0
  272. data/lib/capybara/spec/views/within_frames.erb +15 -0
  273. data/lib/capybara/version.rb +5 -0
  274. data/lib/capybara/window.rb +146 -0
  275. data/spec/basic_node_spec.rb +154 -0
  276. data/spec/capybara_spec.rb +112 -0
  277. data/spec/css_builder_spec.rb +101 -0
  278. data/spec/css_splitter_spec.rb +38 -0
  279. data/spec/dsl_spec.rb +276 -0
  280. data/spec/filter_set_spec.rb +46 -0
  281. data/spec/fixtures/capybara.csv +1 -0
  282. data/spec/fixtures/certificate.pem +25 -0
  283. data/spec/fixtures/key.pem +27 -0
  284. data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  285. data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  286. data/spec/minitest_spec.rb +163 -0
  287. data/spec/minitest_spec_spec.rb +162 -0
  288. data/spec/per_session_config_spec.rb +68 -0
  289. data/spec/rack_test_spec.rb +268 -0
  290. data/spec/regexp_dissassembler_spec.rb +250 -0
  291. data/spec/result_spec.rb +196 -0
  292. data/spec/rspec/features_spec.rb +99 -0
  293. data/spec/rspec/scenarios_spec.rb +19 -0
  294. data/spec/rspec/shared_spec_matchers.rb +947 -0
  295. data/spec/rspec/views_spec.rb +14 -0
  296. data/spec/rspec_matchers_spec.rb +62 -0
  297. data/spec/rspec_spec.rb +145 -0
  298. data/spec/sauce_spec_chrome.rb +43 -0
  299. data/spec/selector_spec.rb +513 -0
  300. data/spec/selenium_spec_chrome.rb +188 -0
  301. data/spec/selenium_spec_chrome_remote.rb +96 -0
  302. data/spec/selenium_spec_edge.rb +47 -0
  303. data/spec/selenium_spec_firefox.rb +208 -0
  304. data/spec/selenium_spec_firefox_remote.rb +80 -0
  305. data/spec/selenium_spec_ie.rb +150 -0
  306. data/spec/selenium_spec_safari.rb +148 -0
  307. data/spec/server_spec.rb +292 -0
  308. data/spec/session_spec.rb +91 -0
  309. data/spec/shared_selenium_node.rb +83 -0
  310. data/spec/shared_selenium_session.rb +476 -0
  311. data/spec/spec_helper.rb +100 -0
  312. data/spec/xpath_builder_spec.rb +93 -0
  313. metadata +753 -0
@@ -0,0 +1,94 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'capybara/session/config'
5
+
6
+ module Capybara
7
+ class Config
8
+ extend Forwardable
9
+
10
+ OPTIONS = %i[app reuse_server threadsafe server default_driver javascript_driver allow_gumbo].freeze
11
+
12
+ attr_accessor :app
13
+ attr_reader :reuse_server, :threadsafe
14
+ attr_reader :session_options
15
+ attr_writer :default_driver, :javascript_driver
16
+ attr_accessor :allow_gumbo
17
+
18
+ SessionConfig::OPTIONS.each do |method|
19
+ def_delegators :session_options, method, "#{method}="
20
+ end
21
+
22
+ def initialize
23
+ @session_options = Capybara::SessionConfig.new
24
+ @javascript_driver = nil
25
+ end
26
+
27
+ attr_writer :reuse_server
28
+
29
+ def threadsafe=(bool)
30
+ if (bool != threadsafe) && Session.instance_created?
31
+ raise 'Threadsafe setting cannot be changed once a session is created'
32
+ end
33
+
34
+ @threadsafe = bool
35
+ end
36
+
37
+ ##
38
+ #
39
+ # Return the proc that Capybara will call to run the Rack application.
40
+ # The block returned receives a rack app, port, and host/ip and should run a Rack handler
41
+ # By default, Capybara will try to use puma.
42
+ #
43
+ attr_reader :server
44
+
45
+ ##
46
+ #
47
+ # Set the server to use.
48
+ #
49
+ # Capybara.server = :webrick
50
+ # Capybara.server = :puma, { Silent: true }
51
+ #
52
+ # @overload server=(name)
53
+ # @param [Symbol] name Name of the server type to use
54
+ # @overload server=([name, options])
55
+ # @param [Symbol] name Name of the server type to use
56
+ # @param [Hash] options Options to pass to the server block
57
+ # @see register_server
58
+ #
59
+ def server=(name)
60
+ name, options = *name if name.is_a? Array
61
+ @server = if name.respond_to? :call
62
+ name
63
+ elsif options
64
+ proc { |app, port, host| Capybara.servers[name.to_sym].call(app, port, host, **options) }
65
+ else
66
+ Capybara.servers[name.to_sym]
67
+ end
68
+ end
69
+
70
+ ##
71
+ #
72
+ # @return [Symbol] The name of the driver to use by default
73
+ #
74
+ def default_driver
75
+ @default_driver || :rack_test
76
+ end
77
+
78
+ ##
79
+ #
80
+ # @return [Symbol] The name of the driver used when JavaScript is needed
81
+ #
82
+ def javascript_driver
83
+ @javascript_driver || :selenium
84
+ end
85
+
86
+ def deprecate(method, alternate_method, once = false)
87
+ @deprecation_notified ||= {}
88
+ unless once && @deprecation_notified[method]
89
+ warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead"
90
+ end
91
+ @deprecation_notified[method] = true
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capybara/dsl'
4
+ require 'capybara/rspec/matchers'
5
+ require 'capybara/rspec/matcher_proxies'
6
+
7
+ World(Capybara::DSL)
8
+ World(Capybara::RSpecMatchers)
9
+
10
+ After do
11
+ Capybara.reset_sessions!
12
+ end
13
+
14
+ Before do
15
+ Capybara.use_default_driver
16
+ end
17
+
18
+ Before '@javascript' do
19
+ Capybara.current_driver = Capybara.javascript_driver
20
+ end
21
+
22
+ Before do |scenario|
23
+ scenario.source_tag_names.each do |tag|
24
+ driver_name = tag.sub(/^@/, '').to_sym
25
+ Capybara.current_driver = driver_name if Capybara.drivers.key?(driver_name)
26
+ end
27
+ end
@@ -0,0 +1,170 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Capybara::Driver::Base
4
+ attr_writer :session
5
+
6
+ def current_url
7
+ raise NotImplementedError
8
+ end
9
+
10
+ def visit(path)
11
+ raise NotImplementedError
12
+ end
13
+
14
+ def refresh
15
+ raise NotImplementedError
16
+ end
17
+
18
+ def find_xpath(query, **options)
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def find_css(query, **options)
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def html
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def go_back
31
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#go_back'
32
+ end
33
+
34
+ def go_forward
35
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#go_forward'
36
+ end
37
+
38
+ def execute_script(script, *args)
39
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#execute_script'
40
+ end
41
+
42
+ def evaluate_script(script, *args)
43
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#evaluate_script'
44
+ end
45
+
46
+ def evaluate_async_script(script, *args)
47
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#evaluate_script_asnyc'
48
+ end
49
+
50
+ def save_screenshot(path, **options)
51
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#save_screenshot'
52
+ end
53
+
54
+ def response_headers
55
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#response_headers'
56
+ end
57
+
58
+ def status_code
59
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#status_code'
60
+ end
61
+
62
+ ##
63
+ #
64
+ # @param frame [Capybara::Node::Element, :parent, :top] The iframe element to switch to
65
+ #
66
+ def switch_to_frame(frame)
67
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#switch_to_frame'
68
+ end
69
+
70
+ def frame_title
71
+ find_xpath('/html/head/title').map(&:all_text).first.to_s
72
+ end
73
+
74
+ def frame_url
75
+ evaluate_script('document.location.href')
76
+ rescue Capybara::NotSupportedByDriverError
77
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#frame_title'
78
+ end
79
+
80
+ def current_window_handle
81
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#current_window_handle'
82
+ end
83
+
84
+ def window_size(handle)
85
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#window_size'
86
+ end
87
+
88
+ def resize_window_to(handle, width, height)
89
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#resize_window_to'
90
+ end
91
+
92
+ def maximize_window(handle)
93
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#maximize_window'
94
+ end
95
+
96
+ def fullscreen_window(handle)
97
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#fullscreen_window'
98
+ end
99
+
100
+ def close_window(handle)
101
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#close_window'
102
+ end
103
+
104
+ def window_handles
105
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#window_handles'
106
+ end
107
+
108
+ def open_new_window
109
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#open_new_window'
110
+ end
111
+
112
+ def switch_to_window(handle)
113
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#switch_to_window'
114
+ end
115
+
116
+ def no_such_window_error
117
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#no_such_window_error'
118
+ end
119
+
120
+ ##
121
+ #
122
+ # Execute the block, and then accept the modal opened.
123
+ # @param type [:alert, :confirm, :prompt]
124
+ # @option options [Numeric] :wait How long to wait for the modal to appear after executing the block.
125
+ # @option options [String, Regexp] :text Text to verify is in the message shown in the modal
126
+ # @option options [String] :with Text to fill in in the case of a prompt
127
+ # @return [String] the message shown in the modal
128
+ # @raise [Capybara::ModalNotFound] if modal dialog hasn't been found
129
+ #
130
+ def accept_modal(type, **options, &blk)
131
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#accept_modal'
132
+ end
133
+
134
+ ##
135
+ #
136
+ # Execute the block, and then dismiss the modal opened.
137
+ # @param type [:alert, :confirm, :prompt]
138
+ # @option options [Numeric] :wait How long to wait for the modal to appear after executing the block.
139
+ # @option options [String, Regexp] :text Text to verify is in the message shown in the modal
140
+ # @return [String] the message shown in the modal
141
+ # @raise [Capybara::ModalNotFound] if modal dialog hasn't been found
142
+ #
143
+ def dismiss_modal(type, **options, &blk)
144
+ raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#dismiss_modal'
145
+ end
146
+
147
+ def invalid_element_errors
148
+ []
149
+ end
150
+
151
+ def wait?
152
+ false
153
+ end
154
+
155
+ def reset!; end
156
+
157
+ def needs_server?
158
+ false
159
+ end
160
+
161
+ def session_options
162
+ session&.config || Capybara.session_options
163
+ end
164
+
165
+ private
166
+
167
+ def session
168
+ @session ||= nil
169
+ end
170
+ end
@@ -0,0 +1,139 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Driver
5
+ class Node
6
+ attr_reader :driver, :native, :initial_cache
7
+
8
+ def initialize(driver, native, initial_cache = {})
9
+ @driver = driver
10
+ @native = native
11
+ @initial_cache = initial_cache
12
+ end
13
+
14
+ def all_text
15
+ raise NotImplementedError
16
+ end
17
+
18
+ def visible_text
19
+ raise NotImplementedError
20
+ end
21
+
22
+ def [](name)
23
+ raise NotImplementedError
24
+ end
25
+
26
+ def value
27
+ raise NotImplementedError
28
+ end
29
+
30
+ def style(styles)
31
+ raise NotImplementedError
32
+ end
33
+
34
+ # @param value [String, Array] Array is only allowed if node has 'multiple' attribute
35
+ # @param options [Hash] Driver specific options for how to set a value on a node
36
+ def set(value, **options)
37
+ raise NotImplementedError
38
+ end
39
+
40
+ def select_option
41
+ raise NotImplementedError
42
+ end
43
+
44
+ def unselect_option
45
+ raise NotImplementedError
46
+ end
47
+
48
+ def click(keys = [], **options)
49
+ raise NotImplementedError
50
+ end
51
+
52
+ def right_click(keys = [], **options)
53
+ raise NotImplementedError
54
+ end
55
+
56
+ def double_click(keys = [], **options)
57
+ raise NotImplementedError
58
+ end
59
+
60
+ def send_keys(*args)
61
+ raise NotImplementedError
62
+ end
63
+
64
+ def hover
65
+ raise NotImplementedError
66
+ end
67
+
68
+ def drag_to(element, **options)
69
+ raise NotImplementedError
70
+ end
71
+
72
+ def drop(*args)
73
+ raise NotImplementedError
74
+ end
75
+
76
+ def scroll_by(x, y)
77
+ raise NotImplementedError
78
+ end
79
+
80
+ def scroll_to(element, alignment, position = nil)
81
+ raise NotImplementedError
82
+ end
83
+
84
+ def tag_name
85
+ raise NotImplementedError
86
+ end
87
+
88
+ def visible?
89
+ raise NotImplementedError
90
+ end
91
+
92
+ def obscured?
93
+ raise NotImplementedError
94
+ end
95
+
96
+ def checked?
97
+ raise NotImplementedError
98
+ end
99
+
100
+ def selected?
101
+ raise NotImplementedError
102
+ end
103
+
104
+ def disabled?
105
+ raise NotImplementedError
106
+ end
107
+
108
+ def readonly?
109
+ !!self[:readonly]
110
+ end
111
+
112
+ def multiple?
113
+ !!self[:multiple]
114
+ end
115
+
116
+ def rect
117
+ raise NotSupportedByDriverError, 'Capybara::Driver::Node#rect'
118
+ end
119
+
120
+ def path
121
+ raise NotSupportedByDriverError, 'Capybara::Driver::Node#path'
122
+ end
123
+
124
+ def trigger(event)
125
+ raise NotSupportedByDriverError, 'Capybara::Driver::Node#trigger'
126
+ end
127
+
128
+ def inspect
129
+ %(#<#{self.class} tag="#{tag_name}" path="#{path}">)
130
+ rescue NotSupportedByDriverError
131
+ %(#<#{self.class} tag="#{tag_name}">)
132
+ end
133
+
134
+ def ==(other)
135
+ raise NotSupportedByDriverError, 'Capybara::Driver::Node#=='
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'capybara'
4
+
5
+ module Capybara
6
+ module DSL
7
+ def self.included(base)
8
+ warn 'including Capybara::DSL in the global scope is not recommended!' if base == Object
9
+ super
10
+ end
11
+
12
+ def self.extended(base)
13
+ warn 'extending the main object with Capybara::DSL is not recommended!' if base == TOPLEVEL_BINDING.eval('self')
14
+ super
15
+ end
16
+
17
+ ##
18
+ #
19
+ # Shortcut to working in a different session.
20
+ #
21
+ def using_session(name_or_session, &block)
22
+ Capybara.using_session(name_or_session, &block)
23
+ end
24
+
25
+ # Shortcut to using a different wait time.
26
+ #
27
+ def using_wait_time(seconds, &block)
28
+ page.using_wait_time(seconds, &block)
29
+ end
30
+
31
+ ##
32
+ #
33
+ # Shortcut to accessing the current session.
34
+ #
35
+ # class MyClass
36
+ # include Capybara::DSL
37
+ #
38
+ # def has_header?
39
+ # page.has_css?('h1')
40
+ # end
41
+ # end
42
+ #
43
+ # @return [Capybara::Session] The current session object
44
+ #
45
+ def page
46
+ Capybara.current_session
47
+ end
48
+
49
+ Session::DSL_METHODS.each do |method|
50
+ if RUBY_VERSION >= '2.7'
51
+ class_eval <<~METHOD, __FILE__, __LINE__ + 1
52
+ def #{method}(...)
53
+ page.method("#{method}").call(...)
54
+ end
55
+ METHOD
56
+ else
57
+ define_method method do |*args, &block|
58
+ page.send method, *args, &block
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ extend(Capybara::DSL)
65
+ end