capybara 3.9.0 → 3.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +15 -0
- data/License.txt +1 -1
- data/README.md +1 -1
- data/lib/capybara.rb +1 -2
- data/lib/capybara/helpers.rb +3 -2
- data/lib/capybara/minitest.rb +1 -1
- data/lib/capybara/minitest/spec.rb +1 -0
- data/lib/capybara/node/finders.rb +20 -15
- data/lib/capybara/node/matchers.rb +43 -10
- data/lib/capybara/queries/current_path_query.rb +2 -2
- data/lib/capybara/queries/selector_query.rb +9 -2
- data/lib/capybara/rack_test/browser.rb +14 -13
- data/lib/capybara/rack_test/form.rb +32 -27
- data/lib/capybara/result.rb +8 -11
- data/lib/capybara/rspec/compound.rb +16 -26
- data/lib/capybara/rspec/matcher_proxies.rb +28 -11
- data/lib/capybara/rspec/matchers.rb +67 -45
- data/lib/capybara/selector.rb +22 -25
- data/lib/capybara/selector/builders/css_builder.rb +3 -4
- data/lib/capybara/selector/builders/xpath_builder.rb +4 -6
- data/lib/capybara/selector/regexp_disassembler.rb +43 -44
- data/lib/capybara/selector/selector.rb +16 -11
- data/lib/capybara/selenium/driver.rb +28 -21
- data/lib/capybara/selenium/nodes/marionette_node.rb +6 -12
- data/lib/capybara/server.rb +1 -3
- data/lib/capybara/server/animation_disabler.rb +2 -2
- data/lib/capybara/session.rb +1 -1
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +29 -0
- data/lib/capybara/spec/session/click_button_spec.rb +6 -0
- data/lib/capybara/spec/session/click_link_spec.rb +1 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +1 -1
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
- data/lib/capybara/spec/session/html_spec.rb +7 -0
- data/lib/capybara/spec/session/node_spec.rb +5 -1
- data/lib/capybara/spec/session/refresh_spec.rb +4 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +4 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +4 -0
- data/lib/capybara/spec/session/window/window_spec.rb +4 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +4 -0
- data/lib/capybara/spec/views/form.erb +2 -2
- data/lib/capybara/version.rb +1 -1
- data/spec/minitest_spec.rb +5 -1
- data/spec/minitest_spec_spec.rb +5 -1
- data/spec/regexp_dissassembler_spec.rb +5 -3
- data/spec/rspec_spec.rb +20 -0
- data/spec/selector_spec.rb +89 -3
- data/spec/selenium_spec_chrome.rb +3 -7
- data/spec/selenium_spec_marionette.rb +1 -4
- metadata +20 -6
- data/lib/capybara/xpath_patches.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58e17a63edc194f43995b9c63196fe91311450999a03da4ee7c2f1aa1e1e34e4
|
4
|
+
data.tar.gz: f0a20f11e8a454f62a9abd62dc4d1f18f8419460c43a0e37f250d8c603cffc60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee9b34f496afec3a99be65c5fcdcfebef38640eccb146a4e43ec811a55c99edf8393695e9a9d228db07d738d753feaa7f8c8090bc7cf37189ff3b192e5b15482
|
7
|
+
data.tar.gz: 002ae33fdef7b207d2cba11b8ce125c1d4ef972b10226d9f766dc41605791b8167c11c69ae1295ff229049bbd668a4b49021747eefee4861b152489ddbbe4f5d
|
data/History.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
# Version 3.10.0
|
2
|
+
Release date: 2018-10-23
|
3
|
+
|
4
|
+
### Added
|
5
|
+
|
6
|
+
* :class filter can now check for class names starting with !
|
7
|
+
* Selector `xpath`/`css` expression definitions will get filter names from block parameters if not explicitly provided
|
8
|
+
* `any_of_selectors` assertions and matchers to complement `all_of_selectors` and `none_of_selectors`
|
9
|
+
|
10
|
+
### Fixed
|
11
|
+
|
12
|
+
* Selector `css` expression definiton declared filters now work again
|
13
|
+
* Cleaned up warnings [Yuji Yaginuma]
|
14
|
+
* Workaround installation of rspec matcher proxies under jruby by reverting to the old solution not using prepend, so jruby bugs are not hit - Issue #2115
|
15
|
+
|
1
16
|
# Version 3.9.0
|
2
17
|
Release date: 2018-10-03
|
3
18
|
|
data/License.txt
CHANGED
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=capybara&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
|
8
8
|
|
9
9
|
**Note** You are viewing the README for the development version of Capybara. If you are using the current release version
|
10
|
-
you can find the README at https://github.com/teamcapybara/capybara/blob/3.
|
10
|
+
you can find the README at https://github.com/teamcapybara/capybara/blob/3.9_stable/README.md
|
11
11
|
|
12
12
|
|
13
13
|
Capybara helps you test web applications by simulating how a real user would
|
data/lib/capybara.rb
CHANGED
@@ -393,7 +393,7 @@ module Capybara
|
|
393
393
|
if threadsafe
|
394
394
|
Thread.current['capybara_specified_session']
|
395
395
|
else
|
396
|
-
@specified_session
|
396
|
+
@specified_session ||= nil
|
397
397
|
end
|
398
398
|
end
|
399
399
|
|
@@ -414,7 +414,6 @@ module Capybara
|
|
414
414
|
module RackTest; end
|
415
415
|
module Selenium; end
|
416
416
|
|
417
|
-
require 'capybara/xpath_patches'
|
418
417
|
require 'capybara/helpers'
|
419
418
|
require 'capybara/session'
|
420
419
|
require 'capybara/window'
|
data/lib/capybara/helpers.rb
CHANGED
@@ -49,8 +49,9 @@ module Capybara
|
|
49
49
|
#
|
50
50
|
def inject_asset_host(html, host: Capybara.asset_host)
|
51
51
|
if host && Nokogiri::HTML(html).css('base').empty?
|
52
|
-
|
53
|
-
|
52
|
+
html.match(/<head[^<]*?>/) do |m|
|
53
|
+
return html.clone.insert m.end(0), "<base href='#{host}' />"
|
54
|
+
end
|
54
55
|
end
|
55
56
|
html
|
56
57
|
end
|
data/lib/capybara/minitest.rb
CHANGED
@@ -87,7 +87,7 @@ module Capybara
|
|
87
87
|
# see {Capybara::Node::Matchers#assert_style}
|
88
88
|
|
89
89
|
%w[assert_selector assert_no_selector
|
90
|
-
assert_all_of_selectors assert_none_of_selectors
|
90
|
+
assert_all_of_selectors assert_none_of_selectors assert_any_of_selectors
|
91
91
|
assert_matches_selector assert_not_matches_selector
|
92
92
|
assert_style].each do |assertion_name|
|
93
93
|
class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
@@ -16,6 +16,7 @@ module Capybara
|
|
16
16
|
%W[refute_#{assertion} wont_have_#{assertion}]]
|
17
17
|
end + [%w[assert_all_of_selectors must_have_all_of_selectors],
|
18
18
|
%w[assert_none_of_selectors must_have_none_of_selectors],
|
19
|
+
%w[assert_any_of_selectors must_have_any_of_selectors],
|
19
20
|
%w[assert_style must_have_style]] +
|
20
21
|
%w[selector xpath css].flat_map do |assertion|
|
21
22
|
[%W[assert_matches_#{assertion} must_match_#{assertion}],
|
@@ -15,15 +15,30 @@ module Capybara
|
|
15
15
|
# and defaults to 2 seconds.
|
16
16
|
# @option options [false, Numeric] wait (Capybara.default_max_wait_time) Maximum time to wait for matching element to appear.
|
17
17
|
#
|
18
|
-
# +find+ takes the same options as +all+.
|
19
|
-
#
|
20
18
|
# page.find('#foo').find('.bar')
|
21
19
|
# page.find(:xpath, './/div[contains(., "bar")]')
|
22
20
|
# page.find('li', text: 'Quox').click_link('Delete')
|
23
21
|
#
|
24
22
|
# @param (see Capybara::Node::Finders#all)
|
25
23
|
#
|
26
|
-
#
|
24
|
+
# @!macro system_filters
|
25
|
+
# @option options [String, Regexp] text Only find elements which contain this text or match this regexp
|
26
|
+
# @option options [String, Boolean] exact_text (Capybara.exact_text) When String the elements contained text must match exactly, when Boolean controls whether the :text option must match exactly
|
27
|
+
# @option options [Boolean] normalize_ws (Capybara.default_normalize_ws) Whether the `text`/`exact_text` options are compared against elment text with whitespace normalized or as returned by the driver
|
28
|
+
# @option options [Boolean, Symbol] visible Only find elements with the specified visibility:
|
29
|
+
# * true - only finds visible elements.
|
30
|
+
# * false - finds invisible _and_ visible elements.
|
31
|
+
# * :all - same as false; finds visible and invisible elements.
|
32
|
+
# * :hidden - only finds invisible elements.
|
33
|
+
# * :visible - same as true; only finds visible elements.
|
34
|
+
# @option options [String, Regexp] id Only find elements with an id that matches the value passed
|
35
|
+
# @option options [String, Array<String>, Regexp] class Only find elements with matching class/classes.
|
36
|
+
# + Absence of a class can be checked by prefixing the class name with !
|
37
|
+
# + If you need to check for existence of a class name that starts with ! then prefix with !!
|
38
|
+
# + ```class:['a', '!b', '!!!c'] # limit to elements with class 'a' and '!c' but not class 'b'```
|
39
|
+
# @option options [Boolean] exact Control whether `is` expressions in the given XPath match exactly or partially
|
40
|
+
# @option options [Integer, false] wait (Capybara.default_max_wait_time) The time to wait for matching elements to become available
|
41
|
+
# @option options [Symbol] match The matching strategy to use.
|
27
42
|
#
|
28
43
|
# @return [Capybara::Node::Element] The found element
|
29
44
|
# @raise [Capybara::ElementNotFound] If the element can't be found before time expires
|
@@ -46,7 +61,7 @@ module Capybara
|
|
46
61
|
#
|
47
62
|
# @param (see Capybara::Node::Finders#find)
|
48
63
|
#
|
49
|
-
#
|
64
|
+
# @macro waiting_behavior
|
50
65
|
#
|
51
66
|
# @option options [Boolean] match The matching strategy to use.
|
52
67
|
#
|
@@ -221,21 +236,11 @@ module Capybara
|
|
221
236
|
#
|
222
237
|
# @param [Symbol] kind Optional selector type (:css, :xpath, :field, etc.) - Defaults to Capybara.default_selector
|
223
238
|
# @param [String] locator The locator for the specified selector
|
224
|
-
# @
|
225
|
-
# @option options [String, Boolean] exact_text (Capybara.exact_text) When String the elements contained text must match exactly, when Boolean controls whether the :text option must match exactly
|
226
|
-
# @option options [Boolean] normalize_ws (Capybara.default_normalize_ws) Whether the `text`/`exact_text` options are compared against elment text with whitespace normalized or as returned by the driver
|
227
|
-
# @option options [Boolean, Symbol] visible Only find elements with the specified visibility:
|
228
|
-
# * true - only finds visible elements.
|
229
|
-
# * false - finds invisible _and_ visible elements.
|
230
|
-
# * :all - same as false; finds visible and invisible elements.
|
231
|
-
# * :hidden - only finds invisible elements.
|
232
|
-
# * :visible - same as true; only finds visible elements.
|
239
|
+
# @macro system_filters
|
233
240
|
# @option options [Integer] count Exact number of matches that are expected to be found
|
234
241
|
# @option options [Integer] maximum Maximum number of matches that are expected to be found
|
235
242
|
# @option options [Integer] minimum Minimum number of matches that are expected to be found
|
236
243
|
# @option options [Range] between Number of matches found must be within the given range
|
237
|
-
# @option options [Boolean] exact Control whether `is` expressions in the given XPath match exactly or partially
|
238
|
-
# @option options [Integer, false] wait (Capybara.default_max_wait_time) The time to wait for matching elements to become available
|
239
244
|
# @overload all([kind = Capybara.default_selector], locator = nil, **options)
|
240
245
|
# @overload all([kind = Capybara.default_selector], locator = nil, **options, &filter_block)
|
241
246
|
# @yieldparam element [Capybara::Node::Element] The element being considered for inclusion in the results
|
@@ -139,13 +139,9 @@ module Capybara
|
|
139
139
|
#
|
140
140
|
# @overload assert_all_of_selectors([kind = Capybara.default_selector], *locators, **options)
|
141
141
|
#
|
142
|
-
def assert_all_of_selectors(*args,
|
143
|
-
|
144
|
-
|
145
|
-
synchronize(wait) do
|
146
|
-
args.each do |locator|
|
147
|
-
assert_selector(selector, locator, options, &optional_filter_block)
|
148
|
-
end
|
142
|
+
def assert_all_of_selectors(*args, **options, &optional_filter_block)
|
143
|
+
_verify_multiple(*args, options) do |selector, locator, opts|
|
144
|
+
assert_selector(selector, locator, opts, &optional_filter_block)
|
149
145
|
end
|
150
146
|
end
|
151
147
|
|
@@ -164,13 +160,42 @@ module Capybara
|
|
164
160
|
#
|
165
161
|
# @overload assert_none_of_selectors([kind = Capybara.default_selector], *locators, **options)
|
166
162
|
#
|
167
|
-
def assert_none_of_selectors(*args,
|
163
|
+
def assert_none_of_selectors(*args, **options, &optional_filter_block)
|
164
|
+
_verify_multiple(*args, options) do |selector, locator, opts|
|
165
|
+
assert_no_selector(selector, locator, opts, &optional_filter_block)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
# Asserts that any of the provided selectors are present on the given page
|
170
|
+
# or descendants of the current node. If options are provided, the assertion
|
171
|
+
# will check that each locator is present with those options as well (other than :wait).
|
172
|
+
#
|
173
|
+
# page.assert_any_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
174
|
+
# page.assert_any_of_selectors(:css, '#my_div', 'a.not_clicked')
|
175
|
+
#
|
176
|
+
# It accepts all options that {Capybara::Node::Finders#all} accepts,
|
177
|
+
# such as :text and :visible.
|
178
|
+
#
|
179
|
+
# The :wait option applies to all of the selectors as a group, so any of the locators must be present
|
180
|
+
# within :wait (Defaults to Capybara.default_max_wait_time) seconds.
|
181
|
+
#
|
182
|
+
# @overload assert_any_of_selectors([kind = Capybara.default_selector], *locators, **options)
|
183
|
+
#
|
184
|
+
def assert_any_of_selectors(*args, wait: nil, **options, &optional_filter_block)
|
168
185
|
wait = session_options.default_max_wait_time if wait.nil?
|
169
186
|
selector = extract_selector(args)
|
170
187
|
synchronize(wait) do
|
171
|
-
args.
|
172
|
-
|
188
|
+
res = args.map do |locator|
|
189
|
+
begin
|
190
|
+
assert_selector(selector, locator, options, &optional_filter_block)
|
191
|
+
break nil
|
192
|
+
rescue Capybara::ExpectationNotMet => e
|
193
|
+
e.message
|
194
|
+
end
|
173
195
|
end
|
196
|
+
raise Capybara::ExpectationNotMet, res.join(' or ') if res
|
197
|
+
|
198
|
+
true
|
174
199
|
end
|
175
200
|
end
|
176
201
|
|
@@ -700,6 +725,14 @@ module Capybara
|
|
700
725
|
args.first.is_a?(Symbol) ? args.shift : session_options.default_selector
|
701
726
|
end
|
702
727
|
|
728
|
+
def _verify_multiple(*args, wait: nil, **options)
|
729
|
+
wait = session_options.default_max_wait_time if wait.nil?
|
730
|
+
selector = extract_selector(args)
|
731
|
+
synchronize(wait) do
|
732
|
+
args.each { |locator| yield(selector, locator, options) }
|
733
|
+
end
|
734
|
+
end
|
735
|
+
|
703
736
|
def _verify_selector_result(query_args, optional_filter_block)
|
704
737
|
query_args = _set_query_session_options(*query_args)
|
705
738
|
query = Capybara::Queries::SelectorQuery.new(*query_args, &optional_filter_block)
|
@@ -18,8 +18,8 @@ module Capybara
|
|
18
18
|
|
19
19
|
def resolves_for?(session)
|
20
20
|
uri = ::Addressable::URI.parse(session.current_url)
|
21
|
-
uri
|
22
|
-
@actual_path = options[:url] ? uri
|
21
|
+
uri&.query = nil if options[:ignore_query]
|
22
|
+
@actual_path = options[:url] ? uri&.to_s : uri&.request_uri
|
23
23
|
|
24
24
|
if @expected_path.is_a? Regexp
|
25
25
|
@actual_path.to_s.match(@expected_path)
|
@@ -61,8 +61,7 @@ module Capybara
|
|
61
61
|
return true if (@resolved_node&.== node) && options[:allow_self]
|
62
62
|
|
63
63
|
@applied_filters ||= :system
|
64
|
-
return false unless
|
65
|
-
return false unless matches_text_filter?(node) && matches_exact_text_filter?(node) && matches_visible_filter?(node)
|
64
|
+
return false unless matches_system_filters?(node)
|
66
65
|
|
67
66
|
@applied_filters = :node
|
68
67
|
matches_node_filters?(node) && matches_filter_block?(node)
|
@@ -292,6 +291,14 @@ module Capybara
|
|
292
291
|
node.is_a?(::Capybara::Node::Simple) && node.path == '/'
|
293
292
|
end
|
294
293
|
|
294
|
+
def matches_system_filters?(node)
|
295
|
+
matches_id_filter?(node) &&
|
296
|
+
matches_class_filter?(node) &&
|
297
|
+
matches_text_filter?(node) &&
|
298
|
+
matches_exact_text_filter?(node) &&
|
299
|
+
matches_visible_filter?(node)
|
300
|
+
end
|
301
|
+
|
295
302
|
def matches_id_filter?(node)
|
296
303
|
return true unless use_default_id_filter? && options[:id].is_a?(Regexp)
|
297
304
|
|
@@ -57,25 +57,26 @@ class Capybara::RackTest::Browser
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def process(method, path, attributes = {}, env = {})
|
60
|
-
|
61
|
-
|
62
|
-
if path.empty?
|
63
|
-
new_uri.path = request_path
|
64
|
-
else
|
65
|
-
new_uri.path = request_path if path.start_with?('?')
|
66
|
-
new_uri.path = '/' if new_uri.path.empty?
|
67
|
-
new_uri.path = request_path.sub(%r{/[^/]*$}, '/') + new_uri.path unless new_uri.path.start_with?('/')
|
68
|
-
end
|
69
|
-
new_uri.scheme ||= @current_scheme
|
70
|
-
new_uri.host ||= @current_host
|
71
|
-
new_uri.port ||= @current_port unless new_uri.default_port == @current_port
|
72
|
-
|
60
|
+
method = method.downcase
|
61
|
+
new_uri = build_uri(path)
|
73
62
|
@current_scheme, @current_host, @current_port = new_uri.select(:scheme, :host, :port)
|
74
63
|
|
75
64
|
reset_cache!
|
76
65
|
send(method, new_uri.to_s, attributes, env.merge(options[:headers] || {}))
|
77
66
|
end
|
78
67
|
|
68
|
+
def build_uri(path)
|
69
|
+
URI.parse(path).tap do |uri|
|
70
|
+
uri.path = request_path if path.empty? || path.start_with?('?')
|
71
|
+
uri.path = '/' if uri.path.empty?
|
72
|
+
uri.path = request_path.sub(%r{/[^/]*$}, '/') + uri.path unless uri.path.start_with?('/')
|
73
|
+
|
74
|
+
uri.scheme ||= @current_scheme
|
75
|
+
uri.host ||= @current_host
|
76
|
+
uri.port ||= @current_port unless uri.default_port == @current_port
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
79
80
|
def current_url
|
80
81
|
last_request.url
|
81
82
|
rescue Rack::Test::Error
|
@@ -19,25 +19,22 @@ class Capybara::RackTest::Form < Capybara::RackTest::Node
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def params(button)
|
22
|
-
|
23
|
-
|
24
|
-
form_element_types = %i[input select textarea]
|
22
|
+
form_element_types = %i[input select textarea button]
|
25
23
|
form_elements_xpath = XPath.generate do |xp|
|
26
24
|
xpath = xp.descendant(*form_element_types).where(!xp.attr(:form))
|
27
25
|
xpath += xp.anywhere(*form_element_types).where(xp.attr(:form) == native[:id]) if native[:id]
|
28
26
|
xpath.where(!xp.attr(:disabled))
|
29
27
|
end.to_s
|
30
28
|
|
31
|
-
native.xpath(form_elements_xpath).
|
29
|
+
form_elements = native.xpath(form_elements_xpath).reject { |el| submitter?(el) && (el != button.native) }
|
30
|
+
|
31
|
+
form_elements.each_with_object(make_params) do |field, params|
|
32
32
|
case field.name
|
33
|
-
when 'input' then add_input_param(field, params)
|
33
|
+
when 'input', 'button' then add_input_param(field, params)
|
34
34
|
when 'select' then add_select_param(field, params)
|
35
35
|
when 'textarea' then add_textarea_param(field, params)
|
36
36
|
end
|
37
|
-
end
|
38
|
-
merge_param!(params, button[:name], button[:value] || '') if button[:name]
|
39
|
-
|
40
|
-
params.to_params_hash
|
37
|
+
end.to_params_hash
|
41
38
|
end
|
42
39
|
|
43
40
|
def submit(button)
|
@@ -80,28 +77,32 @@ private
|
|
80
77
|
end
|
81
78
|
|
82
79
|
def add_input_param(field, params)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
80
|
+
name, value = field['name'].to_s, field['value'].to_s
|
81
|
+
return if name.empty?
|
82
|
+
|
83
|
+
value = case field['type']
|
84
|
+
when 'radio', 'checkbox'
|
85
|
+
return unless field['checked']
|
86
|
+
|
87
|
+
Capybara::RackTest::Node.new(driver, field).value.to_s
|
88
|
+
when 'file'
|
92
89
|
if multipart?
|
93
|
-
|
94
|
-
NilUploadedFile.new
|
95
|
-
else
|
96
|
-
mime_info = MiniMime.lookup_by_filename(value)
|
97
|
-
Rack::Test::UploadedFile.new(value, mime_info&.content_type&.to_s)
|
98
|
-
end
|
99
|
-
merge_param!(params, field['name'], file)
|
90
|
+
file_to_upload(value)
|
100
91
|
else
|
101
|
-
|
92
|
+
File.basename(value)
|
102
93
|
end
|
103
94
|
else
|
104
|
-
|
95
|
+
value
|
96
|
+
end
|
97
|
+
merge_param!(params, name, value)
|
98
|
+
end
|
99
|
+
|
100
|
+
def file_to_upload(filename)
|
101
|
+
if filename.empty?
|
102
|
+
NilUploadedFile.new
|
103
|
+
else
|
104
|
+
mime_info = MiniMime.lookup_by_filename(filename)
|
105
|
+
Rack::Test::UploadedFile.new(filename, mime_info&.content_type&.to_s)
|
105
106
|
end
|
106
107
|
end
|
107
108
|
|
@@ -119,4 +120,8 @@ private
|
|
119
120
|
def add_textarea_param(field, params)
|
120
121
|
merge_param!(params, field['name'], field['_capybara_raw_value'].to_s.gsub(/\n/, "\r\n"))
|
121
122
|
end
|
123
|
+
|
124
|
+
def submitter?(el)
|
125
|
+
(%w[submit image].include? el['type']) || (el.name == 'button')
|
126
|
+
end
|
122
127
|
end
|
data/lib/capybara/result.rb
CHANGED
@@ -32,7 +32,7 @@ module Capybara
|
|
32
32
|
|
33
33
|
def_delegators :full_results, :size, :length, :last, :values_at, :inspect, :sample
|
34
34
|
|
35
|
-
alias
|
35
|
+
alias index find_index
|
36
36
|
|
37
37
|
def each(&block)
|
38
38
|
return enum_for(:each) unless block_given?
|
@@ -73,28 +73,25 @@ module Capybara
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def compare_count
|
76
|
+
count, min, max, between = @query.options.values_at(:count, :minimum, :maximum, :between)
|
77
|
+
|
76
78
|
# Only check filters for as many elements as necessary to determine result
|
77
|
-
if (count =
|
78
|
-
count = Integer(count)
|
79
|
+
if count && (count = Integer(count))
|
79
80
|
return load_up_to(count + 1) <=> count
|
80
81
|
end
|
81
82
|
|
82
|
-
if (min =
|
83
|
-
min = Integer(min)
|
83
|
+
if min && (min = Integer(min))
|
84
84
|
return -1 if load_up_to(min) < min
|
85
85
|
end
|
86
86
|
|
87
|
-
if (max =
|
88
|
-
max = Integer(max)
|
87
|
+
if max && (max = Integer(max))
|
89
88
|
return 1 if load_up_to(max + 1) > max
|
90
89
|
end
|
91
90
|
|
92
|
-
if
|
91
|
+
if between
|
93
92
|
min, max = between.minmax
|
94
93
|
size = load_up_to(max + 1)
|
95
|
-
return
|
96
|
-
|
97
|
-
return size <=> min
|
94
|
+
return between.include?(size) ? 0 : size <=> min
|
98
95
|
end
|
99
96
|
|
100
97
|
0
|