capybara 2.8.1 → 2.9.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.yard/templates_custom/default/class/html/selectors.erb +38 -0
  3. data/.yard/templates_custom/default/class/html/setup.rb +17 -0
  4. data/.yard/yard_extensions.rb +78 -0
  5. data/.yardopts +1 -0
  6. data/History.md +13 -1
  7. data/README.md +1 -1
  8. data/lib/capybara/helpers.rb +0 -59
  9. data/lib/capybara/node/actions.rb +17 -11
  10. data/lib/capybara/node/finders.rb +9 -0
  11. data/lib/capybara/node/matchers.rb +54 -15
  12. data/lib/capybara/queries/base_query.rb +59 -3
  13. data/lib/capybara/queries/selector_query.rb +7 -16
  14. data/lib/capybara/queries/text_query.rb +11 -10
  15. data/lib/capybara/rack_test/form.rb +2 -1
  16. data/lib/capybara/result.rb +25 -10
  17. data/lib/capybara/rspec/features.rb +3 -2
  18. data/lib/capybara/rspec/matchers.rb +1 -1
  19. data/lib/capybara/selector.rb +277 -175
  20. data/lib/capybara/selector/filter_set.rb +3 -1
  21. data/lib/capybara/selector/selector.rb +227 -0
  22. data/lib/capybara/session.rb +2 -2
  23. data/lib/capybara/spec/session/element/matches_selector_spec.rb +29 -1
  24. data/lib/capybara/spec/session/selectors_spec.rb +12 -0
  25. data/lib/capybara/spec/views/form.erb +11 -0
  26. data/lib/capybara/version.rb +1 -1
  27. data/spec/fixtures/capybara.csv +1 -0
  28. data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
  29. data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
  30. data/spec/rack_test_spec.rb +8 -0
  31. data/spec/result_spec.rb +3 -0
  32. data/spec/selenium_firefox_spec.rb +44 -0
  33. data/spec/selenium_spec_chrome.rb +5 -2
  34. data/spec/{selenium_spec.rb → shared_selenium_session.rb} +9 -43
  35. metadata +10 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fbc8500c466333af5900b64e398ea4bb73221857
4
- data.tar.gz: f1ccdd60394f1d8d6a73bdc6cc2f70cbd05459f6
3
+ metadata.gz: 074717523be47e7a162c2d4bc45f5ff49737e6a8
4
+ data.tar.gz: 25c95e6c9273c09663933921ba177067e622ea65
5
5
  SHA512:
