capybara 2.18.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.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/History.md +945 -12
- data/License.txt +1 -1
- data/README.md +264 -90
- data/lib/capybara/config.rb +29 -57
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +35 -18
- data/lib/capybara/driver/node.rb +40 -10
- data/lib/capybara/dsl.rb +10 -7
- data/lib/capybara/helpers.rb +70 -31
- data/lib/capybara/minitest/spec.rb +185 -83
- data/lib/capybara/minitest.rb +232 -112
- data/lib/capybara/node/actions.rb +274 -171
- data/lib/capybara/node/base.rb +42 -34
- data/lib/capybara/node/document.rb +15 -3
- data/lib/capybara/node/document_matchers.rb +19 -21
- data/lib/capybara/node/element.rb +362 -135
- data/lib/capybara/node/finders.rb +151 -137
- data/lib/capybara/node/matchers.rb +394 -209
- data/lib/capybara/node/simple.rb +59 -26
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +12 -9
- data/lib/capybara/queries/base_query.rb +39 -28
- data/lib/capybara/queries/current_path_query.rb +21 -27
- data/lib/capybara/queries/match_query.rb +14 -7
- data/lib/capybara/queries/selector_query.rb +659 -149
- data/lib/capybara/queries/sibling_query.rb +11 -9
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +56 -38
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +114 -42
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +22 -17
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +93 -58
- data/lib/capybara/rack_test/node.rb +184 -81
- data/lib/capybara/rails.rb +3 -7
- data/lib/capybara/registration_container.rb +41 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +66 -0
- data/lib/capybara/result.rb +97 -63
- data/lib/capybara/rspec/features.rb +17 -50
- data/lib/capybara/rspec/matcher_proxies.rb +52 -15
- data/lib/capybara/rspec/matchers/base.rb +113 -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 +69 -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 +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +146 -310
- data/lib/capybara/rspec.rb +7 -11
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
- data/lib/capybara/selector/css.rb +85 -13
- data/lib/capybara/selector/definition/button.rb +68 -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 +28 -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 +55 -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/definition.rb +280 -0
- data/lib/capybara/selector/filter.rb +2 -17
- data/lib/capybara/selector/filter_set.rb +80 -33
- data/lib/capybara/selector/filters/base.rb +50 -6
- data/lib/capybara/selector/filters/expression_filter.rb +8 -26
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -12
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +93 -210
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +475 -523
- 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 +298 -267
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -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 +229 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/node.rb +517 -145
- data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -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/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -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/animation_disabler.rb +80 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +59 -67
- data/lib/capybara/session/config.rb +81 -67
- data/lib/capybara/session/matchers.rb +28 -20
- data/lib/capybara/session.rb +337 -365
- data/lib/capybara/spec/public/jquery.js +5 -5
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +151 -12
- data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
- data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +161 -57
- data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
- 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.rb → assert_title_spec.rb} +22 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +117 -55
- data/lib/capybara/spec/session/choose_spec.rb +64 -31
- data/lib/capybara/spec/session/click_button_spec.rb +231 -173
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
- data/lib/capybara/spec/session/click_link_spec.rb +93 -58
- data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
- data/lib/capybara/spec/session/current_url_spec.rb +57 -39
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
- data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
- data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
- data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
- data/lib/capybara/spec/session/find_button_spec.rb +25 -24
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +37 -41
- data/lib/capybara/spec/session/find_link_spec.rb +46 -17
- data/lib/capybara/spec/session/find_spec.rb +260 -145
- data/lib/capybara/spec/session/first_spec.rb +80 -52
- 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 +33 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
- data/lib/capybara/spec/session/go_back_spec.rb +2 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
- data/lib/capybara/spec/session/has_button_spec.rb +100 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +139 -59
- data/lib/capybara/spec/session/has_link_spec.rb +47 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
- data/lib/capybara/spec/session/has_select_spec.rb +107 -72
- data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +183 -5
- data/lib/capybara/spec/session/has_text_spec.rb +106 -62
- data/lib/capybara/spec/session/has_title_spec.rb +20 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
- data/lib/capybara/spec/session/html_spec.rb +14 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/lib/capybara/spec/session/node_spec.rb +1024 -153
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +12 -6
- data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
- data/lib/capybara/spec/session/save_page_spec.rb +42 -55
- data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/lib/capybara/spec/session/select_spec.rb +107 -81
- data/lib/capybara/spec/session/selectors_spec.rb +52 -19
- data/lib/capybara/spec/session/sibling_spec.rb +10 -10
- data/lib/capybara/spec/session/text_spec.rb +37 -21
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
- data/lib/capybara/spec/session/unselect_spec.rb +39 -38
- data/lib/capybara/spec/session/visit_spec.rb +85 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
- data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
- data/lib/capybara/spec/session/window/window_spec.rb +97 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
- data/lib/capybara/spec/session/within_spec.rb +83 -44
- data/lib/capybara/spec/spec_helper.rb +54 -44
- data/lib/capybara/spec/test_app.rb +158 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +163 -42
- data/lib/capybara/spec/views/frame_child.erb +4 -3
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +1 -1
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/initial_alert.erb +2 -1
- data/lib/capybara/spec/views/layout.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +33 -0
- data/lib/capybara/spec/views/path.erb +2 -2
- data/lib/capybara/spec/views/popup_one.erb +1 -1
- data/lib/capybara/spec/views/popup_two.erb +1 -1
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +21 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +68 -1
- data/lib/capybara/spec/views/with_animation.erb +81 -0
- data/lib/capybara/spec/views/with_base_tag.erb +2 -2
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
- data/lib/capybara/spec/views/with_hover.erb +3 -2
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +69 -12
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +30 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +21 -0
- data/lib/capybara/spec/views/with_scope.erb +2 -2
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_shadow.erb +31 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -1
- data/lib/capybara/spec/views/within_frames.erb +5 -2
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +36 -34
- data/lib/capybara.rb +134 -107
- data/spec/basic_node_spec.rb +60 -34
- data/spec/capybara_spec.rb +63 -88
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +85 -64
- data/spec/filter_set_spec.rb +27 -9
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
- data/spec/minitest_spec.rb +52 -7
- data/spec/minitest_spec_spec.rb +94 -63
- data/spec/per_session_config_spec.rb +14 -13
- data/spec/rack_test_spec.rb +194 -125
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +111 -50
- data/spec/rspec/features_spec.rb +37 -31
- data/spec/rspec/scenarios_spec.rb +10 -8
- data/spec/rspec/shared_spec_matchers.rb +473 -422
- data/spec/rspec/views_spec.rb +5 -3
- data/spec/rspec_matchers_spec.rb +52 -11
- data/spec/rspec_spec.rb +109 -89
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +397 -68
- data/spec/selenium_spec_chrome.rb +187 -40
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +60 -0
- data/spec/selenium_spec_firefox.rb +201 -41
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +149 -0
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +213 -102
- data/spec/session_spec.rb +53 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +473 -122
- data/spec/spec_helper.rb +126 -7
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +355 -73
- data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
- data/.yard/templates_custom/default/class/html/setup.rb +0 -17
- data/.yard/yard_extensions.rb +0 -78
- data/lib/capybara/query.rb +0 -7
- data/lib/capybara/rspec/compound.rb +0 -95
- data/lib/capybara/spec/session/assert_current_path.rb +0 -72
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -234
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
- data/spec/selenium_spec_marionette.rb +0 -127
|
@@ -1,23 +1,25 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Capybara
|
|
3
4
|
module Queries
|
|
4
|
-
class SiblingQuery <
|
|
5
|
+
class SiblingQuery < SelectorQuery
|
|
5
6
|
# @api private
|
|
6
7
|
def resolve_for(node, exact = nil)
|
|
7
8
|
@sibling_node = node
|
|
8
9
|
node.synchronize do
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
scope = node.respond_to?(:session) ? node.session.current_scope : node.find(:xpath, '/*')
|
|
11
|
+
match_results = super(scope, exact)
|
|
12
|
+
siblings = node.find_xpath((XPath.preceding_sibling + XPath.following_sibling).to_s)
|
|
13
|
+
.map(&method(:to_element))
|
|
14
|
+
.select { |el| match_results.include?(el) }
|
|
15
|
+
Capybara::Result.new(ordered_results(siblings), self)
|
|
13
16
|
end
|
|
14
17
|
end
|
|
15
18
|
|
|
16
|
-
def description
|
|
19
|
+
def description(applied = false) # rubocop:disable Style/OptionalBooleanParameter
|
|
17
20
|
desc = super
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
end
|
|
21
|
+
sibling_query = @sibling_node&.instance_variable_get(:@query)
|
|
22
|
+
desc += " that is a sibling of #{sibling_query.description}" if sibling_query
|
|
21
23
|
desc
|
|
22
24
|
end
|
|
23
25
|
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
# @api private
|
|
5
|
+
module Queries
|
|
6
|
+
class StyleQuery < BaseQuery
|
|
7
|
+
def initialize(expected_styles, session_options:, **options)
|
|
8
|
+
@expected_styles = stringify_keys(expected_styles)
|
|
9
|
+
@options = options
|
|
10
|
+
@actual_styles = {}
|
|
11
|
+
super(@options)
|
|
12
|
+
self.session_options = session_options
|
|
13
|
+
|
|
14
|
+
assert_valid_keys
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def resolves_for?(node)
|
|
18
|
+
@node = node
|
|
19
|
+
@actual_styles = node.style(*@expected_styles.keys)
|
|
20
|
+
@expected_styles.all? do |style, value|
|
|
21
|
+
if value.is_a? Regexp
|
|
22
|
+
value.match? @actual_styles[style]
|
|
23
|
+
else
|
|
24
|
+
@actual_styles[style] == value
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def failure_message
|
|
30
|
+
+"Expected node to have styles #{@expected_styles.inspect}. " \
|
|
31
|
+
"Actual styles were #{@actual_styles.inspect}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def stringify_keys(hsh)
|
|
37
|
+
hsh.transform_keys(&:to_s)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def valid_keys
|
|
41
|
+
%i[wait]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -1,28 +1,32 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Capybara
|
|
3
4
|
# @api private
|
|
4
5
|
module Queries
|
|
5
6
|
class TextQuery < BaseQuery
|
|
6
|
-
def initialize(
|
|
7
|
-
@type =
|
|
8
|
-
#
|
|
9
|
-
@options = if args.last.is_a?(Hash) then args.pop.dup else {} end
|
|
10
|
-
super(@options)
|
|
7
|
+
def initialize(type = nil, expected_text, session_options:, **options) # rubocop:disable Style/OptionalArguments
|
|
8
|
+
@type = type.nil? ? default_type : type
|
|
9
|
+
raise ArgumentError, "#{@type} is not a valid type for a text query" unless valid_types.include?(@type)
|
|
11
10
|
|
|
12
|
-
@
|
|
11
|
+
@options = options
|
|
12
|
+
super(@options)
|
|
13
|
+
self.session_options = session_options
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
if expected_text.nil? && !exact?
|
|
16
|
+
warn 'Checking for expected text of nil is confusing and/or pointless since it will always match. ' \
|
|
17
|
+
"Please specify a string or regexp instead. #{Capybara::Helpers.filter_backtrace(caller)}"
|
|
17
18
|
end
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
|
|
20
|
+
@expected_text = expected_text.is_a?(Regexp) ? expected_text : expected_text.to_s
|
|
21
|
+
|
|
22
|
+
@search_regexp = Capybara::Helpers.to_regexp(@expected_text, exact: exact?)
|
|
23
|
+
|
|
20
24
|
assert_valid_keys
|
|
21
25
|
end
|
|
22
26
|
|
|
23
27
|
def resolve_for(node)
|
|
24
28
|
@node = node
|
|
25
|
-
@actual_text = text
|
|
29
|
+
@actual_text = text
|
|
26
30
|
@count = @actual_text.scan(@search_regexp).size
|
|
27
31
|
end
|
|
28
32
|
|
|
@@ -38,60 +42,74 @@ module Capybara
|
|
|
38
42
|
if @expected_text.is_a?(Regexp)
|
|
39
43
|
"text matching #{@expected_text.inspect}"
|
|
40
44
|
else
|
|
41
|
-
"#{
|
|
45
|
+
"#{'exact ' if exact?}text #{@expected_text.inspect}"
|
|
42
46
|
end
|
|
43
47
|
end
|
|
44
48
|
|
|
45
|
-
|
|
49
|
+
private
|
|
46
50
|
|
|
47
51
|
def exact?
|
|
48
52
|
options.fetch(:exact, session_options.exact_text)
|
|
49
53
|
end
|
|
50
54
|
|
|
51
55
|
def build_message(report_on_invisible)
|
|
52
|
-
message =
|
|
56
|
+
message = +''
|
|
53
57
|
unless (COUNT_KEYS & @options.keys).empty?
|
|
54
58
|
message << " but found #{@count} #{Capybara::Helpers.declension('time', 'times', @count)}"
|
|
55
59
|
end
|
|
56
60
|
message << " in #{@actual_text.inspect}"
|
|
57
61
|
|
|
58
62
|
details_message = []
|
|
63
|
+
details_message << case_insensitive_message if @node && check_case_insensitive?
|
|
64
|
+
details_message << invisible_message if @node && check_visible_text? && report_on_invisible
|
|
65
|
+
details_message.compact!
|
|
59
66
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if insensitive_count != @count
|
|
64
|
-
details_message << "it was found #{insensitive_count} #{Capybara::Helpers.declension("time", "times", insensitive_count)} using a case insensitive search"
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
+
message << ". (However, #{details_message.join(' and ')}.)" unless details_message.empty?
|
|
68
|
+
message
|
|
69
|
+
end
|
|
67
70
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if invisible_count != @count
|
|
73
|
-
details_message << "it was found #{invisible_count} #{Capybara::Helpers.declension("time", "times", invisible_count)} including non-visible text"
|
|
74
|
-
end
|
|
75
|
-
rescue
|
|
76
|
-
# An error getting the non-visible text (if element goes out of scope) should not affect the response
|
|
77
|
-
end
|
|
78
|
-
end
|
|
71
|
+
def case_insensitive_message
|
|
72
|
+
insensitive_regexp = Capybara::Helpers.to_regexp(@expected_text, options: Regexp::IGNORECASE)
|
|
73
|
+
insensitive_count = @actual_text.scan(insensitive_regexp).size
|
|
74
|
+
return if insensitive_count == @count
|
|
79
75
|
|
|
80
|
-
|
|
76
|
+
"it was found #{occurrences insensitive_count} using a case insensitive search"
|
|
77
|
+
end
|
|
81
78
|
|
|
82
|
-
|
|
79
|
+
def invisible_message
|
|
80
|
+
invisible_text = text(query_type: :all)
|
|
81
|
+
invisible_count = invisible_text.scan(@search_regexp).size
|
|
82
|
+
return if invisible_count == @count
|
|
83
|
+
|
|
84
|
+
"it was found #{occurrences invisible_count} including non-visible text"
|
|
85
|
+
rescue StandardError
|
|
86
|
+
# An error getting the non-visible text (if element goes out of scope) should not affect the response
|
|
87
|
+
nil
|
|
83
88
|
end
|
|
84
89
|
|
|
85
90
|
def valid_keys
|
|
86
|
-
COUNT_KEYS + [
|
|
91
|
+
COUNT_KEYS + %i[wait exact normalize_ws]
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def valid_types
|
|
95
|
+
%i[all visible]
|
|
87
96
|
end
|
|
88
97
|
|
|
89
98
|
def check_visible_text?
|
|
90
99
|
@type == :visible
|
|
91
100
|
end
|
|
92
101
|
|
|
93
|
-
def
|
|
94
|
-
|
|
102
|
+
def check_case_insensitive?
|
|
103
|
+
!@expected_text.is_a?(Regexp)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def text(node: @node, query_type: @type)
|
|
107
|
+
normalize_ws = options.fetch(:normalize_ws, session_options.default_normalize_ws)
|
|
108
|
+
node.text(query_type, normalize_ws: normalize_ws)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def default_type
|
|
112
|
+
Capybara.ignore_hidden_elements || Capybara.visible_text_only ? :visible : :all
|
|
95
113
|
end
|
|
96
114
|
end
|
|
97
115
|
end
|
|
@@ -1,22 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Capybara
|
|
3
4
|
# @api private
|
|
4
5
|
module Queries
|
|
5
6
|
class TitleQuery < BaseQuery
|
|
6
|
-
def initialize(expected_title, options
|
|
7
|
-
@expected_title = expected_title
|
|
7
|
+
def initialize(expected_title, **options)
|
|
8
|
+
@expected_title = expected_title.is_a?(Regexp) ? expected_title : expected_title.to_s
|
|
8
9
|
@options = options
|
|
9
10
|
super(@options)
|
|
10
|
-
|
|
11
|
-
@expected_title = Capybara::Helpers.normalize_whitespace(@expected_title)
|
|
12
|
-
end
|
|
13
|
-
@search_regexp = Capybara::Helpers.to_regexp(@expected_title, nil, options.fetch(:exact, false))
|
|
11
|
+
@search_regexp = Helpers.to_regexp(@expected_title, all_whitespace: true, exact: options.fetch(:exact, false))
|
|
14
12
|
assert_valid_keys
|
|
15
13
|
end
|
|
16
14
|
|
|
17
15
|
def resolves_for?(node)
|
|
18
|
-
@actual_title = node.title
|
|
19
|
-
@actual_title.match(@search_regexp)
|
|
16
|
+
(@actual_title = node.title).match?(@search_regexp)
|
|
20
17
|
end
|
|
21
18
|
|
|
22
19
|
def failure_message
|
|
@@ -27,15 +24,15 @@ module Capybara
|
|
|
27
24
|
failure_message_helper(' not')
|
|
28
25
|
end
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
private
|
|
31
28
|
|
|
32
29
|
def failure_message_helper(negated = '')
|
|
33
|
-
verb =
|
|
30
|
+
verb = @expected_title.is_a?(Regexp) ? 'match' : 'include'
|
|
34
31
|
"expected #{@actual_title.inspect}#{negated} to #{verb} #{@expected_title.inspect}"
|
|
35
32
|
end
|
|
36
33
|
|
|
37
34
|
def valid_keys
|
|
38
|
-
[
|
|
35
|
+
%i[wait exact]
|
|
39
36
|
end
|
|
40
37
|
end
|
|
41
38
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
class Capybara::RackTest::Browser
|
|
3
4
|
include ::Rack::Test::Methods
|
|
4
5
|
|
|
@@ -7,6 +8,7 @@ class Capybara::RackTest::Browser
|
|
|
7
8
|
|
|
8
9
|
def initialize(driver)
|
|
9
10
|
@driver = driver
|
|
11
|
+
@current_fragment = nil
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def app
|
|
@@ -17,7 +19,9 @@ class Capybara::RackTest::Browser
|
|
|
17
19
|
driver.options
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
def visit(path, attributes
|
|
22
|
+
def visit(path, **attributes)
|
|
23
|
+
@new_visit_request = true
|
|
24
|
+
reset_cache!
|
|
21
25
|
reset_host!
|
|
22
26
|
process_and_follow_redirects(:get, path, attributes)
|
|
23
27
|
end
|
|
@@ -27,59 +31,83 @@ class Capybara::RackTest::Browser
|
|
|
27
31
|
request(last_request.fullpath, last_request.env)
|
|
28
32
|
end
|
|
29
33
|
|
|
30
|
-
def submit(method, path, attributes)
|
|
31
|
-
path = request_path if
|
|
32
|
-
|
|
34
|
+
def submit(method, path, attributes, content_type: nil)
|
|
35
|
+
path = request_path if path.nil? || path.empty?
|
|
36
|
+
uri = build_uri(path)
|
|
37
|
+
uri.query = '' if method.to_s.casecmp('get').zero?
|
|
38
|
+
env = { 'HTTP_REFERER' => referer_url }
|
|
39
|
+
env['CONTENT_TYPE'] = content_type if content_type
|
|
40
|
+
process_and_follow_redirects(
|
|
41
|
+
method,
|
|
42
|
+
uri.to_s,
|
|
43
|
+
attributes,
|
|
44
|
+
env
|
|
45
|
+
)
|
|
33
46
|
end
|
|
34
47
|
|
|
35
|
-
def follow(method, path, attributes
|
|
36
|
-
return if
|
|
37
|
-
|
|
48
|
+
def follow(method, path, **attributes)
|
|
49
|
+
return if fragment_or_script?(path)
|
|
50
|
+
|
|
51
|
+
process_and_follow_redirects(method, path, attributes, 'HTTP_REFERER' => referer_url)
|
|
38
52
|
end
|
|
39
53
|
|
|
40
54
|
def process_and_follow_redirects(method, path, attributes = {}, env = {})
|
|
55
|
+
@current_fragment = build_uri(path).fragment
|
|
41
56
|
process(method, path, attributes, env)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
57
|
+
return unless driver.follow_redirects?
|
|
58
|
+
|
|
59
|
+
driver.redirect_limit.times do
|
|
60
|
+
if last_response.redirect?
|
|
61
|
+
if [307, 308].include? last_response.status
|
|
62
|
+
process(last_request.request_method, last_response['Location'], last_request.params, env)
|
|
63
|
+
else
|
|
64
|
+
process(:get, last_response['Location'], {}, env)
|
|
65
|
+
end
|
|
45
66
|
end
|
|
46
|
-
raise Capybara::InfiniteRedirectError, "redirected more than #{driver.redirect_limit} times, check for infinite redirects." if last_response.redirect?
|
|
47
67
|
end
|
|
48
|
-
end
|
|
49
68
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
method.downcase! unless method.is_a? Symbol
|
|
53
|
-
if path.empty?
|
|
54
|
-
new_uri.path = request_path
|
|
55
|
-
else
|
|
56
|
-
new_uri.path = request_path if path.start_with?("?")
|
|
57
|
-
new_uri.path = "/" if new_uri.path.empty?
|
|
58
|
-
new_uri.path = request_path.sub(%r(/[^/]*$), '/') + new_uri.path unless new_uri.path.start_with?('/')
|
|
69
|
+
if last_response.redirect? # rubocop:disable Style/GuardClause
|
|
70
|
+
raise Capybara::InfiniteRedirectError, "redirected more than #{driver.redirect_limit} times, check for infinite redirects."
|
|
59
71
|
end
|
|
60
|
-
|
|
61
|
-
new_uri.host ||= @current_host
|
|
62
|
-
new_uri.port ||= @current_port unless new_uri.default_port == @current_port
|
|
63
|
-
|
|
64
|
-
@current_scheme = new_uri.scheme
|
|
65
|
-
@current_host = new_uri.host
|
|
66
|
-
@current_port = new_uri.port
|
|
72
|
+
end
|
|
67
73
|
|
|
74
|
+
def process(method, path, attributes = {}, env = {})
|
|
75
|
+
method = method.downcase
|
|
76
|
+
new_uri = build_uri(path)
|
|
77
|
+
@current_scheme, @current_host, @current_port = new_uri.select(:scheme, :host, :port)
|
|
78
|
+
@current_fragment = new_uri.fragment || @current_fragment
|
|
68
79
|
reset_cache!
|
|
80
|
+
@new_visit_request = false
|
|
69
81
|
send(method, new_uri.to_s, attributes, env.merge(options[:headers] || {}))
|
|
70
82
|
end
|
|
71
83
|
|
|
84
|
+
def build_uri(path)
|
|
85
|
+
uri = URI.parse(path)
|
|
86
|
+
base_uri = base_relative_uri_for(uri)
|
|
87
|
+
|
|
88
|
+
uri.path = base_uri.path + uri.path unless uri.absolute? || uri.path.start_with?('/')
|
|
89
|
+
|
|
90
|
+
if base_uri.absolute?
|
|
91
|
+
base_uri.merge(uri)
|
|
92
|
+
else
|
|
93
|
+
uri.scheme ||= @current_scheme
|
|
94
|
+
uri.host ||= @current_host
|
|
95
|
+
uri.port ||= @current_port unless uri.default_port == @current_port
|
|
96
|
+
uri
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
72
100
|
def current_url
|
|
73
|
-
last_request.url
|
|
101
|
+
uri = build_uri(last_request.url)
|
|
102
|
+
uri.fragment = @current_fragment if @current_fragment
|
|
103
|
+
uri.to_s
|
|
74
104
|
rescue Rack::Test::Error
|
|
75
|
-
|
|
105
|
+
''
|
|
76
106
|
end
|
|
77
107
|
|
|
78
108
|
def reset_host!
|
|
79
109
|
uri = URI.parse(driver.session_options.app_host || driver.session_options.default_host)
|
|
80
|
-
@current_scheme = uri.scheme
|
|
81
|
-
@current_host = uri.host
|
|
82
|
-
@current_port = uri.port
|
|
110
|
+
@current_scheme, @current_host, @current_port = uri.select(:scheme, :host, :port)
|
|
83
111
|
end
|
|
84
112
|
|
|
85
113
|
def reset_cache!
|
|
@@ -91,7 +119,7 @@ class Capybara::RackTest::Browser
|
|
|
91
119
|
end
|
|
92
120
|
|
|
93
121
|
def find(format, selector)
|
|
94
|
-
if format
|
|
122
|
+
if format == :css
|
|
95
123
|
dom.css(selector, Capybara::RackTest::CSSHandlers.new)
|
|
96
124
|
else
|
|
97
125
|
dom.xpath(selector)
|
|
@@ -101,20 +129,46 @@ class Capybara::RackTest::Browser
|
|
|
101
129
|
def html
|
|
102
130
|
last_response.body
|
|
103
131
|
rescue Rack::Test::Error
|
|
104
|
-
|
|
132
|
+
''
|
|
105
133
|
end
|
|
106
134
|
|
|
107
135
|
def title
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
136
|
+
dom.title
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def last_request
|
|
140
|
+
raise Rack::Test::Error if @new_visit_request
|
|
141
|
+
|
|
142
|
+
super
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def last_response
|
|
146
|
+
raise Rack::Test::Error if @new_visit_request
|
|
147
|
+
|
|
148
|
+
super
|
|
114
149
|
end
|
|
115
150
|
|
|
116
151
|
protected
|
|
117
152
|
|
|
153
|
+
def base_href
|
|
154
|
+
find(:css, 'head > base').first&.[](:href).to_s
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def base_relative_uri_for(uri)
|
|
158
|
+
base_uri = URI.parse(base_href)
|
|
159
|
+
current_uri = URI.parse(safe_last_request&.url.to_s).tap do |c|
|
|
160
|
+
c.path.sub!(%r{/[^/]*$}, '/') unless uri.path.empty?
|
|
161
|
+
c.path = '/' if c.path.empty?
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
if [current_uri, base_uri].any?(&:absolute?)
|
|
165
|
+
current_uri.merge(base_uri)
|
|
166
|
+
else
|
|
167
|
+
base_uri.path = current_uri.path if base_uri.path.empty?
|
|
168
|
+
base_uri
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
118
172
|
def build_rack_mock_session
|
|
119
173
|
reset_host! unless current_host
|
|
120
174
|
Rack::MockSession.new(app, current_host)
|
|
@@ -123,6 +177,24 @@ protected
|
|
|
123
177
|
def request_path
|
|
124
178
|
last_request.path
|
|
125
179
|
rescue Rack::Test::Error
|
|
126
|
-
|
|
180
|
+
'/'
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def safe_last_request
|
|
184
|
+
last_request
|
|
185
|
+
rescue Rack::Test::Error
|
|
186
|
+
nil
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
private
|
|
190
|
+
|
|
191
|
+
def fragment_or_script?(path)
|
|
192
|
+
path.gsub(/^#{Regexp.escape(request_path)}/, '').start_with?('#') || path.downcase.start_with?('javascript:')
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def referer_url
|
|
196
|
+
build_uri(last_request.url).to_s
|
|
197
|
+
rescue Rack::Test::Error
|
|
198
|
+
''
|
|
127
199
|
end
|
|
128
200
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
class Capybara::RackTest::CSSHandlers < BasicObject
|
|
3
4
|
include ::Kernel
|
|
4
|
-
|
|
5
|
-
def disabled
|
|
5
|
+
|
|
6
|
+
def disabled(list)
|
|
6
7
|
list.find_all { |node| node.has_attribute? 'disabled' }
|
|
7
|
-
end
|
|
8
|
-
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def enabled(list)
|
|
9
11
|
list.find_all { |node| !node.has_attribute? 'disabled' }
|
|
10
12
|
end
|
|
11
13
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'rack/test'
|
|
3
4
|
require 'rack/utils'
|
|
4
5
|
require 'mini_mime'
|
|
@@ -10,12 +11,13 @@ class Capybara::RackTest::Driver < Capybara::Driver::Base
|
|
|
10
11
|
respect_data_method: false,
|
|
11
12
|
follow_redirects: true,
|
|
12
13
|
redirect_limit: 5
|
|
13
|
-
}
|
|
14
|
+
}.freeze
|
|
14
15
|
attr_reader :app, :options
|
|
15
16
|
|
|
16
|
-
def initialize(app, options
|
|
17
|
-
raise ArgumentError,
|
|
18
|
-
|
|
17
|
+
def initialize(app, **options)
|
|
18
|
+
raise ArgumentError, 'rack-test requires a rack application, but none was given' unless app
|
|
19
|
+
|
|
20
|
+
super()
|
|
19
21
|
@app = app
|
|
20
22
|
@options = DEFAULT_OPTIONS.merge(options)
|
|
21
23
|
end
|
|
@@ -40,8 +42,8 @@ class Capybara::RackTest::Driver < Capybara::Driver::Base
|
|
|
40
42
|
browser.last_request
|
|
41
43
|
end
|
|
42
44
|
|
|
43
|
-
def visit(path, attributes
|
|
44
|
-
browser.visit(path, attributes)
|
|
45
|
+
def visit(path, **attributes)
|
|
46
|
+
browser.visit(path, **attributes)
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
def refresh
|
|
@@ -52,7 +54,7 @@ class Capybara::RackTest::Driver < Capybara::Driver::Base
|
|
|
52
54
|
browser.submit(method, path, attributes)
|
|
53
55
|
end
|
|
54
56
|
|
|
55
|
-
def follow(method, path, attributes
|
|
57
|
+
def follow(method, path, **attributes)
|
|
56
58
|
browser.follow(method, path, attributes)
|
|
57
59
|
end
|
|
58
60
|
|
|
@@ -73,7 +75,11 @@ class Capybara::RackTest::Driver < Capybara::Driver::Base
|
|
|
73
75
|
end
|
|
74
76
|
|
|
75
77
|
def find_css(selector)
|
|
76
|
-
browser.find(:css,selector)
|
|
78
|
+
browser.find(:css, selector)
|
|
79
|
+
rescue Nokogiri::CSS::SyntaxError
|
|
80
|
+
raise unless selector.include?(' i]')
|
|
81
|
+
|
|
82
|
+
raise ArgumentError, "This driver doesn't support case insensitive attribute matching when using CSS base selectors"
|
|
77
83
|
end
|
|
78
84
|
|
|
79
85
|
def html
|
|
@@ -92,14 +98,13 @@ class Capybara::RackTest::Driver < Capybara::Driver::Base
|
|
|
92
98
|
@browser = nil
|
|
93
99
|
end
|
|
94
100
|
|
|
95
|
-
|
|
96
|
-
def
|
|
97
|
-
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
def get(*args, &block); browser.get(*args, &block); end
|
|
101
|
-
def post(*args, &block); browser.post(*args, &block); end
|
|
102
|
-
def put(*args, &block); browser.put(*args, &block); end
|
|
103
|
-
def delete(*args, &block); browser.delete(*args, &block); end
|
|
101
|
+
def get(...); browser.get(...); end
|
|
102
|
+
def post(...); browser.post(...); end
|
|
103
|
+
def put(...); browser.put(...); end
|
|
104
|
+
def delete(...); browser.delete(...); end
|
|
104
105
|
def header(key, value); browser.header(key, value); end
|
|
106
|
+
|
|
107
|
+
def invalid_element_errors
|
|
108
|
+
[Capybara::RackTest::Errors::StaleElementReferenceError]
|
|
109
|
+
end
|
|
105
110
|
end
|