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.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/History.md +1813 -0
- data/License.txt +22 -0
- data/README.md +1099 -0
- data/lib/capybara.rb +511 -0
- data/lib/capybara/config.rb +94 -0
- data/lib/capybara/cucumber.rb +27 -0
- data/lib/capybara/driver/base.rb +170 -0
- data/lib/capybara/driver/node.rb +139 -0
- data/lib/capybara/dsl.rb +65 -0
- data/lib/capybara/helpers.rb +108 -0
- data/lib/capybara/minitest.rb +386 -0
- data/lib/capybara/minitest/spec.rb +264 -0
- data/lib/capybara/node/actions.rb +420 -0
- data/lib/capybara/node/base.rb +143 -0
- data/lib/capybara/node/document.rb +48 -0
- data/lib/capybara/node/document_matchers.rb +67 -0
- data/lib/capybara/node/element.rb +606 -0
- data/lib/capybara/node/finders.rb +325 -0
- data/lib/capybara/node/matchers.rb +883 -0
- data/lib/capybara/node/simple.rb +208 -0
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +106 -0
- data/lib/capybara/queries/current_path_query.rb +51 -0
- data/lib/capybara/queries/match_query.rb +26 -0
- data/lib/capybara/queries/selector_query.rb +710 -0
- data/lib/capybara/queries/sibling_query.rb +26 -0
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +110 -0
- data/lib/capybara/queries/title_query.rb +39 -0
- data/lib/capybara/rack_test/browser.rb +140 -0
- data/lib/capybara/rack_test/css_handlers.rb +13 -0
- data/lib/capybara/rack_test/driver.rb +109 -0
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +127 -0
- data/lib/capybara/rack_test/node.rb +325 -0
- data/lib/capybara/rails.rb +16 -0
- data/lib/capybara/registrations/drivers.rb +36 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
- data/lib/capybara/registrations/servers.rb +44 -0
- data/lib/capybara/result.rb +190 -0
- data/lib/capybara/rspec.rb +29 -0
- data/lib/capybara/rspec/features.rb +23 -0
- data/lib/capybara/rspec/matcher_proxies.rb +82 -0
- data/lib/capybara/rspec/matchers.rb +201 -0
- data/lib/capybara/rspec/matchers/base.rb +111 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +38 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/selector.rb +233 -0
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
- data/lib/capybara/selector/css.rb +102 -0
- data/lib/capybara/selector/definition.rb +276 -0
- data/lib/capybara/selector/definition/button.rb +51 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +27 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +46 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/filter.rb +5 -0
- data/lib/capybara/selector/filter_set.rb +124 -0
- data/lib/capybara/selector/filters/base.rb +77 -0
- data/lib/capybara/selector/filters/expression_filter.rb +22 -0
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +31 -0
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +147 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/lib/capybara/selenium/driver.rb +496 -0
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +78 -0
- data/lib/capybara/selenium/logger_suppressor.rb +34 -0
- data/lib/capybara/selenium/node.rb +610 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +131 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +47 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server.rb +126 -0
- data/lib/capybara/server/animation_disabler.rb +58 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +69 -0
- data/lib/capybara/session.rb +942 -0
- data/lib/capybara/session/config.rb +124 -0
- data/lib/capybara/session/matchers.rb +87 -0
- data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
- data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +13 -0
- data/lib/capybara/spec/public/jquery.js +5 -0
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +268 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
- data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
- data/lib/capybara/spec/session/all_spec.rb +278 -0
- data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
- data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
- data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
- data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
- data/lib/capybara/spec/session/body_spec.rb +23 -0
- data/lib/capybara/spec/session/check_spec.rb +235 -0
- data/lib/capybara/spec/session/choose_spec.rb +121 -0
- data/lib/capybara/spec/session/click_button_spec.rb +506 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
- data/lib/capybara/spec/session/click_link_spec.rb +229 -0
- data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
- data/lib/capybara/spec/session/current_url_spec.rb +115 -0
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
- data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
- data/lib/capybara/spec/session/find_button_spec.rb +74 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
- data/lib/capybara/spec/session/find_field_spec.rb +113 -0
- data/lib/capybara/spec/session/find_link_spec.rb +70 -0
- data/lib/capybara/spec/session/find_spec.rb +531 -0
- data/lib/capybara/spec/session/first_spec.rb +156 -0
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
- data/lib/capybara/spec/session/go_back_spec.rb +12 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
- data/lib/capybara/spec/session/has_button_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +374 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
- data/lib/capybara/spec/session/has_field_spec.rb +349 -0
- data/lib/capybara/spec/session/has_link_spec.rb +39 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +310 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +198 -0
- data/lib/capybara/spec/session/has_text_spec.rb +394 -0
- data/lib/capybara/spec/session/has_title_spec.rb +71 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
- data/lib/capybara/spec/session/headers_spec.rb +8 -0
- data/lib/capybara/spec/session/html_spec.rb +47 -0
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1292 -0
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +33 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
- data/lib/capybara/spec/session/response_code_spec.rb +8 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
- data/lib/capybara/spec/session/save_page_spec.rb +110 -0
- data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
- data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +229 -0
- data/lib/capybara/spec/session/selectors_spec.rb +98 -0
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/text_spec.rb +74 -0
- data/lib/capybara/spec/session/title_spec.rb +29 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
- data/lib/capybara/spec/session/unselect_spec.rb +116 -0
- data/lib/capybara/spec/session/visit_spec.rb +204 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
- data/lib/capybara/spec/session/window/window_spec.rb +203 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
- data/lib/capybara/spec/session/within_spec.rb +199 -0
- data/lib/capybara/spec/spec_helper.rb +134 -0
- data/lib/capybara/spec/test_app.rb +226 -0
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +5 -0
- data/lib/capybara/spec/views/fieldsets.erb +30 -0
- data/lib/capybara/spec/views/form.erb +685 -0
- data/lib/capybara/spec/views/frame_child.erb +18 -0
- data/lib/capybara/spec/views/frame_one.erb +10 -0
- data/lib/capybara/spec/views/frame_parent.erb +9 -0
- data/lib/capybara/spec/views/frame_two.erb +9 -0
- data/lib/capybara/spec/views/header_links.erb +8 -0
- data/lib/capybara/spec/views/host_links.erb +13 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +32 -0
- data/lib/capybara/spec/views/path.erb +13 -0
- data/lib/capybara/spec/views/popup_one.erb +9 -0
- data/lib/capybara/spec/views/popup_two.erb +9 -0
- data/lib/capybara/spec/views/postback.erb +14 -0
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +20 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +130 -0
- data/lib/capybara/spec/views/with_animation.erb +74 -0
- data/lib/capybara/spec/views/with_base_tag.erb +11 -0
- data/lib/capybara/spec/views/with_count.erb +8 -0
- data/lib/capybara/spec/views/with_dragula.erb +22 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +24 -0
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +208 -0
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +2 -0
- data/lib/capybara/spec/views/with_js.erb +160 -0
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +20 -0
- data/lib/capybara/spec/views/with_scope.erb +42 -0
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +5 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
- data/lib/capybara/spec/views/with_windows.erb +54 -0
- data/lib/capybara/spec/views/within_frames.erb +15 -0
- data/lib/capybara/version.rb +5 -0
- data/lib/capybara/window.rb +146 -0
- data/spec/basic_node_spec.rb +154 -0
- data/spec/capybara_spec.rb +112 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +276 -0
- data/spec/filter_set_spec.rb +46 -0
- data/spec/fixtures/capybara.csv +1 -0
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
- data/spec/minitest_spec.rb +163 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +268 -0
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +196 -0
- data/spec/rspec/features_spec.rb +99 -0
- data/spec/rspec/scenarios_spec.rb +19 -0
- data/spec/rspec/shared_spec_matchers.rb +947 -0
- data/spec/rspec/views_spec.rb +14 -0
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +145 -0
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +513 -0
- data/spec/selenium_spec_chrome.rb +188 -0
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +208 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +150 -0
- data/spec/selenium_spec_safari.rb +148 -0
- data/spec/server_spec.rb +292 -0
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +476 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/xpath_builder_spec.rb +93 -0
- 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
|
data/lib/capybara/dsl.rb
ADDED
|
@@ -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
|