6
- metadata.gz: 1c18871ba8adfa7f8ed70df32f332909cff6d6ee2518fefb252de17267d5549a6a281e6958e3dfb5cda029002be4b51203d0793bbe454e96d7998583a576cd74
7
- data.tar.gz: 8be99a4f361374e92c9cbb9050920e7c031d4e8cfdcbf1d5fef28cdcfe938df6b61531a817afff9a7910ea9b28b7a0636512420abcdcbedc98fd1dfbcafc25dd
6
+ metadata.gz: d1db39b289e31ac1432a30cbe5ff8ce957867e1b3fd854813d8bfa954af0babb5a89ac1ccfa21ff6d5074b112a69e4b6deb751bc9c054026bad65d9a2f7d6e0d
7
+ data.tar.gz: 635c3bfb9e2d366ad8bc87a2abe075f2286e496fd2171bf32e6ef6628a55f8f95dfee2fd8e326819ca81d1dc0c85ac0dfee86d0491c5710e5c53f6e756e50c65
@@ -0,0 +1,38 @@
1
+ <div id="selectors">
2
+ <h2>Built-in Selectors</h2>
3
+ <ul>
4
+ <% @selectors.each do |name, selector| %>
5
+ <li>
6
+ <h3>:<%= name %></h3>
7
+ <div class="docstring">
8
+ <div class="discussion">
9
+ <p><%= h(selector.docstring) %></p>
10
+ </div>
11
+ </div>
12
+ <div class="tags">
13
+ <p class="inline">Locator:</p>
14
+ <% if locator=selector.tag('locator') %>
15
+ <p class="inline"><%= h locator.text %></p>
16
+ <% end %>
17
+ <% if selector.has_tag?('filter') %>
18
+ <p>Filters:</p>
19
+ <ul class="param">
20
+ <% selector.tags('filter').each do |filter| %>
21
+ <li>
22
+ <span class="name"><%= filter.name %></span>
23
+ <% if filter.types %>
24
+ <span class="type">(<tt><%= h(filter.types.join(', ')) %></tt>)</span>
25
+ <% end %>
26
+ <% if filter.text %>
27
+
28
+ <div class="inline"><p><%= h filter.text %></p></div>
29
+ <% end %>
30
+ </li>
31
+ <% end %>
32
+ </ul>
33
+ <% end %>
34
+ </div
35
+ </li>
36
+ <% end %>
37
+ </ul>
38
+ </div>
@@ -0,0 +1,17 @@
1
+ def init
2
+ super
3
+ sections.place(:builtins).before(:subclasses)
4
+ end
5
+
6
+ def builtins
7
+ return if object.path != "Capybara::Selector" # only show built-in selectors for Selector class
8
+
9
+ @selectors = Registry.all(:selector)
10
+ return if @selectors.nil? || @selectors.empty?
11
+
12
+ @selectors = @selectors.map do |selector|
13
+ [selector.name, selector]
14
+ end
15
+
16
+ erb(:selectors)
17
+ end
@@ -0,0 +1,78 @@
1
+ YARD::Templates::Engine.register_template_path Pathname.new('./.yard/templates_custom')
2
+
3
+ YARD::Tags::Library.define_tag "Locator", :locator
4
+ YARD::Tags::Library.define_tag "Filter", :filter, :with_types_and_name
5
+
6
+ class SelectorObject < YARD::CodeObjects::Base
7
+ def path
8
+ "__Capybara" + sep + super
9
+ end
10
+ end
11
+
12
+ class AddSelectorHandler < YARD::Handlers::Ruby::Base
13
+ handles method_call(:add_selector)
14
+ namespace_only
15
+ process do
16
+ name = statement.parameters.first.jump(:tstring_content, :ident).source
17
+ # object = YARD::CodeObjects::MethodObject.new(namespace, name.to_sym)
18
+ # object = SelectorObject.new(YARD::Registry.resolve(P("Capybara"), "#add_selector", false, true), name.to_sym)
19
+ object = SelectorObject.new(namespace, name)
20
+ register(object)
21
+ parse_block(statement.last.last, :owner => object)
22
+
23
+ # modify the object
24
+ object.dynamic = true
25
+ end
26
+ end
27
+
28
+ class AddExpressionFilterHandler < YARD::Handlers::Ruby::Base
29
+ handles method_call(:xpath)
30
+ handles method_call(:css)
31
+
32
+ process do
33
+ return unless owner.is_a?(SelectorObject)
34
+ return if statement.parameters.empty?
35
+ # names = statement.parameters.children.map { |p| p.jump(:tstring_content, :ident).source.sub(/^:/, '') }
36
+ names = statement.parameters.children.map &:source
37
+ current_names = owner.tags(:filter).map(&:name)
38
+ (names-current_names).each do |name|
39
+ owner.add_tag(YARD::Tags::Tag.new(:filter, nil, nil, name))
40
+ end
41
+ end
42
+ end
43
+
44
+ class AddFilterHandler < YARD::Handlers::Ruby::Base
45
+ handles method_call(:filter)
46
+
47
+ process do
48
+ return unless owner.is_a?(SelectorObject)
49
+ return if statement.parameters.empty?
50
+ name = statement.parameters.first.source
51
+ type = if statement.parameters[1] && statement.parameters[1].source == ':boolean'
52
+ 'Boolean'
53
+ else
54
+ nil
55
+ end
56
+ if owner.tags(:filter).none? {|tag| tag.name == name }
57
+ filter_tag = YARD::Tags::Tag.new(:filter, nil, type, name)
58
+ owner.add_tag(filter_tag)
59
+ end
60
+ end
61
+ end
62
+
63
+ class FilterSetHandler < YARD::Handlers::Ruby::Base
64
+ handles method_call(:filter_set)
65
+
66
+ process do
67
+ return unless owner.is_a?(SelectorObject)
68
+ return if statement.parameters.empty? || !statement.parameters[1]
69
+
70
+ names = statement.parameters[1].flatten.map { |name| ":#{name}" }
71
+ names.each do |name|
72
+ if owner.tags(:filter).none? {|tag| tag.name == name }
73
+ filter_tag = YARD::Tags::Tag.new(:filter, nil, nil, name)
74
+ owner.add_tag(filter_tag)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1 @@
1
+ --load ./.yard/yard_extensions.rb
data/History.md CHANGED
@@ -1,5 +1,17 @@
1
+ #Version 2.9.0
2
+ Release date: 2016-09-19
3
+
4
+ ### Fixed
5
+ * Issue with rack-test driver and obselete mime-types when using `#attach_file` - Issue #1756 [Thomas Walpole]
6
+
7
+ ### Added
8
+ * `:class` option to many of the built-in selectors [Thomas Walpole]
9
+ * Removed need to specify value when creating `:boolean` filter type in custom selectors [Thomas Walpole]
10
+ * Filters can now be implemented through the XPath/CSS expressions in custom selectors [Thomas Walpole]
11
+ * `Element#matches_xpath?` and `Element#matches_css?` [Thomas Walpole]
12
+
1
13
  #Version 2.8.1
