capybara 3.13.2 → 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 -0
- data/History.md +587 -16
- data/README.md +240 -90
- data/lib/capybara/config.rb +24 -11
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +8 -0
- data/lib/capybara/driver/node.rb +20 -4
- data/lib/capybara/dsl.rb +5 -3
- data/lib/capybara/helpers.rb +25 -4
- data/lib/capybara/minitest/spec.rb +174 -90
- data/lib/capybara/minitest.rb +256 -142
- data/lib/capybara/node/actions.rb +123 -77
- data/lib/capybara/node/base.rb +20 -12
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +3 -3
- data/lib/capybara/node/element.rb +223 -117
- data/lib/capybara/node/finders.rb +81 -71
- data/lib/capybara/node/matchers.rb +271 -134
- data/lib/capybara/node/simple.rb +18 -5
- 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 +8 -9
- data/lib/capybara/queries/base_query.rb +3 -2
- data/lib/capybara/queries/current_path_query.rb +15 -5
- data/lib/capybara/queries/selector_query.rb +364 -54
- data/lib/capybara/queries/sibling_query.rb +8 -6
- data/lib/capybara/queries/style_query.rb +2 -2
- data/lib/capybara/queries/text_query.rb +13 -1
- data/lib/capybara/queries/title_query.rb +1 -1
- data/lib/capybara/rack_test/browser.rb +76 -11
- data/lib/capybara/rack_test/driver.rb +10 -5
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +31 -9
- data/lib/capybara/rack_test/node.rb +74 -23
- 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 +44 -20
- data/lib/capybara/rspec/matcher_proxies.rb +13 -11
- data/lib/capybara/rspec/matchers/base.rb +31 -16
- data/lib/capybara/rspec/matchers/compound.rb +1 -1
- 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 +2 -2
- data/lib/capybara/rspec/matchers/have_selector.rb +21 -21
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +4 -4
- 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/rspec/matchers.rb +111 -68
- data/lib/capybara/rspec.rb +2 -0
- data/lib/capybara/selector/builders/css_builder.rb +11 -7
- data/lib/capybara/selector/builders/xpath_builder.rb +5 -3
- data/lib/capybara/selector/css.rb +11 -9
- 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_set.rb +19 -18
- data/lib/capybara/selector/filters/base.rb +11 -2
- data/lib/capybara/selector/filters/locator_filter.rb +13 -3
- data/lib/capybara/selector/regexp_disassembler.rb +11 -7
- data/lib/capybara/selector/selector.rb +50 -440
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +473 -482
- 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 +174 -62
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +74 -18
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +37 -3
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +14 -1
- 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 +68 -45
- data/lib/capybara/selenium/extensions/html5_drag.rb +192 -22
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +8 -10
- data/lib/capybara/selenium/node.rb +268 -72
- data/lib/capybara/selenium/nodes/chrome_node.rb +105 -9
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +51 -61
- 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 +1 -1
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +43 -21
- data/lib/capybara/server/checker.rb +6 -2
- data/lib/capybara/server/middleware.rb +25 -13
- data/lib/capybara/server.rb +20 -4
- data/lib/capybara/session/config.rb +15 -11
- data/lib/capybara/session/matchers.rb +11 -11
- data/lib/capybara/session.rb +162 -131
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +105 -6
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +89 -15
- data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
- data/lib/capybara/spec/session/assert_current_path_spec.rb +5 -2
- data/lib/capybara/spec/session/assert_text_spec.rb +26 -22
- data/lib/capybara/spec/session/attach_file_spec.rb +64 -31
- data/lib/capybara/spec/session/check_spec.rb +26 -4
- data/lib/capybara/spec/session/choose_spec.rb +14 -2
- data/lib/capybara/spec/session/click_button_spec.rb +109 -61
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +9 -0
- data/lib/capybara/spec/session/click_link_spec.rb +23 -1
- data/lib/capybara/spec/session/current_scope_spec.rb +1 -1
- data/lib/capybara/spec/session/current_url_spec.rb +11 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +40 -39
- data/lib/capybara/spec/session/evaluate_script_spec.rb +12 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +46 -5
- data/lib/capybara/spec/session/find_link_spec.rb +10 -0
- data/lib/capybara/spec/session/find_spec.rb +80 -7
- data/lib/capybara/spec/session/first_spec.rb +2 -2
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +14 -1
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +14 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +5 -5
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +6 -2
- data/lib/capybara/spec/session/has_button_spec.rb +81 -0
- data/lib/capybara/spec/session/has_css_spec.rb +45 -8
- data/lib/capybara/spec/session/has_current_path_spec.rb +22 -7
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +59 -1
- data/lib/capybara/spec/session/has_link_spec.rb +40 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +7 -7
- data/lib/capybara/spec/session/has_select_spec.rb +42 -8
- data/lib/capybara/spec/session/has_selector_spec.rb +19 -4
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +177 -0
- data/lib/capybara/spec/session/has_text_spec.rb +31 -3
- data/lib/capybara/spec/session/html_spec.rb +1 -1
- data/lib/capybara/spec/session/matches_style_spec.rb +6 -4
- data/lib/capybara/spec/session/node_spec.rb +697 -23
- data/lib/capybara/spec/session/node_wrapper_spec.rb +1 -1
- data/lib/capybara/spec/session/refresh_spec.rb +2 -1
- data/lib/capybara/spec/session/reset_session_spec.rb +21 -7
- 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 -4
- data/lib/capybara/spec/session/scroll_spec.rb +9 -7
- data/lib/capybara/spec/session/select_spec.rb +5 -10
- data/lib/capybara/spec/session/selectors_spec.rb +24 -3
- data/lib/capybara/spec/session/uncheck_spec.rb +3 -3
- data/lib/capybara/spec/session/unselect_spec.rb +1 -1
- data/lib/capybara/spec/session/visit_spec.rb +20 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
- 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 +54 -57
- data/lib/capybara/spec/session/window/windows_spec.rb +2 -2
- data/lib/capybara/spec/session/within_spec.rb +36 -0
- data/lib/capybara/spec/spec_helper.rb +30 -19
- data/lib/capybara/spec/test_app.rb +122 -34
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +86 -8
- data/lib/capybara/spec/views/frame_child.erb +3 -2
- 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 +10 -10
- 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 +2 -1
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +67 -0
- data/lib/capybara/spec/views/with_animation.erb +39 -4
- 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 +34 -6
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +7 -4
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +1 -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 +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +14 -18
- data/lib/capybara.rb +91 -126
- data/spec/basic_node_spec.rb +30 -16
- data/spec/capybara_spec.rb +40 -28
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +3 -1
- data/spec/css_splitter_spec.rb +1 -1
- data/spec/dsl_spec.rb +33 -22
- data/spec/filter_set_spec.rb +5 -5
- data/spec/fixtures/selenium_driver_rspec_failure.rb +3 -3
- data/spec/fixtures/selenium_driver_rspec_success.rb +3 -3
- data/spec/minitest_spec.rb +24 -2
- data/spec/minitest_spec_spec.rb +60 -45
- data/spec/per_session_config_spec.rb +1 -1
- data/spec/rack_test_spec.rb +131 -98
- data/spec/regexp_dissassembler_spec.rb +53 -39
- data/spec/result_spec.rb +68 -66
- data/spec/rspec/features_spec.rb +9 -4
- data/spec/rspec/scenarios_spec.rb +6 -2
- data/spec/rspec/shared_spec_matchers.rb +137 -98
- data/spec/rspec_matchers_spec.rb +25 -0
- data/spec/rspec_spec.rb +23 -21
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +77 -21
- data/spec/selenium_spec_chrome.rb +141 -39
- data/spec/selenium_spec_chrome_remote.rb +32 -17
- data/spec/selenium_spec_edge.rb +36 -8
- data/spec/selenium_spec_firefox.rb +110 -68
- data/spec/selenium_spec_firefox_remote.rb +22 -15
- data/spec/selenium_spec_ie.rb +29 -22
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +153 -81
- data/spec/session_spec.rb +11 -4
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +179 -74
- data/spec/spec_helper.rb +80 -5
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +3 -1
- metadata +218 -30
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
data/lib/capybara/driver/node.rb
CHANGED
|
@@ -31,8 +31,8 @@ module Capybara
|
|
|
31
31
|
raise NotImplementedError
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
# @param value String
|
|
35
|
-
# @param options [Hash
|
|
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
36
|
def set(value, **options)
|
|
37
37
|
raise NotImplementedError
|
|
38
38
|
end
|
|
@@ -65,7 +65,11 @@ module Capybara
|
|
|
65
65
|
raise NotImplementedError
|
|
66
66
|
end
|
|
67
67
|
|
|
68
|
-
def drag_to(element)
|
|
68
|
+
def drag_to(element, **options)
|
|
69
|
+
raise NotImplementedError
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def drop(*args)
|
|
69
73
|
raise NotImplementedError
|
|
70
74
|
end
|
|
71
75
|
|
|
@@ -85,6 +89,10 @@ module Capybara
|
|
|
85
89
|
raise NotImplementedError
|
|
86
90
|
end
|
|
87
91
|
|
|
92
|
+
def obscured?
|
|
93
|
+
raise NotImplementedError
|
|
94
|
+
end
|
|
95
|
+
|
|
88
96
|
def checked?
|
|
89
97
|
raise NotImplementedError
|
|
90
98
|
end
|
|
@@ -105,6 +113,10 @@ module Capybara
|
|
|
105
113
|
!!self[:multiple]
|
|
106
114
|
end
|
|
107
115
|
|
|
116
|
+
def rect
|
|
117
|
+
raise NotSupportedByDriverError, 'Capybara::Driver::Node#rect'
|
|
118
|
+
end
|
|
119
|
+
|
|
108
120
|
def path
|
|
109
121
|
raise NotSupportedByDriverError, 'Capybara::Driver::Node#path'
|
|
110
122
|
end
|
|
@@ -113,6 +125,10 @@ module Capybara
|
|
|
113
125
|
raise NotSupportedByDriverError, 'Capybara::Driver::Node#trigger'
|
|
114
126
|
end
|
|
115
127
|
|
|
128
|
+
def shadow_root
|
|
129
|
+
raise NotSupportedByDriverError, 'Capybara::Driver::Node#shadow_root'
|
|
130
|
+
end
|
|
131
|
+
|
|
116
132
|
def inspect
|
|
117
133
|
%(#<#{self.class} tag="#{tag_name}" path="#{path}">)
|
|
118
134
|
rescue NotSupportedByDriverError
|
|
@@ -120,7 +136,7 @@ module Capybara
|
|
|
120
136
|
end
|
|
121
137
|
|
|
122
138
|
def ==(other)
|
|
123
|
-
|
|
139
|
+
eql?(other) || (other.respond_to?(:native) && native == other.native)
|
|
124
140
|
end
|
|
125
141
|
end
|
|
126
142
|
end
|
data/lib/capybara/dsl.rb
CHANGED
|
@@ -47,9 +47,11 @@ module Capybara
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
Session::DSL_METHODS.each do |method|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
50
|
+
class_eval <<~METHOD, __FILE__, __LINE__ + 1
|
|
51
|
+
def #{method}(...)
|
|
52
|
+
page.method("#{method}").call(...)
|
|
53
|
+
end
|
|
54
|
+
METHOD
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
57
|
|
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
|
|
|
@@ -41,7 +41,7 @@ module Capybara
|
|
|
41
41
|
##
|
|
42
42
|
#
|
|
43
43
|
# Injects a `<base>` tag into the given HTML code, pointing to
|
|
44
|
-
#
|
|
44
|
+
# {Capybara.configure asset_host}.
|
|
45
45
|
#
|
|
46
46
|
# @param [String] html HTML code to inject into
|
|
47
47
|
# @param [URL] host (Capybara.asset_host) The host from which assets should be loaded
|
|
@@ -70,7 +70,26 @@ module Capybara
|
|
|
70
70
|
count == 1 ? singular : plural
|
|
71
71
|
end
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
def filter_backtrace(trace)
|
|
74
|
+
return 'No backtrace' unless trace
|
|
75
|
+
|
|
76
|
+
filter = %r{lib/capybara/|lib/rspec/|lib/minitest/|delegate.rb}
|
|
77
|
+
new_trace = trace.take_while { |line| line !~ filter }
|
|
78
|
+
new_trace = trace.grep_v(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
|
+
Kernel.warn(message, uplevel: uplevel)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
if defined?(Process::CLOCK_MONOTONIC_RAW)
|
|
89
|
+
def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC_RAW; end
|
|
90
|
+
elsif defined?(Process::CLOCK_MONOTONIC_PRECISE)
|
|
91
|
+
def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC_PRECISE; end
|
|
92
|
+
elsif defined?(Process::CLOCK_MONOTONIC)
|
|
74
93
|
def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC; end
|
|
75
94
|
else
|
|
76
95
|
def monotonic_time; Time.now.to_f; end
|
|
@@ -87,7 +106,9 @@ module Capybara
|
|
|
87
106
|
end
|
|
88
107
|
|
|
89
108
|
def expired?
|
|
90
|
-
|
|
109
|
+
if stalled?
|
|
110
|
+
raise Capybara::FrozenInTime, 'Time appears to be frozen. Capybara does not work with libraries which freeze time, consider using time travelling instead'
|
|
111
|
+
end
|
|
91
112
|
|
|
92
113
|
current - @start >= @expire_in
|
|
93
114
|
end
|
|
@@ -5,179 +5,263 @@ require 'minitest/spec'
|
|
|
5
5
|
module Capybara
|
|
6
6
|
module Minitest
|
|
7
7
|
module Expectations
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
##
|
|
9
|
+
# Expectation that there is an ancestor
|
|
10
|
+
#
|
|
11
|
+
# @!method must_have_ancestor
|
|
12
|
+
# See {Capybara::Node::Matchers#has_ancestor?}
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
%w[assert_none_of_selectors must_have_none_of_selectors],
|
|
19
|
-
%w[assert_any_of_selectors must_have_any_of_selectors],
|
|
20
|
-
%w[assert_matches_style must_match_style]] +
|
|
21
|
-
%w[selector xpath css].flat_map do |assertion|
|
|
22
|
-
[%W[assert_matches_#{assertion} must_match_#{assertion}],
|
|
23
|
-
%W[refute_matches_#{assertion} wont_match_#{assertion}]]
|
|
24
|
-
end).each do |(meth, new_name)|
|
|
25
|
-
class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
|
26
|
-
def #{new_name} *args, &block
|
|
27
|
-
::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(*args, &block)
|
|
28
|
-
end
|
|
29
|
-
ASSERTION
|
|
14
|
+
##
|
|
15
|
+
# Expectation that there is button
|
|
16
|
+
#
|
|
17
|
+
# @!method must_have_button
|
|
18
|
+
# See {Capybara::Node::Matchers#has_button?}
|
|
30
19
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
end
|
|
37
|
-
# rubocop:enable Style/MultilineBlockChain
|
|
20
|
+
##
|
|
21
|
+
# Expectation that there is no button
|
|
22
|
+
#
|
|
23
|
+
# @!method wont_have_button
|
|
24
|
+
# See {Capybara::Node::Matchers#has_no_button?}
|
|
38
25
|
|
|
39
26
|
##
|
|
40
|
-
#
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
end
|
|
27
|
+
# Expectation that there is checked_field
|
|
28
|
+
#
|
|
29
|
+
# @!method must_have_checked_field
|
|
30
|
+
# See {Capybara::Node::Matchers#has_checked_field?}
|
|
45
31
|
|
|
46
32
|
##
|
|
47
|
-
# Expectation that there is
|
|
33
|
+
# Expectation that there is no checked_field
|
|
48
34
|
#
|
|
49
|
-
# @!method
|
|
50
|
-
#
|
|
35
|
+
# @!method wont_have_checked_field
|
|
36
|
+
# See {Capybara::Node::Matchers#has_no_checked_field?}
|
|
51
37
|
|
|
52
38
|
##
|
|
53
|
-
# Expectation that there is
|
|
39
|
+
# Expectation that there is unchecked_field
|
|
54
40
|
#
|
|
55
|
-
# @!method
|
|
56
|
-
#
|
|
41
|
+
# @!method must_have_unchecked_field
|
|
42
|
+
# See {Capybara::Node::Matchers#has_unchecked_field?}
|
|
57
43
|
|
|
58
44
|
##
|
|
59
|
-
# Expectation that there is
|
|
45
|
+
# Expectation that there is no unchecked_field
|
|
60
46
|
#
|
|
61
|
-
# @!method
|
|
62
|
-
#
|
|
47
|
+
# @!method wont_have_unchecked_field
|
|
48
|
+
# See {Capybara::Node::Matchers#has_no_unchecked_field?}
|
|
63
49
|
|
|
64
50
|
##
|
|
65
|
-
# Expectation that
|
|
51
|
+
# Expectation that page content does match
|
|
66
52
|
#
|
|
67
|
-
# @!method
|
|
68
|
-
#
|
|
53
|
+
# @!method must_have_content
|
|
54
|
+
# See {Capybara::Node::Matchers#has_content?}
|
|
69
55
|
|
|
70
56
|
##
|
|
71
|
-
# Expectation that
|
|
57
|
+
# Expectation that page content does not match
|
|
72
58
|
#
|
|
73
|
-
# @!method
|
|
74
|
-
#
|
|
59
|
+
# @!method wont_have_content
|
|
60
|
+
# See {Capybara::Node::Matchers#has_no_content?}
|
|
75
61
|
|
|
76
62
|
##
|
|
77
|
-
# Expectation that there is
|
|
63
|
+
# Expectation that there is css
|
|
78
64
|
#
|
|
79
|
-
# @!method
|
|
80
|
-
#
|
|
65
|
+
# @!method must_have_css
|
|
66
|
+
# See {Capybara::Node::Matchers#has_css?}
|
|
81
67
|
|
|
82
68
|
##
|
|
83
|
-
# Expectation that there is
|
|
69
|
+
# Expectation that there is no css
|
|
84
70
|
#
|
|
85
|
-
# @!method
|
|
86
|
-
#
|
|
71
|
+
# @!method wont_have_css
|
|
72
|
+
# See {Capybara::Node::Matchers#has_no_css?}
|
|
87
73
|
|
|
88
74
|
##
|
|
89
|
-
# Expectation that
|
|
75
|
+
# Expectation that current path matches
|
|
90
76
|
#
|
|
91
|
-
# @!method
|
|
92
|
-
#
|
|
77
|
+
# @!method must_have_current_path
|
|
78
|
+
# See {Capybara::SessionMatchers#has_current_path?}
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
# Expectation that current page does not match
|
|
82
|
+
#
|
|
83
|
+
# @!method wont_have_current_path
|
|
84
|
+
# See {Capybara::SessionMatchers#has_no_current_path?}
|
|
93
85
|
|
|
94
86
|
##
|
|
95
87
|
# Expectation that there is field
|
|
96
88
|
#
|
|
97
89
|
# @!method must_have_field
|
|
98
|
-
#
|
|
90
|
+
# See {Capybara::Node::Matchers#has_field?}
|
|
99
91
|
|
|
100
92
|
##
|
|
101
93
|
# Expectation that there is no field
|
|
102
94
|
#
|
|
103
95
|
# @!method wont_have_field
|
|
104
|
-
#
|
|
96
|
+
# See {Capybara::Node::Matchers#has_no_field?}
|
|
105
97
|
|
|
106
98
|
##
|
|
107
|
-
# Expectation that there is
|
|
99
|
+
# Expectation that there is element
|
|
108
100
|
#
|
|
109
|
-
# @!method
|
|
110
|
-
#
|
|
101
|
+
# @!method must_have_element
|
|
102
|
+
# See {Capybara::Node::Matchers#has_element?}
|
|
111
103
|
|
|
112
104
|
##
|
|
113
|
-
# Expectation that there is no
|
|
105
|
+
# Expectation that there is no element
|
|
114
106
|
#
|
|
115
|
-
# @!method
|
|
107
|
+
# @!method wont_have_element
|
|
108
|
+
# See {Capybara::Node::Matchers#has_no_element?}
|
|
116
109
|
|
|
117
110
|
##
|
|
118
|
-
# Expectation that there is
|
|
111
|
+
# Expectation that there is link
|
|
119
112
|
#
|
|
120
|
-
# @!method
|
|
121
|
-
#
|
|
113
|
+
# @!method must_have_link
|
|
114
|
+
# See {Capybara::Node::Matchers#has_link?}
|
|
122
115
|
|
|
123
116
|
##
|
|
124
|
-
# Expectation that there is no
|
|
117
|
+
# Expectation that there is no link
|
|
125
118
|
#
|
|
126
|
-
# @!method
|
|
119
|
+
# @!method wont_have_link
|
|
120
|
+
# See {Capybara::Node::Matchers#has_no_link?}
|
|
121
|
+
|
|
122
|
+
##
|
|
123
|
+
# Expectation that page text does match
|
|
124
|
+
#
|
|
125
|
+
# @!method must_have_text
|
|
126
|
+
# See {Capybara::Node::Matchers#has_text?}
|
|
127
|
+
|
|
128
|
+
##
|
|
129
|
+
# Expectation that page text does not match
|
|
130
|
+
#
|
|
131
|
+
# @!method wont_have_text
|
|
132
|
+
# See {Capybara::Node::Matchers#has_no_text?}
|
|
133
|
+
|
|
134
|
+
##
|
|
135
|
+
# Expectation that page title does match
|
|
136
|
+
#
|
|
137
|
+
# @!method must_have_title
|
|
138
|
+
# See {Capybara::Node::DocumentMatchers#has_title?}
|
|
139
|
+
|
|
140
|
+
##
|
|
141
|
+
# Expectation that page title does not match
|
|
142
|
+
#
|
|
143
|
+
# @!method wont_have_title
|
|
144
|
+
# See {Capybara::Node::DocumentMatchers#has_no_title?}
|
|
127
145
|
|
|
128
146
|
##
|
|
129
147
|
# Expectation that there is select
|
|
130
148
|
#
|
|
131
149
|
# @!method must_have_select
|
|
132
|
-
#
|
|
150
|
+
# See {Capybara::Node::Matchers#has_select?}
|
|
133
151
|
|
|
134
152
|
##
|
|
135
153
|
# Expectation that there is no select
|
|
136
154
|
#
|
|
137
155
|
# @!method wont_have_select
|
|
138
|
-
#
|
|
156
|
+
# See {Capybara::Node::Matchers#has_no_select?}
|
|
139
157
|
|
|
140
158
|
##
|
|
141
|
-
# Expectation that there is
|
|
159
|
+
# Expectation that there is a selector
|
|
142
160
|
#
|
|
143
|
-
# @!method
|
|
144
|
-
#
|
|
161
|
+
# @!method must_have_selector
|
|
162
|
+
# See {Capybara::Node::Matchers#has_selector?}
|
|
145
163
|
|
|
146
164
|
##
|
|
147
|
-
# Expectation that there is no
|
|
165
|
+
# Expectation that there is no selector
|
|
148
166
|
#
|
|
149
|
-
# @!method
|
|
150
|
-
#
|
|
167
|
+
# @!method wont_have_selector
|
|
168
|
+
# See {Capybara::Node::Matchers#has_no_selector?}
|
|
151
169
|
|
|
152
170
|
##
|
|
153
|
-
# Expectation that
|
|
171
|
+
# Expectation that all of the provided selectors are present
|
|
154
172
|
#
|
|
155
|
-
# @!method
|
|
156
|
-
#
|
|
173
|
+
# @!method must_have_all_of_selectors
|
|
174
|
+
# See {Capybara::Node::Matchers#assert_all_of_selectors}
|
|
157
175
|
|
|
158
176
|
##
|
|
159
|
-
# Expectation that
|
|
177
|
+
# Expectation that none of the provided selectors are present
|
|
160
178
|
#
|
|
161
|
-
# @!method
|
|
162
|
-
#
|
|
179
|
+
# @!method must_have_none_of_selectors
|
|
180
|
+
# See {Capybara::Node::Matchers#assert_none_of_selectors}
|
|
163
181
|
|
|
164
182
|
##
|
|
165
|
-
# Expectation that
|
|
183
|
+
# Expectation that any of the provided selectors are present
|
|
166
184
|
#
|
|
167
|
-
# @!method
|
|
168
|
-
#
|
|
185
|
+
# @!method must_have_any_of_selectors
|
|
186
|
+
# See {Capybara::Node::Matchers#assert_any_of_selectors}
|
|
169
187
|
|
|
170
188
|
##
|
|
171
|
-
# Expectation that
|
|
189
|
+
# Expectation that there is a sibling
|
|
172
190
|
#
|
|
173
|
-
# @!method
|
|
174
|
-
#
|
|
191
|
+
# @!method must_have_sibling
|
|
192
|
+
# See {Capybara::Node::Matchers#has_sibling?}
|
|
175
193
|
|
|
176
194
|
##
|
|
177
195
|
# Expectation that element has style
|
|
178
196
|
#
|
|
179
197
|
# @!method must_match_style
|
|
180
|
-
#
|
|
198
|
+
# See {Capybara::Node::Matchers#matches_style?}
|
|
199
|
+
|
|
200
|
+
##
|
|
201
|
+
# Expectation that there is table
|
|
202
|
+
#
|
|
203
|
+
# @!method must_have_table
|
|
204
|
+
# See {Capybara::Node::Matchers#has_table?}
|
|
205
|
+
|
|
206
|
+
##
|
|
207
|
+
# Expectation that there is no table
|
|
208
|
+
#
|
|
209
|
+
# @!method wont_have_table
|
|
210
|
+
# See {Capybara::Node::Matchers#has_no_table?}
|
|
211
|
+
|
|
212
|
+
##
|
|
213
|
+
# Expectation that there is xpath
|
|
214
|
+
#
|
|
215
|
+
# @!method must_have_xpath
|
|
216
|
+
# See {Capybara::Node::Matchers#has_xpath?}
|
|
217
|
+
|
|
218
|
+
##
|
|
219
|
+
# Expectation that there is no xpath
|
|
220
|
+
#
|
|
221
|
+
# @!method wont_have_xpath
|
|
222
|
+
# See {Capybara::Node::Matchers#has_no_xpath?}
|
|
223
|
+
|
|
224
|
+
# This currently doesn't work for Ruby 2.8 due to Minitest not forwarding keyword args separately
|
|
225
|
+
# %w[text content title current_path].each do |assertion|
|
|
226
|
+
# infect_an_assertion "assert_#{assertion}", "must_have_#{assertion}", :reverse
|
|
227
|
+
# infect_an_assertion "refute_#{assertion}", "wont_have_#{assertion}", :reverse
|
|
228
|
+
# end
|
|
229
|
+
|
|
230
|
+
# rubocop:disable Style/MultilineBlockChain
|
|
231
|
+
(%w[text content title current_path
|
|
232
|
+
selector xpath css link button field select table checked_field unchecked_field
|
|
233
|
+
ancestor sibling].flat_map do |assertion|
|
|
234
|
+
[%W[assert_#{assertion} must_have_#{assertion}],
|
|
235
|
+
%W[refute_#{assertion} wont_have_#{assertion}]]
|
|
236
|
+
end + [%w[assert_all_of_selectors must_have_all_of_selectors],
|
|
237
|
+
%w[assert_none_of_selectors must_have_none_of_selectors],
|
|
238
|
+
%w[assert_any_of_selectors must_have_any_of_selectors],
|
|
239
|
+
%w[assert_matches_style must_match_style]] +
|
|
240
|
+
%w[selector xpath css].flat_map do |assertion|
|
|
241
|
+
[%W[assert_matches_#{assertion} must_match_#{assertion}],
|
|
242
|
+
%W[refute_matches_#{assertion} wont_match_#{assertion}]]
|
|
243
|
+
end).each do |(meth, new_name)|
|
|
244
|
+
class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
|
245
|
+
def #{new_name}(...)
|
|
246
|
+
::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(...)
|
|
247
|
+
end
|
|
248
|
+
ASSERTION
|
|
249
|
+
|
|
250
|
+
::Minitest::Expectation.class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
|
251
|
+
def #{new_name}(...)
|
|
252
|
+
raise "Calling ##{new_name} outside of test." unless ctx
|
|
253
|
+
ctx.#{meth}(target, ...)
|
|
254
|
+
end
|
|
255
|
+
ASSERTION
|
|
256
|
+
end
|
|
257
|
+
# rubocop:enable Style/MultilineBlockChain
|
|
258
|
+
|
|
259
|
+
##
|
|
260
|
+
# @deprecated
|
|
261
|
+
def must_have_style(...)
|
|
262
|
+
warn 'must_have_style is deprecated, please use must_match_style'
|
|
263
|
+
must_match_style(...)
|
|
264
|
+
end
|
|
181
265
|
end
|
|
182
266
|
end
|
|
183
267
|
end
|