capybara 3.23.0 → 3.35.3
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/History.md +264 -11
- data/README.md +10 -6
- data/lib/capybara.rb +20 -8
- data/lib/capybara/config.rb +10 -8
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +4 -0
- data/lib/capybara/driver/node.rb +4 -0
- data/lib/capybara/dsl.rb +10 -2
- data/lib/capybara/helpers.rb +28 -2
- data/lib/capybara/minitest.rb +232 -144
- data/lib/capybara/minitest/spec.rb +156 -97
- data/lib/capybara/node/actions.rb +36 -36
- data/lib/capybara/node/base.rb +6 -6
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +3 -3
- data/lib/capybara/node/element.rb +77 -33
- data/lib/capybara/node/finders.rb +24 -17
- data/lib/capybara/node/matchers.rb +79 -64
- data/lib/capybara/node/simple.rb +11 -4
- data/lib/capybara/queries/ancestor_query.rb +6 -10
- data/lib/capybara/queries/base_query.rb +2 -1
- data/lib/capybara/queries/current_path_query.rb +14 -4
- data/lib/capybara/queries/selector_query.rb +259 -23
- data/lib/capybara/queries/sibling_query.rb +5 -11
- data/lib/capybara/queries/style_query.rb +1 -1
- data/lib/capybara/queries/text_query.rb +13 -1
- data/lib/capybara/rack_test/browser.rb +13 -4
- data/lib/capybara/rack_test/driver.rb +2 -1
- data/lib/capybara/rack_test/form.rb +2 -2
- data/lib/capybara/rack_test/node.rb +42 -6
- data/lib/capybara/registration_container.rb +44 -0
- data/lib/capybara/registrations/drivers.rb +18 -12
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +9 -2
- data/lib/capybara/result.rb +39 -19
- data/lib/capybara/rspec.rb +2 -0
- data/lib/capybara/rspec/matcher_proxies.rb +5 -5
- data/lib/capybara/rspec/matchers.rb +97 -74
- data/lib/capybara/rspec/matchers/base.rb +19 -6
- data/lib/capybara/rspec/matchers/count_sugar.rb +2 -1
- data/lib/capybara/rspec/matchers/have_ancestor.rb +5 -7
- data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
- data/lib/capybara/rspec/matchers/have_selector.rb +15 -10
- data/lib/capybara/rspec/matchers/have_sibling.rb +4 -7
- data/lib/capybara/rspec/matchers/have_text.rb +4 -7
- data/lib/capybara/rspec/matchers/have_title.rb +2 -2
- data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
- data/lib/capybara/rspec/matchers/match_style.rb +7 -2
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/selector.rb +46 -19
- data/lib/capybara/selector/builders/css_builder.rb +10 -6
- data/lib/capybara/selector/builders/xpath_builder.rb +4 -2
- data/lib/capybara/selector/css.rb +1 -1
- data/lib/capybara/selector/definition.rb +13 -11
- data/lib/capybara/selector/definition/button.rb +32 -15
- data/lib/capybara/selector/definition/checkbox.rb +2 -2
- data/lib/capybara/selector/definition/css.rb +3 -1
- data/lib/capybara/selector/definition/datalist_input.rb +2 -2
- data/lib/capybara/selector/definition/datalist_option.rb +1 -1
- data/lib/capybara/selector/definition/element.rb +3 -2
- data/lib/capybara/selector/definition/field.rb +1 -1
- data/lib/capybara/selector/definition/file_field.rb +1 -1
- data/lib/capybara/selector/definition/fillable_field.rb +2 -2
- data/lib/capybara/selector/definition/label.rb +5 -3
- data/lib/capybara/selector/definition/link.rb +8 -0
- data/lib/capybara/selector/definition/option.rb +1 -1
- data/lib/capybara/selector/definition/radio_button.rb +2 -2
- data/lib/capybara/selector/definition/select.rb +33 -14
- data/lib/capybara/selector/definition/table.rb +6 -3
- data/lib/capybara/selector/definition/table_row.rb +2 -2
- data/lib/capybara/selector/filter_set.rb +13 -11
- data/lib/capybara/selector/filters/base.rb +6 -1
- data/lib/capybara/selector/filters/locator_filter.rb +1 -1
- data/lib/capybara/selector/regexp_disassembler.rb +7 -0
- data/lib/capybara/selector/selector.rb +13 -3
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -1
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -1
- data/lib/capybara/selenium/atoms/src/getAttribute.js +1 -1
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +10 -10
- data/lib/capybara/selenium/driver.rb +86 -24
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +24 -21
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +21 -19
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +17 -1
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +0 -4
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +37 -26
- data/lib/capybara/selenium/extensions/html5_drag.rb +55 -11
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +8 -10
- data/lib/capybara/selenium/logger_suppressor.rb +8 -2
- data/lib/capybara/selenium/node.rb +160 -40
- data/lib/capybara/selenium/nodes/chrome_node.rb +72 -12
- data/lib/capybara/selenium/nodes/edge_node.rb +32 -14
- data/lib/capybara/selenium/nodes/firefox_node.rb +28 -32
- data/lib/capybara/selenium/nodes/safari_node.rb +5 -29
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +4 -4
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +32 -7
- data/lib/capybara/server.rb +19 -3
- data/lib/capybara/server/animation_disabler.rb +8 -3
- data/lib/capybara/server/checker.rb +1 -1
- data/lib/capybara/server/middleware.rb +22 -10
- data/lib/capybara/session.rb +66 -40
- data/lib/capybara/session/config.rb +11 -3
- data/lib/capybara/session/matchers.rb +11 -11
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +75 -7
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
- data/lib/capybara/spec/session/all_spec.rb +60 -5
- data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
- data/lib/capybara/spec/session/assert_text_spec.rb +9 -5
- data/lib/capybara/spec/session/check_spec.rb +6 -0
- data/lib/capybara/spec/session/click_button_spec.rb +16 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +9 -0
- data/lib/capybara/spec/session/current_url_spec.rb +11 -1
- data/lib/capybara/spec/session/fill_in_spec.rb +29 -0
- data/lib/capybara/spec/session/find_spec.rb +55 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +2 -0
- data/lib/capybara/spec/session/has_button_spec.rb +51 -0
- data/lib/capybara/spec/session/has_css_spec.rb +26 -4
- data/lib/capybara/spec/session/has_current_path_spec.rb +15 -2
- data/lib/capybara/spec/session/has_field_spec.rb +34 -0
- data/lib/capybara/spec/session/has_select_spec.rb +32 -4
- data/lib/capybara/spec/session/has_selector_spec.rb +4 -4
- data/lib/capybara/spec/session/has_table_spec.rb +51 -5
- data/lib/capybara/spec/session/has_text_spec.rb +30 -0
- data/lib/capybara/spec/session/html_spec.rb +1 -1
- data/lib/capybara/spec/session/matches_style_spec.rb +2 -2
- data/lib/capybara/spec/session/node_spec.rb +394 -9
- data/lib/capybara/spec/session/refresh_spec.rb +2 -1
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/save_page_spec.rb +4 -4
- data/lib/capybara/spec/session/save_screenshot_spec.rb +4 -15
- data/lib/capybara/spec/session/selectors_spec.rb +16 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -1
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -1
- data/lib/capybara/spec/session/window/window_spec.rb +8 -8
- data/lib/capybara/spec/session/window/windows_spec.rb +1 -1
- data/lib/capybara/spec/spec_helper.rb +14 -14
- data/lib/capybara/spec/test_app.rb +27 -21
- data/lib/capybara/spec/views/form.erb +47 -4
- data/lib/capybara/spec/views/offset.erb +32 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/with_animation.erb +37 -1
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_html.erb +24 -2
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +4 -1
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +3 -7
- data/spec/basic_node_spec.rb +15 -14
- data/spec/capybara_spec.rb +28 -28
- data/spec/dsl_spec.rb +16 -3
- data/spec/filter_set_spec.rb +5 -5
- data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
- data/spec/minitest_spec.rb +3 -2
- data/spec/minitest_spec_spec.rb +46 -46
- data/spec/rack_test_spec.rb +38 -15
- data/spec/regexp_dissassembler_spec.rb +52 -38
- data/spec/result_spec.rb +43 -32
- data/spec/rspec/features_spec.rb +4 -1
- data/spec/rspec/scenarios_spec.rb +4 -0
- data/spec/rspec/shared_spec_matchers.rb +68 -56
- data/spec/rspec_spec.rb +9 -5
- data/spec/selector_spec.rb +32 -17
- data/spec/selenium_spec_chrome.rb +78 -11
- data/spec/selenium_spec_chrome_remote.rb +23 -6
- data/spec/selenium_spec_edge.rb +15 -12
- data/spec/selenium_spec_firefox.rb +24 -19
- data/spec/selenium_spec_firefox_remote.rb +0 -8
- data/spec/selenium_spec_ie.rb +1 -6
- data/spec/server_spec.rb +106 -44
- data/spec/session_spec.rb +5 -5
- data/spec/shared_selenium_node.rb +56 -2
- data/spec/shared_selenium_session.rb +122 -15
- data/spec/spec_helper.rb +2 -2
- metadata +63 -17
- data/lib/capybara/spec/session/source_spec.rb +0 -0
data/lib/capybara/config.rb
CHANGED
@@ -9,11 +9,9 @@ module Capybara
|
|
9
9
|
|
10
10
|
OPTIONS = %i[app reuse_server threadsafe server default_driver javascript_driver allow_gumbo].freeze
|
11
11
|
|
12
|
-
attr_accessor :app
|
13
|
-
attr_reader :reuse_server, :threadsafe
|
14
|
-
attr_reader :session_options
|
12
|
+
attr_accessor :app, :allow_gumbo
|
13
|
+
attr_reader :reuse_server, :threadsafe, :session_options
|
15
14
|
attr_writer :default_driver, :javascript_driver
|
16
|
-
attr_accessor :allow_gumbo
|
17
15
|
|
18
16
|
SessionConfig::OPTIONS.each do |method|
|
19
17
|
def_delegators :session_options, method, "#{method}="
|
@@ -27,7 +25,9 @@ module Capybara
|
|
27
25
|
attr_writer :reuse_server
|
28
26
|
|
29
27
|
def threadsafe=(bool)
|
30
|
-
|
28
|
+
if (bool != threadsafe) && Session.instance_created?
|
29
|
+
raise 'Threadsafe setting cannot be changed once a session is created'
|
30
|
+
end
|
31
31
|
|
32
32
|
@threadsafe = bool
|
33
33
|
end
|
@@ -59,7 +59,7 @@ module Capybara
|
|
59
59
|
@server = if name.respond_to? :call
|
60
60
|
name
|
61
61
|
elsif options
|
62
|
-
proc { |app, port, host| Capybara.servers[name.to_sym].call(app, port, host, options) }
|
62
|
+
proc { |app, port, host| Capybara.servers[name.to_sym].call(app, port, host, **options) }
|
63
63
|
else
|
64
64
|
Capybara.servers[name.to_sym]
|
65
65
|
end
|
@@ -81,9 +81,11 @@ module Capybara
|
|
81
81
|
@javascript_driver || :selenium
|
82
82
|
end
|
83
83
|
|
84
|
-
def deprecate(method, alternate_method, once
|
84
|
+
def deprecate(method, alternate_method, once: false)
|
85
85
|
@deprecation_notified ||= {}
|
86
|
-
|
86
|
+
unless once && @deprecation_notified[method]
|
87
|
+
Capybara::Helpers.warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead: #{Capybara::Helpers.filter_backtrace(caller)}"
|
88
|
+
end
|
87
89
|
@deprecation_notified[method] = true
|
88
90
|
end
|
89
91
|
end
|
data/lib/capybara/cucumber.rb
CHANGED
@@ -22,6 +22,6 @@ end
|
|
22
22
|
Before do |scenario|
|
23
23
|
scenario.source_tag_names.each do |tag|
|
24
24
|
driver_name = tag.sub(/^@/, '').to_sym
|
25
|
-
Capybara.current_driver = driver_name if Capybara.drivers
|
25
|
+
Capybara.current_driver = driver_name if Capybara.drivers[driver_name]
|
26
26
|
end
|
27
27
|
end
|
data/lib/capybara/driver/base.rb
CHANGED
@@ -59,6 +59,10 @@ class Capybara::Driver::Base
|
|
59
59
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#status_code'
|
60
60
|
end
|
61
61
|
|
62
|
+
def send_keys(*)
|
63
|
+
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#send_keys'
|
64
|
+
end
|
65
|
+
|
62
66
|
##
|
63
67
|
#
|
64
68
|
# @param frame [Capybara::Node::Element, :parent, :top] The iframe element to switch to
|
data/lib/capybara/driver/node.rb
CHANGED
data/lib/capybara/dsl.rb
CHANGED
@@ -47,8 +47,16 @@ module Capybara
|
|
47
47
|
end
|
48
48
|
|
49
49
|
Session::DSL_METHODS.each do |method|
|
50
|
-
|
51
|
-
|
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
|
52
60
|
end
|
53
61
|
end
|
54
62
|
end
|
data/lib/capybara/helpers.rb
CHANGED
@@ -15,7 +15,7 @@ module Capybara
|
|
15
15
|
# @return [String] Normalized text
|
16
16
|
#
|
17
17
|
def normalize_whitespace(text)
|
18
|
-
warn 'DEPRECATED: Capybara::Helpers::normalize_whitespace is deprecated, please update your driver'
|
18
|
+
Capybara::Helpers.warn 'DEPRECATED: Capybara::Helpers::normalize_whitespace is deprecated, please update your driver'
|
19
19
|
text.to_s.gsub(/[[:space:]]+/, ' ').strip
|
20
20
|
end
|
21
21
|
|
@@ -70,6 +70,30 @@ module Capybara
|
|
70
70
|
count == 1 ? singular : plural
|
71
71
|
end
|
72
72
|
|
73
|
+
def filter_backtrace(trace)
|
74
|
+
return 'No backtrace' unless trace
|
75
|
+
|
76
|
+
filter = %r{lib/capybara/|lib/rspec/|lib/minitest/}
|
77
|
+
new_trace = trace.take_while { |line| line !~ filter }
|
78
|
+
new_trace = trace.reject { |line| line =~ filter } if new_trace.empty?
|
79
|
+
new_trace = trace.dup if new_trace.empty?
|
80
|
+
|
81
|
+
new_trace.first.split(/:in /, 2).first
|
82
|
+
end
|
83
|
+
|
84
|
+
def warn(message, uplevel: 1)
|
85
|
+
return Kernel.warn(message, uplevel: uplevel) if RUBY_VERSION >= '2.6'
|
86
|
+
|
87
|
+
# TODO: Remove when we drop support for Ruby 2.5
|
88
|
+
# Workaround for emulating `warn '...', uplevel: n` in Ruby 2.5 or lower.
|
89
|
+
if (match = /^(?<file>.+?):(?<line>\d+)(?::in `.*')?/.match(caller[uplevel]))
|
90
|
+
location = [match[:file], match[:line]].join(':')
|
91
|
+
Kernel.warn "#{location}: #{message}"
|
92
|
+
else
|
93
|
+
Kernel.warn message
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
73
97
|
if defined?(Process::CLOCK_MONOTONIC)
|
74
98
|
def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC; end
|
75
99
|
else
|
@@ -87,7 +111,9 @@ module Capybara
|
|
87
111
|
end
|
88
112
|
|
89
113
|
def expired?
|
90
|
-
|
114
|
+
if stalled?
|
115
|
+
raise Capybara::FrozenInTime, 'Time appears to be frozen. Capybara does not work with libraries which freeze time, consider using time travelling instead'
|
116
|
+
end
|
91
117
|
|
92
118
|
current - @start >= @expire_in
|
93
119
|
end
|
data/lib/capybara/minitest.rb
CHANGED
@@ -6,48 +6,54 @@ require 'capybara/dsl'
|
|
6
6
|
module Capybara
|
7
7
|
module Minitest
|
8
8
|
module Assertions
|
9
|
-
##
|
9
|
+
##
|
10
|
+
# Assert text exists
|
10
11
|
#
|
12
|
+
# @!method assert_content
|
11
13
|
# @!method assert_text
|
12
|
-
#
|
14
|
+
# See {Capybara::Node::Matchers#assert_text}
|
13
15
|
|
14
|
-
##
|
16
|
+
##
|
17
|
+
# Assert text does not exist
|
15
18
|
#
|
19
|
+
# @!method refute_content
|
20
|
+
# @!method assert_no_content
|
21
|
+
# @!method refute_text
|
16
22
|
# @!method assert_no_text
|
17
|
-
#
|
23
|
+
# See {Capybara::Node::Matchers#assert_no_text}
|
18
24
|
|
19
25
|
##
|
20
26
|
# Assertion that page title does match
|
21
27
|
#
|
22
28
|
# @!method assert_title
|
23
|
-
#
|
29
|
+
# See {Capybara::Node::DocumentMatchers#assert_title}
|
24
30
|
|
25
31
|
##
|
26
32
|
# Assertion that page title does not match
|
27
33
|
#
|
28
34
|
# @!method refute_title
|
29
35
|
# @!method assert_no_title
|
30
|
-
#
|
36
|
+
# See {Capybara::Node::DocumentMatchers#assert_no_title}
|
31
37
|
|
32
38
|
##
|
33
39
|
# Assertion that current path matches
|
34
40
|
#
|
35
41
|
# @!method assert_current_path
|
36
|
-
#
|
42
|
+
# See {Capybara::SessionMatchers#assert_current_path}
|
37
43
|
|
38
44
|
##
|
39
45
|
# Assertion that current page does not match
|
40
46
|
#
|
41
47
|
# @!method refute_current_path
|
42
48
|
# @!method assert_no_current_path
|
43
|
-
#
|
49
|
+
# See {Capybara::SessionMatchers#assert_no_current_path}
|
44
50
|
|
45
51
|
%w[text no_text title no_title current_path no_current_path].each do |assertion_name|
|
46
52
|
class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
47
|
-
def assert_#{assertion_name}
|
53
|
+
def assert_#{assertion_name}(*args, **kwargs, &optional_filter_block)
|
48
54
|
self.assertions +=1
|
49
55
|
subject, args = determine_subject(args)
|
50
|
-
subject.assert_#{assertion_name}(*args)
|
56
|
+
subject.assert_#{assertion_name}(*args, **kwargs, &optional_filter_block)
|
51
57
|
rescue Capybara::ExpectationNotMet => e
|
52
58
|
raise ::Minitest::Assertion, e.message
|
53
59
|
end
|
@@ -61,40 +67,81 @@ module Capybara
|
|
61
67
|
alias_method :assert_content, :assert_text
|
62
68
|
alias_method :assert_no_content, :refute_text
|
63
69
|
|
64
|
-
##
|
70
|
+
##
|
71
|
+
# Assert selector exists on page
|
65
72
|
#
|
66
73
|
# @!method assert_selector
|
67
|
-
#
|
74
|
+
# See {Capybara::Node::Matchers#assert_selector}
|
68
75
|
|
69
|
-
##
|
76
|
+
##
|
77
|
+
# Assert selector does not exist on page
|
70
78
|
#
|
79
|
+
# @!method refute_selector
|
71
80
|
# @!method assert_no_selector
|
72
|
-
#
|
81
|
+
# See {Capybara::Node::Matchers#assert_no_selector}
|
73
82
|
|
74
|
-
##
|
83
|
+
##
|
84
|
+
# Assert element matches selector
|
75
85
|
#
|
76
86
|
# @!method assert_matches_selector
|
77
|
-
#
|
87
|
+
# See {Capybara::Node::Matchers#assert_matches_selector}
|
88
|
+
|
89
|
+
##
|
90
|
+
# Assert element does not match selector
|
91
|
+
#
|
92
|
+
# @!method refute_matches_selector
|
93
|
+
# @!method assert_not_matches_selector
|
94
|
+
# See {Capybara::Node::Matchers#assert_not_matches_selector}
|
78
95
|
|
79
|
-
##
|
96
|
+
##
|
97
|
+
# Assert all of the provided selectors exist on page
|
80
98
|
#
|
81
|
-
# @!method
|
82
|
-
#
|
99
|
+
# @!method assert_all_of_selectors
|
100
|
+
# See {Capybara::Node::Matchers#assert_all_of_selectors}
|
101
|
+
|
102
|
+
##
|
103
|
+
# Assert none of the provided selectors exist on page
|
104
|
+
#
|
105
|
+
# @!method assert_none_of_selectors
|
106
|
+
# See {Capybara::Node::Matchers#assert_none_of_selectors}
|
107
|
+
|
108
|
+
##
|
109
|
+
# Assert any of the provided selectors exist on page
|
110
|
+
#
|
111
|
+
# @!method assert_any_of_selectors
|
112
|
+
# See {Capybara::Node::Matchers#assert_any_of_selectors}
|
83
113
|
|
84
|
-
##
|
114
|
+
##
|
115
|
+
# Assert element has the provided CSS styles
|
85
116
|
#
|
86
117
|
# @!method assert_matches_style
|
87
|
-
#
|
118
|
+
# See {Capybara::Node::Matchers#assert_matches_style}
|
88
119
|
|
89
|
-
##
|
120
|
+
##
|
121
|
+
# Assert element has a matching sibling
|
90
122
|
#
|
91
123
|
# @!method assert_sibling
|
92
|
-
#
|
124
|
+
# See {Capybara::Node::Matchers#assert_sibling}
|
93
125
|
|
94
|
-
##
|
126
|
+
##
|
127
|
+
# Assert element does not have a matching sibling
|
128
|
+
#
|
129
|
+
# @!method refute_sibling
|
130
|
+
# @!method assert_no_sibling
|
131
|
+
# See {Capybara::Node::Matchers#assert_no_sibling}
|
132
|
+
|
133
|
+
##
|
134
|
+
# Assert element has a matching ancestor
|
95
135
|
#
|
96
136
|
# @!method assert_ancestor
|
97
|
-
#
|
137
|
+
# See {Capybara::Node::Matchers#assert_ancestor}
|
138
|
+
|
139
|
+
##
|
140
|
+
# Assert element does not have a matching ancestor
|
141
|
+
#
|
142
|
+
# @!method refute_ancestor
|
143
|
+
# @!method assert_no_ancestor
|
144
|
+
# See {Capybara::Node::Matchers#assert_no_ancestor}
|
98
145
|
|
99
146
|
%w[selector no_selector matches_style
|
100
147
|
all_of_selectors none_of_selectors any_of_selectors
|
@@ -109,6 +156,7 @@ module Capybara
|
|
109
156
|
raise ::Minitest::Assertion, e.message
|
110
157
|
end
|
111
158
|
ASSERTION
|
159
|
+
ruby2_keywords "assert_#{assertion_name}" if respond_to?(:ruby2_keywords)
|
112
160
|
end
|
113
161
|
|
114
162
|
alias_method :refute_selector, :assert_no_selector
|
@@ -116,18 +164,137 @@ module Capybara
|
|
116
164
|
alias_method :refute_ancestor, :assert_no_ancestor
|
117
165
|
alias_method :refute_sibling, :assert_no_sibling
|
118
166
|
|
167
|
+
##
|
168
|
+
# Assert that provided xpath exists
|
169
|
+
#
|
170
|
+
# @!method assert_xpath
|
171
|
+
# See {Capybara::Node::Matchers#has_xpath?}
|
172
|
+
|
173
|
+
##
|
174
|
+
# Assert that provide xpath does not exist
|
175
|
+
#
|
176
|
+
# @!method refute_xpath
|
177
|
+
# @!method assert_no_xpath
|
178
|
+
# See {Capybara::Node::Matchers#has_no_xpath?}
|
179
|
+
|
180
|
+
##
|
181
|
+
# Assert that provided css exists
|
182
|
+
#
|
183
|
+
# @!method assert_css
|
184
|
+
# See {Capybara::Node::Matchers#has_css?}
|
185
|
+
|
186
|
+
##
|
187
|
+
# Assert that provided css does not exist
|
188
|
+
#
|
189
|
+
# @!method refute_css
|
190
|
+
# @!method assert_no_css
|
191
|
+
# See {Capybara::Node::Matchers#has_no_css?}
|
192
|
+
|
193
|
+
##
|
194
|
+
# Assert that provided link exists
|
195
|
+
#
|
196
|
+
# @!method assert_link
|
197
|
+
# See {Capybara::Node::Matchers#has_link?}
|
198
|
+
|
199
|
+
##
|
200
|
+
# Assert that provided link does not exist
|
201
|
+
#
|
202
|
+
# @!method assert_no_link
|
203
|
+
# @!method refute_link
|
204
|
+
# See {Capybara::Node::Matchers#has_no_link?}
|
205
|
+
|
206
|
+
##
|
207
|
+
# Assert that provided button exists
|
208
|
+
#
|
209
|
+
# @!method assert_button
|
210
|
+
# See {Capybara::Node::Matchers#has_button?}
|
211
|
+
|
212
|
+
##
|
213
|
+
# Assert that provided button does not exist
|
214
|
+
#
|
215
|
+
# @!method refute_button
|
216
|
+
# @!method assert_no_button
|
217
|
+
# See {Capybara::Node::Matchers#has_no_button?}
|
218
|
+
|
219
|
+
##
|
220
|
+
# Assert that provided field exists
|
221
|
+
#
|
222
|
+
# @!method assert_field
|
223
|
+
# See {Capybara::Node::Matchers#has_field?}
|
224
|
+
|
225
|
+
##
|
226
|
+
# Assert that provided field does not exist
|
227
|
+
#
|
228
|
+
# @!method refute_field
|
229
|
+
# @!method assert_no_field
|
230
|
+
# See {Capybara::Node::Matchers#has_no_field?}
|
231
|
+
|
232
|
+
##
|
233
|
+
# Assert that provided checked field exists
|
234
|
+
#
|
235
|
+
# @!method assert_checked_field
|
236
|
+
# See {Capybara::Node::Matchers#has_checked_field?}
|
237
|
+
|
238
|
+
##
|
239
|
+
# Assert that provided checked_field does not exist
|
240
|
+
#
|
241
|
+
# @!method assert_no_checked_field
|
242
|
+
# @!method refute_checked_field
|
243
|
+
# See {Capybara::Node::Matchers#has_no_checked_field?}
|
244
|
+
|
245
|
+
##
|
246
|
+
# Assert that provided unchecked field exists
|
247
|
+
#
|
248
|
+
# @!method assert_unchecked_field
|
249
|
+
# See {Capybara::Node::Matchers#has_unchecked_field?}
|
250
|
+
|
251
|
+
##
|
252
|
+
# Assert that provided unchecked field does not exist
|
253
|
+
#
|
254
|
+
# @!method assert_no_unchecked_field
|
255
|
+
# @!method refute_unchecked_field
|
256
|
+
# See {Capybara::Node::Matchers#has_no_unchecked_field?}
|
257
|
+
|
258
|
+
##
|
259
|
+
# Assert that provided select exists
|
260
|
+
#
|
261
|
+
# @!method assert_select
|
262
|
+
# See {Capybara::Node::Matchers#has_select?}
|
263
|
+
|
264
|
+
##
|
265
|
+
# Assert that provided select does not exist
|
266
|
+
#
|
267
|
+
# @!method refute_select
|
268
|
+
# @!method assert_no_select
|
269
|
+
# See {Capybara::Node::Matchers#has_no_select?}
|
270
|
+
|
271
|
+
##
|
272
|
+
# Assert that provided table exists
|
273
|
+
#
|
274
|
+
# @!method assert_table
|
275
|
+
# See {Capybara::Node::Matchers#has_table?}
|
276
|
+
|
277
|
+
##
|
278
|
+
# Assert that provided table does not exist
|
279
|
+
#
|
280
|
+
# @!method refute_table
|
281
|
+
# @!method assert_no_table
|
282
|
+
# See {Capybara::Node::Matchers#has_no_table?}
|
283
|
+
|
119
284
|
%w[xpath css link button field select table].each do |selector_type|
|
120
285
|
define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
|
121
286
|
subject, args = determine_subject(args)
|
122
287
|
locator, options = extract_locator(args)
|
123
|
-
assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
|
288
|
+
assert_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
|
124
289
|
end
|
290
|
+
ruby2_keywords "assert_#{selector_type}" if respond_to?(:ruby2_keywords)
|
125
291
|
|
126
292
|
define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
|
127
293
|
subject, args = determine_subject(args)
|
128
294
|
locator, options = extract_locator(args)
|
129
|
-
assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
|
295
|
+
assert_no_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
|
130
296
|
end
|
297
|
+
ruby2_keywords "assert_no_#{selector_type}" if respond_to?(:ruby2_keywords)
|
131
298
|
alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
|
132
299
|
end
|
133
300
|
|
@@ -135,145 +302,66 @@ module Capybara
|
|
135
302
|
define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
|
136
303
|
subject, args = determine_subject(args)
|
137
304
|
locator, options = extract_locator(args)
|
138
|
-
assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
|
305
|
+
assert_selector(subject, :field, locator, **options.merge(field_type.to_sym => true), &optional_filter_block)
|
139
306
|
end
|
307
|
+
ruby2_keywords "assert_#{field_type}_field" if respond_to?(:ruby2_keywords)
|
140
308
|
|
141
309
|
define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
|
142
310
|
subject, args = determine_subject(args)
|
143
311
|
locator, options = extract_locator(args)
|
144
|
-
assert_no_selector(
|
312
|
+
assert_no_selector(
|
313
|
+
subject,
|
314
|
+
:field,
|
315
|
+
locator,
|
316
|
+
**options.merge(field_type.to_sym => true),
|
317
|
+
&optional_filter_block
|
318
|
+
)
|
145
319
|
end
|
320
|
+
ruby2_keywords "assert_no_#{field_type}_field" if respond_to?(:ruby2_keywords)
|
146
321
|
alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
|
147
322
|
end
|
148
323
|
|
324
|
+
##
|
325
|
+
# Assert that element matches xpath
|
326
|
+
#
|
327
|
+
# @!method assert_matches_xpath
|
328
|
+
# See {Capybara::Node::Matchers#matches_xpath?}
|
329
|
+
|
330
|
+
##
|
331
|
+
# Assert that element does not match xpath
|
332
|
+
#
|
333
|
+
# @!method refute_matches_xpath
|
334
|
+
# @!method assert_not_matches_xpath
|
335
|
+
# See {Capybara::Node::Matchers#not_matches_xpath?}
|
336
|
+
|
337
|
+
##
|
338
|
+
# Assert that element matches css
|
339
|
+
#
|
340
|
+
# @!method assert_matches_css
|
341
|
+
# See {Capybara::Node::Matchers#matches_css?}
|
342
|
+
|
343
|
+
##
|
344
|
+
# Assert that element matches css
|
345
|
+
#
|
346
|
+
# @!method refute_matches_css
|
347
|
+
# @!method assert_not_matches_css
|
348
|
+
# See {Capybara::Node::Matchers#not_matches_css?}
|
349
|
+
|
149
350
|
%w[xpath css].each do |selector_type|
|
150
351
|
define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
|
151
352
|
subject, args = determine_subject(args)
|
152
353
|
assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
|
153
354
|
end
|
355
|
+
ruby2_keywords "assert_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
|
154
356
|
|
155
357
|
define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
|
156
358
|
subject, args = determine_subject(args)
|
157
359
|
assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
|
158
360
|
end
|
361
|
+
ruby2_keywords "assert_not_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
|
159
362
|
alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
|
160
363
|
end
|
161
364
|
|
162
|
-
##
|
163
|
-
# Assertion that there is xpath
|
164
|
-
#
|
165
|
-
# @!method assert_xpath
|
166
|
-
# see {Capybara::Node::Matchers#has_xpath?}
|
167
|
-
|
168
|
-
##
|
169
|
-
# Assertion that there is no xpath
|
170
|
-
#
|
171
|
-
# @!method refute_xpath
|
172
|
-
# @!method assert_no_xpath
|
173
|
-
# see {Capybara::Node::Matchers#has_no_xpath?}
|
174
|
-
|
175
|
-
##
|
176
|
-
# Assertion that there is css
|
177
|
-
#
|
178
|
-
# @!method assert_css
|
179
|
-
# see {Capybara::Node::Matchers#has_css?}
|
180
|
-
|
181
|
-
##
|
182
|
-
# Assertion that there is no css
|
183
|
-
#
|
184
|
-
# @!method refute_css
|
185
|
-
# @!method assert_no_css
|
186
|
-
# see {Capybara::Node::Matchers#has_no_css?}
|
187
|
-
|
188
|
-
##
|
189
|
-
# Assertion that there is link
|
190
|
-
#
|
191
|
-
# @!method assert_link
|
192
|
-
# see {Capybara::Node::Matchers#has_link?}
|
193
|
-
|
194
|
-
##
|
195
|
-
# Assertion that there is no link
|
196
|
-
#
|
197
|
-
# @!method assert_no_link
|
198
|
-
# @!method refute_link
|
199
|
-
# see {Capybara::Node::Matchers#has_no_link?}
|
200
|
-
|
201
|
-
##
|
202
|
-
# Assertion that there is button
|
203
|
-
#
|
204
|
-
# @!method assert_button
|
205
|
-
# see {Capybara::Node::Matchers#has_button?}
|
206
|
-
|
207
|
-
##
|
208
|
-
# Assertion that there is no button
|
209
|
-
#
|
210
|
-
# @!method refute_button
|
211
|
-
# @!method assert_no_button
|
212
|
-
# see {Capybara::Node::Matchers#has_no_button?}
|
213
|
-
|
214
|
-
##
|
215
|
-
# Assertion that there is field
|
216
|
-
#
|
217
|
-
# @!method assert_field
|
218
|
-
# see {Capybara::Node::Matchers#has_field?}
|
219
|
-
|
220
|
-
##
|
221
|
-
# Assertion that there is no field
|
222
|
-
#
|
223
|
-
# @!method refute_field
|
224
|
-
# @!method assert_no_field
|
225
|
-
# see {Capybara::Node::Matchers#has_no_field?}
|
226
|
-
|
227
|
-
##
|
228
|
-
# Assertion that there is checked_field
|
229
|
-
#
|
230
|
-
# @!method assert_checked_field
|
231
|
-
# see {Capybara::Node::Matchers#has_checked_field?}
|
232
|
-
|
233
|
-
##
|
234
|
-
# Assertion that there is no checked_field
|
235
|
-
#
|
236
|
-
# @!method assert_no_checked_field
|
237
|
-
# @!method refute_checked_field
|
238
|
-
|
239
|
-
##
|
240
|
-
# Assertion that there is unchecked_field
|
241
|
-
#
|
242
|
-
# @!method assert_unchecked_field
|
243
|
-
# see {Capybara::Node::Matchers#has_unchecked_field?}
|
244
|
-
|
245
|
-
##
|
246
|
-
# Assertion that there is no unchecked_field
|
247
|
-
#
|
248
|
-
# @!method assert_no_unchecked_field
|
249
|
-
# @!method refute_unchecked_field
|
250
|
-
|
251
|
-
##
|
252
|
-
# Assertion that there is select
|
253
|
-
#
|
254
|
-
# @!method assert_select
|
255
|
-
# see {Capybara::Node::Matchers#has_select?}
|
256
|
-
|
257
|
-
##
|
258
|
-
# Assertion that there is no select
|
259
|
-
#
|
260
|
-
# @!method refute_select
|
261
|
-
# @!method assert_no_select
|
262
|
-
# see {Capybara::Node::Matchers#has_no_select?}
|
263
|
-
|
264
|
-
##
|
265
|
-
# Assertion that there is table
|
266
|
-
#
|
267
|
-
# @!method assert_table
|
268
|
-
# see {Capybara::Node::Matchers#has_table?}
|
269
|
-
|
270
|
-
##
|
271
|
-
# Assertion that there is no table
|
272
|
-
#
|
273
|
-
# @!method refute_table
|
274
|
-
# @!method assert_no_table
|
275
|
-
# see {Capybara::Node::Matchers#has_no_table?}
|
276
|
-
|
277
365
|
private
|
278
366
|
|
279
367
|
def determine_subject(args)
|