2
- Release data: 2016-08-25
14
+ Release date: 2016-08-25
3
15
 
4
16
  ###Fixed
5
17
  * Fixed error message from have_text when text is not found but contains regex special characters [Ryunosuke Sato]
data/README.md CHANGED
@@ -13,7 +13,7 @@ through an external gem.
13
13
  **Need help?** Ask on the mailing list (please do not open an issue on
14
14
  GitHub): http://groups.google.com/group/ruby-capybara
15
15
 
16
- **Note: Firefox 48** If you're using Firefox with selenium-webdrvier, stay on either Firefox 45.0esr or 47.0.1 and selenium-webdriver 2.53.4. Firefox 48 requires geckodriver and selenium-webdriver v3, the combo of which currently has multiple issues and is feature incomplete.
16
+ **Note: Firefox 48** If you're using Firefox with selenium-webdriver, stay on either Firefox [45.0esr](https://ftp.mozilla.org/pub/firefox/releases/45.0esr/) or [47.0.1](https://ftp.mozilla.org/pub/firefox/releases/47.0.1/) and selenium-webdriver 2.53.4. Firefox 48 requires geckodriver and selenium-webdriver v3, the combo of which currently has multiple issues and is feature incomplete.
17
17
 
18
18
  ## Table of contents
19
19
 
@@ -51,65 +51,6 @@ module Capybara
51
51
  html
52
52
  end
53
53
 
54
- ##
55
- #
56
- # Checks if the given count matches the given count options.
57
- # Defaults to true if no options are specified. If multiple
58
- # options are provided, it tests that all conditions are met;
59
- # however, if :count is supplied, all other options are ignored.
60
- #
61
- # @param [Integer] count The actual number. Should be coercible via Integer()
62
- # @option [Range] between Count must be within the given range
63
- # @option [Integer] count Count must be exactly this
64
- # @option [Integer] maximum Count must be smaller than or equal to this value
65
- # @option [Integer] minimum Count must be larger than or equal to this value
66
- #
67
- def matches_count?(count, options={})
68
- return (Integer(options[:count]) == count) if options[:count]
69
- return false if options[:maximum] && (Integer(options[:maximum]) < count)
70
- return false if options[:minimum] && (Integer(options[:minimum]) > count)
71
- return false if options[:between] && !(options[:between] === count)
72
- return true
73
- end
74
-
75
- ##
76
- #
77
- # Checks if a count of 0 is valid for the given options hash.
78
- # Returns false if options hash does not specify any count options.
79
- #
80
- def expects_none?(options={})
81
- if [:count, :maximum, :minimum, :between].any? { |k| options.has_key? k }
82
- matches_count?(0,options)
83
- else
84
- false
85
- end
86
- end
87
-
88
- ##
89
- #
90
- # Generates a failure message given a description of the query and count
91
- # options.
92
- #
93
- # @param [String] description Description of a query
94
- # @option [Range] between Count should have been within the given range
95
- # @option [Integer] count Count should have been exactly this
96
- # @option [Integer] maximum Count should have been smaller than or equal to this value
97
- # @option [Integer] minimum Count should have been larger than or equal to this value
98
- #
99
- def failure_message(description, options={})
100
- message = String.new("expected to find #{description}")
101
- if options[:count]
102
- message << " #{options[:count]} #{declension('time', 'times', options[:count])}"
103
- elsif options[:between]
104
- message << " between #{options[:between].first} and #{options[:between].last} times"
105
- elsif options[:maximum]
106
- message << " at most #{options[:maximum]} #{declension('time', 'times', options[:maximum])}"
107
- elsif options[:minimum]
108
- message << " at least #{options[:minimum]} #{declension('time', 'times', options[:minimum])}"
109
- end
110
- message
111
- end
112
-
113
54
  ##
114
55
  #
115
56
  # A poor man's `pluralize`. Given two declensions, one singular and one
@@ -64,16 +64,18 @@ module Capybara
64
64
  #
65
65
  # page.fill_in 'Name', :with => 'Bob'
66
66
  #
67
- # @macro waiting_behavior
68
67
  #
69
- # @param [String] locator Which field to fill in
70
- # @param [Hash] options
71
- # @option options [String] :with The value to fill in - required
72
- # @option options [Hash] :fill_options Driver specific options regarding how to fill fields
73
- # @option options [Boolean] :multiple Match fields that can have multiple values?
74
- # @option options [String] id Match fields that match the id attribute
75
- # @option options [String] name Match fields that match the name attribute
76
- # @option options [String] placeholder Match fields that match the placeholder attribute
68
+ # @overload fill_in([locator], options={})
69
+ # @param [String] locator Which field to fill in
70
+ # @param [Hash] options
71
+ # @macro waiting_behavior
72
+ # @option options [String] :with The value to fill in - required
73
+ # @option options [Hash] :fill_options Driver specific options regarding how to fill fields
74
+ # @option options [Boolean] :multiple Match fields that can have multiple values?
75
+ # @option options [String] :id Match fields that match the id attribute
76
+ # @option options [String] :name Match fields that match the name attribute
77
+ # @option options [String] :placeholder Match fields that match the placeholder attribute
78
+ # @option options [String, Array<String>] :class Match links that match the class(es) provided
77
79
  #
78
80
  def fill_in(locator, options={})
79
81
  locator, options = nil, locator if locator.is_a? Hash
@@ -97,8 +99,9 @@ module Capybara
97
99
  # @param [String] locator Which radio button to choose
98
100
  #
99
101
  # @option options [String] :option Value of the radio_button to choose
100
- # @option options [String] id Match fields that match the id attribute
101
- # @option options [String] name Match fields that match the name attribute
102
+ # @option options [String] :id Match fields that match the id attribute
103
+ # @option options [String] :name Match fields that match the name attribute
104
+ # @option options [String, Array<String>] :class Match links that match the class(es) provided
102
105
  # @macro waiting_behavior
103
106
  # @macro label_click
104
107
  def choose(locator, options={})
@@ -133,6 +136,7 @@ module Capybara
133
136
  # @option options [String] :option Value of the checkbox to select
134
137
  # @option options [String] id Match fields that match the id attribute
135
138
  # @option options [String] name Match fields that match the name attribute
139
+ # @option options [String, Array<String>] :class Match links that match the class(es) provided
136
140
  # @macro label_click
137
141
  # @macro waiting_behavior
138
142
  #
@@ -168,6 +172,7 @@ module Capybara
168
172
  # @option options [String] :option Value of the checkbox to deselect
169
173
  # @option options [String] id Match fields that match the id attribute
170
174
  # @option options [String] name Match fields that match the name attribute
175
+ # @option options [String, Array<String>] :class Match links that match the class(es) provided
171
176
  # @macro label_click
172
177
  # @macro waiting_behavior
173
178
  #
@@ -253,6 +258,7 @@ module Capybara
253
258
  # @option options [Boolean] multiple Match field which allows multiple file selection
254
259
  # @option options [String] id Match fields that match the id attribute
255
260
  # @option options [String] name Match fields that match the name attribute
261
+ # @option options [String, Array<String>] :class Match links that match the class(es) provided
256
262
  #
257
263
  def attach_file(locator, path, options={})
258
264
  locator, path, options = nil, locator, path if path.is_a? Hash
@@ -70,6 +70,7 @@ module Capybara
70
70
  # @option options [String] id Match fields that match the id attribute
71
71
  # @option options [String] name Match fields that match the name attribute
72
72
  # @option options [String] placeholder Match fields that match the placeholder attribute
73
+ # @option options [String, Array<String>] Match fields that match the class(es) passed
73
74
  # @return [Capybara::Node::Element] The found element
74
75
  #
75
76
 
@@ -89,6 +90,10 @@ module Capybara
89
90
  # @macro waiting_behavior
90
91
  #
91
92
  # @option options [String,Regexp] href Value to match against the links href
93
+ # @option options [String] id Match links with the id provided
94
+ # @option options [String] title Match links with the title provided
95
+ # @option options [String] alt Match links with a contained img element whose alt matches
96
+ # @option options [String, Array<String>] class Match links that match the class(es) provided
92
97
  # @return [Capybara::Node::Element] The found element
93
98
  #
94
99
  def find_link(locator=nil, options={})
@@ -114,6 +119,10 @@ module Capybara
114
119
  # * true - only finds a disabled button
115
120
  # * false - only finds an enabled button
116
121
  # * :all - finds either an enabled or disabled button
122
+ # @option options [String] id Match buttons with the id provided
123
+ # @option options [String] title Match buttons with the title provided
124
+ # @option options [String] value Match buttons with the value provided
125
+ # @option options [String, Array<String>] class Match links that match the class(es) provided
117
126
  # @return [Capybara::Node::Element] The found element
118
127
  #
119
128
  def find_button(locator=nil, options={})
@@ -5,7 +5,7 @@ module Capybara
5
5
 
6
6
  ##
7
7
  #
8
- # Checks if a given selector is on the page or current node.
8
+ # Checks if a given selector is on the page or a descendant of the current node.
9
9
  #
10
10
  # page.has_selector?('p#foo')
11
11
  # page.has_selector?(:xpath, './/p[@id="foo"]')
@@ -44,7 +44,7 @@ module Capybara
44
44
 
45
45
  ##
46
46
  #
47
- # Checks if a given selector is not on the page or current node.
47
+ # Checks if a given selector is not on the page or a descendant of the current node.
48
48
  # Usage is identical to Capybara::Node::Matchers#has_selector?
49
49
  #
50
50
  # @param (see Capybara::Node::Finders#has_selector?)
@@ -59,7 +59,6 @@ module Capybara
59
59
  ##
60
60
  #
61
61
  # Checks if the current node matches given selector
62
- # Usage is identical to Capybara::Node::Matchers#has_selector?
63
62
  #
64
63
  # @param (see Capybara::Node::Finders#has_selector?)
65
64
  # @return [Boolean]
@@ -70,6 +69,27 @@ module Capybara
70
69
  return false
71
70
  end
72
71
 
72
+ ##
73
+ #
74
+ # Checks if the current node matches given XPath expression
75
+ #
76
+ # @param [String, XPath::Expression] xpath The XPath expression to match against the current code
77
+ # @return [Boolean]
78
+ #
79
+ def matches_xpath?(xpath, options={})
80
+ matches_selector?(:xpath, xpath, options)
81
+ end
82
+
83
+ ##
84
+ #
85
+ # Checks if the current node matches given CSS selector
86
+ #
87
+ # @param [String] css The CSS selector to match against the current code
88
+ # @return [Boolean]
89
+ #
90
+ def matches_css?(css, options={})
91
+ matches_selector?(:css, css, options)
92
+ end
73
93
 
74
94
  ##
75
95
  #
@@ -85,10 +105,31 @@ module Capybara
85
105
  return false
86
106
  end
87
107
 
108
+ ##
109
+ #
110
+ # Checks if the current node does not match given XPath expression
111
+ #
112
+ # @param [String, XPath::Expression] xpath The XPath expression to match against the current code
113
+ # @return [Boolean]
114
+ #
115
+ def not_matches_xpath?(xpath, options={})
116
+ not_matches_selector?(:xpath, xpath, options)
117
+ end
118
+
119
+ ##
120
+ #
121
+ # Checks if the current node does not match given CSS selector
122
+ #
123
+ # @param [String] css The CSS selector to match against the current code
124
+ # @return [Boolean]
125
+ #
126
+ def not_matches_css?(css, options={})
127
+ not_matches_selector?(:css, css, options)
128
+ end
88
129
 
89
130
  ##
90
131
  #
91
- # Asserts that a given selector is on the page or current node.
132
+ # Asserts that a given selector is on the page or a descendant of the current node.
92
133
  #
93
134
  # page.assert_selector('p#foo')
94
135
  # page.assert_selector(:xpath, './/p[@id="foo"]')
@@ -123,7 +164,7 @@ module Capybara
123
164
  query = Capybara::Queries::SelectorQuery.new(*args)
124
165
  synchronize(query.wait) do
125
166
  result = query.resolve_for(self)
126
- unless result.matches_count? && ((!result.empty?) || Capybara::Helpers.expects_none?(query.options))
167
+ unless result.matches_count? && ((!result.empty?) || query.expects_none?)
127
168
  raise Capybara::ExpectationNotMet, result.failure_message
128
169
  end
129
170
  end
@@ -132,7 +173,7 @@ module Capybara
132
173
 
133
174
  ##
134
175
  #
135
- # Asserts that a given selector is not on the page or current node.
176
+ # Asserts that a given selector is not on the page or a descendant of the current node.
136
177
  # Usage is identical to Capybara::Node::Matchers#assert_selector
137
178
  #
138
179
  # Query options such as :count, :minimum, :maximum, and :between are
@@ -150,7 +191,7 @@ module Capybara
150
191
  query = Capybara::Queries::SelectorQuery.new(*args)
151
192
  synchronize(query.wait) do
152
193
  result = query.resolve_for(self)
153
- if result.matches_count? && ((!result.empty?) || Capybara::Helpers.expects_none?(query.options))
194
+ if result.matches_count? && ((!result.empty?) || query.expects_none?)
154
195
  raise Capybara::ExpectationNotMet, result.negative_failure_message
155
196
  end
156
197
  end
@@ -199,7 +240,7 @@ module Capybara
199
240
 
200
241
  ##
201
242
  #
202
- # Checks if a given XPath expression is on the page or current node.
243
+ # Checks if a given XPath expression is on the page or a descendant of the current node.
203
244
  #
204
245
  # page.has_xpath?('.//p[@id="foo"]')
205
246
  #
@@ -232,7 +273,7 @@ module Capybara
232
273
 
233
274
  ##
234
275
  #
235
- # Checks if a given XPath expression is not on the page or current node.
276
+ # Checks if a given XPath expression is not on the page or a descendant of the current node.
236
277
  # Usage is identical to Capybara::Node::Matchers#has_xpath?
237
278
  #
238
279
  # @param (see Capybara::Node::Finders#has_xpath?)
@@ -244,7 +285,7 @@ module Capybara
244
285
 
245
286
  ##
246
287
  #
247
- # Checks if a given CSS selector is on the page or current node.
288
+ # Checks if a given CSS selector is on the page or a descendant of the current node.
248
289
  #
249
290
  # page.has_css?('p#foo')
250
291
  #
@@ -271,7 +312,7 @@ module Capybara
271
312
 
272
313
  ##
273
314
  #
274
- # Checks if a given CSS selector is not on the page or current node.
315
+ # Checks if a given CSS selector is not on the page or a descendant of the current node.
275
316
  # Usage is identical to Capybara::Node::Matchers#has_css?
276
317
  #
277
318
  # @param (see Capybara::Node::Finders#has_css?)
@@ -520,8 +561,7 @@ module Capybara
520
561
  query = Capybara::Queries::TextQuery.new(*args)
521
562
  synchronize(query.wait) do
522
563
  count = query.resolve_for(self)
523
- matches_count = Capybara::Helpers.matches_count?(count, query.options)
524
- unless matches_count && ((count > 0) || Capybara::Helpers.expects_none?(query.options))
564
+ unless query.matches_count?(count) && ((count > 0) || query.expects_none?)
525
565
  raise Capybara::ExpectationNotMet, query.failure_message
526
566
  end
527
567
  end
@@ -540,8 +580,7 @@ module Capybara
540
580
  query = Capybara::Queries::TextQuery.new(*args)
541
581
  synchronize(query.wait) do
542
582
  count = query.resolve_for(self)
543
- matches_count = Capybara::Helpers.matches_count?(count, query.options)
544
- if matches_count && ((count > 0) || Capybara::Helpers.expects_none?(query.options))
583
+ if query.matches_count?(count) && ((count > 0) || query.expects_none?)
545
584
  raise Capybara::ExpectationNotMet, query.negative_failure_message
546
585
  end
547
586
  end