capybara 2.9.2 → 2.10.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/History.md +10 -1
- data/README.md +34 -27
- data/lib/capybara.rb +2 -2
- data/lib/capybara/node/actions.rb +3 -3
- data/lib/capybara/node/base.rb +2 -2
- data/lib/capybara/node/element.rb +1 -1
- data/lib/capybara/node/finders.rb +37 -32
- data/lib/capybara/node/matchers.rb +187 -171
- data/lib/capybara/queries/selector_query.rb +11 -14
- data/lib/capybara/rack_test/driver.rb +3 -3
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/rspec/features.rb +1 -1
- data/lib/capybara/rspec/matchers.rb +31 -22
- data/lib/capybara/selector.rb +2 -2
- data/lib/capybara/selector/selector.rb +22 -0
- data/lib/capybara/session.rb +4 -4
- data/lib/capybara/spec/session/accept_alert_spec.rb +4 -4
- data/lib/capybara/spec/session/accept_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/accept_prompt_spec.rb +5 -5
- data/lib/capybara/spec/session/all_spec.rb +27 -27
- data/lib/capybara/spec/session/assert_current_path.rb +2 -2
- data/lib/capybara/spec/session/assert_selector.rb +28 -28
- data/lib/capybara/spec/session/assert_text.rb +20 -20
- data/lib/capybara/spec/session/assert_title.rb +2 -2
- data/lib/capybara/spec/session/attach_file_spec.rb +2 -2
- data/lib/capybara/spec/session/check_spec.rb +5 -5
- data/lib/capybara/spec/session/choose_spec.rb +4 -4
- data/lib/capybara/spec/session/click_button_spec.rb +18 -5
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +6 -6
- data/lib/capybara/spec/session/click_link_spec.rb +13 -13
- data/lib/capybara/spec/session/current_url_spec.rb +2 -2
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +15 -8
- data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -1
- data/lib/capybara/spec/session/execute_script_spec.rb +2 -2
- data/lib/capybara/spec/session/fill_in_spec.rb +30 -30
- data/lib/capybara/spec/session/find_button_spec.rb +5 -5
- data/lib/capybara/spec/session/find_by_id_spec.rb +2 -2
- data/lib/capybara/spec/session/find_field_spec.rb +11 -7
- data/lib/capybara/spec/session/find_link_spec.rb +2 -2
- data/lib/capybara/spec/session/find_spec.rb +52 -48
- data/lib/capybara/spec/session/first_spec.rb +9 -9
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_button_spec.rb +12 -12
- data/lib/capybara/spec/session/has_css_spec.rb +73 -73
- data/lib/capybara/spec/session/has_current_path_spec.rb +2 -2
- data/lib/capybara/spec/session/has_field_spec.rb +78 -68
- data/lib/capybara/spec/session/has_link_spec.rb +8 -8
- data/lib/capybara/spec/session/has_select_spec.rb +70 -61
- data/lib/capybara/spec/session/has_selector_spec.rb +28 -28
- data/lib/capybara/spec/session/has_text_spec.rb +6 -6
- data/lib/capybara/spec/session/has_title_spec.rb +2 -2
- data/lib/capybara/spec/session/has_xpath_spec.rb +26 -26
- data/lib/capybara/spec/session/headers.rb +1 -1
- data/lib/capybara/spec/session/html_spec.rb +3 -3
- data/lib/capybara/spec/session/node_spec.rb +15 -15
- data/lib/capybara/spec/session/reset_session_spec.rb +4 -4
- data/lib/capybara/spec/session/response_code.rb +1 -1
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +3 -3
- data/lib/capybara/spec/session/screenshot_spec.rb +1 -1
- data/lib/capybara/spec/session/select_spec.rb +30 -30
- data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
- data/lib/capybara/spec/session/unselect_spec.rb +14 -14
- data/lib/capybara/spec/session/visit_spec.rb +2 -2
- data/lib/capybara/spec/session/within_frame_spec.rb +2 -2
- data/lib/capybara/spec/session/within_spec.rb +6 -6
- data/lib/capybara/spec/spec_helper.rb +1 -1
- data/lib/capybara/spec/test_app.rb +1 -1
- data/lib/capybara/spec/views/form.erb +1 -0
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +5 -5
- data/spec/capybara_spec.rb +1 -1
- data/spec/dsl_spec.rb +1 -1
- data/spec/rack_test_spec.rb +7 -7
- data/spec/rspec/matchers_spec.rb +6 -6
- data/spec/rspec_spec.rb +1 -1
- data/spec/selector_spec.rb +13 -0
- data/spec/selenium_firefox_spec.rb +1 -1
- data/spec/selenium_spec_chrome.rb +1 -1
- data/spec/shared_selenium_session.rb +10 -10
- metadata +2 -2
@@ -7,8 +7,9 @@ module Capybara
|
|
7
7
|
VALID_KEYS = COUNT_KEYS + [:text, :id, :class, :visible, :exact, :match, :wait, :filter_set]
|
8
8
|
VALID_MATCH = [:first, :smart, :prefer_exact, :one]
|
9
9
|
|
10
|
-
def initialize(*args)
|
10
|
+
def initialize(*args, &filter_block)
|
11
11
|
@options = if args.last.is_a?(Hash) then args.pop.dup else {} end
|
12
|
+
@filter_block = filter_block
|
12
13
|
|
13
14
|
if args[0].is_a?(Symbol)
|
14
15
|
@selector = Selector.all.fetch(args.shift) do |selector_type|
|
@@ -45,6 +46,7 @@ module Capybara
|
|
45
46
|
@description << " with id #{options[:id]}" if options[:id]
|
46
47
|
@description << " with classes #{Array(options[:class]).join(',')}]" if options[:class]
|
47
48
|
@description << selector.description(options)
|
49
|
+
@description << " that also matches the custom filter block" if @filter_block
|
48
50
|
@description
|
49
51
|
end
|
50
52
|
|
@@ -59,7 +61,7 @@ module Capybara
|
|
59
61
|
when :hidden then return false if node.visible?
|
60
62
|
end
|
61
63
|
|
62
|
-
query_filters.all? do |name, filter|
|
64
|
+
res = query_filters.all? do |name, filter|
|
63
65
|
if options.has_key?(name)
|
64
66
|
filter.matches?(node, options[name])
|
65
67
|
elsif filter.default?
|
@@ -68,21 +70,16 @@ module Capybara
|
|
68
70
|
true
|
69
71
|
end
|
70
72
|
end
|
73
|
+
|
74
|
+
res &&= @filter_block.call(node) unless @filter_block.nil?
|
75
|
+
res
|
71
76
|
end
|
72
77
|
|
73
78
|
def visible
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
else @options[:visible]
|
79
|
-
end
|
80
|
-
else
|
81
|
-
if Capybara.ignore_hidden_elements
|
82
|
-
:visible
|
83
|
-
else
|
84
|
-
:all
|
85
|
-
end
|
79
|
+
case (vis = options.fetch(:visible){ @selector.default_visibility })
|
80
|
+
when true then :visible
|
81
|
+
when false then :all
|
82
|
+
else vis
|
86
83
|
end
|
87
84
|
end
|
88
85
|
|
@@ -7,9 +7,9 @@ require 'cgi'
|
|
7
7
|
|
8
8
|
class Capybara::RackTest::Driver < Capybara::Driver::Base
|
9
9
|
DEFAULT_OPTIONS = {
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
10
|
+
respect_data_method: false,
|
11
|
+
follow_redirects: true,
|
12
|
+
redirect_limit: 5
|
13
13
|
}
|
14
14
|
attr_reader :app, :options
|
15
15
|
|
data/lib/capybara/rails.rb
CHANGED
@@ -16,5 +16,5 @@ Capybara.save_path = Rails.root.join('tmp/capybara')
|
|
16
16
|
|
17
17
|
# Override default rack_test driver to respect data-method attributes.
|
18
18
|
Capybara.register_driver :rack_test do |app|
|
19
|
-
Capybara::RackTest::Driver.new(app, :
|
19
|
+
Capybara::RackTest::Driver.new(app, respect_data_method: true)
|
20
20
|
end
|
@@ -16,8 +16,9 @@ module Capybara
|
|
16
16
|
class HaveSelector < Matcher
|
17
17
|
attr_reader :failure_message, :failure_message_when_negated
|
18
18
|
|
19
|
-
def initialize(*args)
|
19
|
+
def initialize(*args, &filter_block)
|
20
20
|
@args = args
|
21
|
+
@filter_block = filter_block
|
21
22
|
end
|
22
23
|
|
23
24
|
def matches?(actual)
|
@@ -39,7 +40,7 @@ module Capybara
|
|
39
40
|
end
|
40
41
|
|
41
42
|
def query
|
42
|
-
@query ||= Capybara::Queries::SelectorQuery.new(*@args)
|
43
|
+
@query ||= Capybara::Queries::SelectorQuery.new(*@args, &@filter_block)
|
43
44
|
end
|
44
45
|
|
45
46
|
# RSpec 2 compatibility:
|
@@ -221,8 +222,8 @@ module Capybara
|
|
221
222
|
alias_method :failure_message_for_should_not, :failure_message_when_negated
|
222
223
|
end
|
223
224
|
|
224
|
-
def have_selector(*args)
|
225
|
-
HaveSelector.new(*args)
|
225
|
+
def have_selector(*args, &optional_filter_block)
|
226
|
+
HaveSelector.new(*args, &optional_filter_block)
|
226
227
|
end
|
227
228
|
|
228
229
|
def match_selector(*args)
|
@@ -233,16 +234,16 @@ module Capybara
|
|
233
234
|
::RSpec::Matchers.define_negated_matcher :not_match_selector, :match_selector if defined?(::RSpec::Expectations::Version) && (Gem::Version.new(RSpec::Expectations::Version::STRING) >= Gem::Version.new('3.1'))
|
234
235
|
|
235
236
|
|
236
|
-
def have_xpath(xpath, options={})
|
237
|
-
HaveSelector.new(:xpath, xpath, options)
|
237
|
+
def have_xpath(xpath, options={}, &optional_filter_block)
|
238
|
+
HaveSelector.new(:xpath, xpath, options, &optional_filter_block)
|
238
239
|
end
|
239
240
|
|
240
241
|
def match_xpath(xpath, options={})
|
241
242
|
MatchSelector.new(:xpath, xpath, options)
|
242
243
|
end
|
243
244
|
|
244
|
-
def have_css(css, options={})
|
245
|
-
HaveSelector.new(:css, css, options)
|
245
|
+
def have_css(css, options={}, &optional_filter_block)
|
246
|
+
HaveSelector.new(:css, css, options, &optional_filter_block)
|
246
247
|
end
|
247
248
|
|
248
249
|
def match_css(css, options={})
|
@@ -262,32 +263,39 @@ module Capybara
|
|
262
263
|
HaveCurrentPath.new(path, options)
|
263
264
|
end
|
264
265
|
|
265
|
-
def have_link(locator, options={})
|
266
|
-
|
266
|
+
def have_link(locator=nil, options={}, &optional_filter_block)
|
267
|
+
locator, options = nil, locator if locator.is_a? Hash
|
268
|
+
HaveSelector.new(:link, locator, options, &optional_filter_block)
|
267
269
|
end
|
268
270
|
|
269
|
-
def have_button(locator, options={})
|
270
|
-
|
271
|
+
def have_button(locator=nil, options={}, &optional_filter_block)
|
272
|
+
locator, options = nil, locator if locator.is_a? Hash
|
273
|
+
HaveSelector.new(:button, locator, options, &optional_filter_block)
|
271
274
|
end
|
272
275
|
|
273
|
-
def have_field(locator, options={})
|
274
|
-
|
276
|
+
def have_field(locator=nil, options={}, &optional_filter_block)
|
277
|
+
locator, options = nil, locator if locator.is_a? Hash
|
278
|
+
HaveSelector.new(:field, locator, options, &optional_filter_block)
|
275
279
|
end
|
276
280
|
|
277
|
-
def have_checked_field(locator, options={})
|
278
|
-
|
281
|
+
def have_checked_field(locator=nil, options={}, &optional_filter_block)
|
282
|
+
locator, options = nil, locator if locator.is_a? Hash
|
283
|
+
HaveSelector.new(:field, locator, options.merge(checked: true), &optional_filter_block)
|
279
284
|
end
|
280
285
|
|
281
|
-
def have_unchecked_field(locator, options={})
|
282
|
-
|
286
|
+
def have_unchecked_field(locator=nil, options={}, &optional_filter_block)
|
287
|
+
locator, options = nil, locator if locator.is_a? Hash
|
288
|
+
HaveSelector.new(:field, locator, options.merge(unchecked: true), &optional_filter_block)
|
283
289
|
end
|
284
290
|
|
285
|
-
def have_select(locator, options={})
|
286
|
-
|
291
|
+
def have_select(locator=nil, options={}, &optional_filter_block)
|
292
|
+
locator, options = nil, locator if locator.is_a? Hash
|
293
|
+
HaveSelector.new(:select, locator, options, &optional_filter_block)
|
287
294
|
end
|
288
295
|
|
289
|
-
def have_table(locator, options={})
|
290
|
-
|
296
|
+
def have_table(locator=nil, options={}, &optional_filter_block)
|
297
|
+
locator, options = nil, locator if locator.is_a? Hash
|
298
|
+
HaveSelector.new(:table, locator, options, &optional_filter_block)
|
291
299
|
end
|
292
300
|
|
293
301
|
##
|
@@ -299,5 +307,6 @@ module Capybara
|
|
299
307
|
def become_closed(options = {})
|
300
308
|
BecomeClosed.new(options)
|
301
309
|
end
|
310
|
+
|
302
311
|
end
|
303
312
|
end
|
data/lib/capybara/selector.rb
CHANGED
@@ -157,7 +157,7 @@ end
|
|
157
157
|
#
|
158
158
|
# Find buttons ( input [of type submit, reset, image, button] or button elements )
|
159
159
|
#
|
160
|
-
# @locator Matches the id, value, or title attributes, string content of a button, or the alt attribute of an image type button
|
160
|
+
# @locator Matches the id, value, or title attributes, string content of a button, or the alt attribute of an image type button or of a descendant image of a button
|
161
161
|
#
|
162
162
|
# @filter [String] :id Matches the id attribute
|
163
163
|
# @filter [String] :title Matches the title attribute
|
@@ -177,7 +177,7 @@ Capybara.add_selector(:button) do
|
|
177
177
|
|
178
178
|
input_btn_xpath = input_btn_xpath[locator_matches]
|
179
179
|
|
180
|
-
btn_xpath = btn_xpath[locator_matches | XPath.string.n.is(locator)]
|
180
|
+
btn_xpath = btn_xpath[locator_matches | XPath.string.n.is(locator) | XPath.descendant(:img)[XPath.attr(:alt).is(locator)]]
|
181
181
|
|
182
182
|
alt_matches = XPath.attr(:alt).is(locator)
|
183
183
|
alt_matches |= XPath.attr(:'aria-label').is(locator) if Capybara.enable_aria_label
|
@@ -50,6 +50,7 @@ module Capybara
|
|
50
50
|
@format = nil
|
51
51
|
@expression = nil
|
52
52
|
@expression_filters = []
|
53
|
+
@default_visibility = nil
|
53
54
|
instance_eval(&block)
|
54
55
|
end
|
55
56
|
|
@@ -186,6 +187,27 @@ module Capybara
|
|
186
187
|
@filter_set.describe &block
|
187
188
|
end
|
188
189
|
|
190
|
+
##
|
191
|
+
#
|
192
|
+
# Set the default visibility mode that shouble be used if no visibile option is passed when using the selector.
|
193
|
+
# If not specified will default to the behavior indicated by Capybara.ignore_hidden_elements
|
194
|
+
#
|
195
|
+
# @param [Symbol] default_visibility Only find elements with the specified visibility:
|
196
|
+
# * :all - finds visible and invisible elements.
|
197
|
+
# * :hidden - only finds invisible elements.
|
198
|
+
# * :visible - only finds visible elements.
|
199
|
+
def visible(default_visibility)
|
200
|
+
@default_visibility = default_visibility
|
201
|
+
end
|
202
|
+
|
203
|
+
def default_visibility
|
204
|
+
if @default_visibility.nil?
|
205
|
+
Capybara.ignore_hidden_elements
|
206
|
+
else
|
207
|
+
@default_visibility
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
189
211
|
private
|
190
212
|
|
191
213
|
def locate_field(xpath, locator, options={})
|
data/lib/capybara/session.rb
CHANGED
@@ -20,7 +20,7 @@ module Capybara
|
|
20
20
|
# +current_path, and so on. It also delegate a number of methods to a Capybara::Document, representing
|
21
21
|
# the current HTML document. This allows interaction:
|
22
22
|
#
|
23
|
-
# session.fill_in('q', :
|
23
|
+
# session.fill_in('q', with: 'Capybara')
|
24
24
|
# session.click_button('Search')
|
25
25
|
# expect(session).to have_content('Capybara')
|
26
26
|
#
|
@@ -264,7 +264,7 @@ module Capybara
|
|
264
264
|
# to the given element.
|
265
265
|
#
|
266
266
|
# within(:xpath, '//div[@id="delivery-address"]') do
|
267
|
-
# fill_in('Street', :
|
267
|
+
# fill_in('Street', with: '12 Main Street')
|
268
268
|
# end
|
269
269
|
#
|
270
270
|
# Just as with `find`, if multiple elements match the selector given to
|
@@ -275,13 +275,13 @@ module Capybara
|
|
275
275
|
# assumed to be of the type set in Capybara.default_selector.
|
276
276
|
#
|
277
277
|
# within('div#delivery-address') do
|
278
|
-
# fill_in('Street', :
|
278
|
+
# fill_in('Street', with: '12 Main Street')
|
279
279
|
# end
|
280
280
|
#
|
281
281
|
# Note that a lot of uses of `within` can be replaced more succinctly with
|
282
282
|
# chaining:
|
283
283
|
#
|
284
|
-
# find('div#delivery-address').fill_in('Street', :
|
284
|
+
# find('div#delivery-address').fill_in('Street', with: '12 Main Street')
|
285
285
|
#
|
286
286
|
# @overload within(*find_args)
|
287
287
|
# @param (see Capybara::Node::Finders#all)
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
Capybara::SpecHelper.spec '#accept_alert', :
|
2
|
+
Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
3
3
|
before do
|
4
4
|
@session.visit('/with_js')
|
5
5
|
end
|
@@ -10,14 +10,14 @@ Capybara::SpecHelper.spec '#accept_alert', :requires => [:modals] do
|
|
10
10
|
end
|
11
11
|
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "should accept the alert if the text matches" do
|
15
15
|
@session.accept_alert 'Alert opened' do
|
16
16
|
@session.click_link('Open alert')
|
17
17
|
end
|
18
18
|
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it "should not accept the alert if the text doesnt match" do
|
22
22
|
expect do
|
23
23
|
@session.accept_alert 'Incorrect Text' do
|
@@ -47,7 +47,7 @@ Capybara::SpecHelper.spec '#accept_alert', :requires => [:modals] do
|
|
47
47
|
end
|
48
48
|
expect(message).to eq('Delayed alert opened')
|
49
49
|
end
|
50
|
-
|
50
|
+
|
51
51
|
it "should allow to adjust the delay" do
|
52
52
|
@session.accept_alert wait: 4 do
|
53
53
|
@session.click_link('Open slow alert')
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
Capybara::SpecHelper.spec '#accept_prompt', :
|
2
|
+
Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
3
3
|
before do
|
4
4
|
@session.visit('/with_js')
|
5
5
|
end
|
@@ -17,21 +17,21 @@ Capybara::SpecHelper.spec '#accept_prompt', :requires => [:modals] do
|
|
17
17
|
end
|
18
18
|
expect(message).to eq('Prompt opened')
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it "should accept the prompt with a response" do
|
22
22
|
@session.accept_prompt with: 'the response' do
|
23
23
|
@session.click_link('Open prompt')
|
24
24
|
end
|
25
25
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it "should accept the prompt if the message matches" do
|
29
29
|
@session.accept_prompt 'Prompt opened', with: 'matched' do
|
30
30
|
@session.click_link('Open prompt')
|
31
31
|
end
|
32
32
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='matched']")
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it "should not accept the prompt if the message doesn't match" do
|
36
36
|
expect do
|
37
37
|
@session.accept_prompt 'Incorrect Text', with: 'not matched' do
|
@@ -39,7 +39,7 @@ Capybara::SpecHelper.spec '#accept_prompt', :requires => [:modals] do
|
|
39
39
|
end
|
40
40
|
end.to raise_error(Capybara::ModalNotFound)
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
|
44
44
|
it "should return the message presented" do
|
45
45
|
message = @session.accept_prompt with: 'the response' do
|
@@ -22,7 +22,7 @@ Capybara::SpecHelper.spec "#all" do
|
|
22
22
|
end
|
23
23
|
|
24
24
|
it "should raise an error when given invalid options" do
|
25
|
-
expect { @session.all('//p', :
|
25
|
+
expect { @session.all('//p', schmoo: "foo") }.to raise_error(ArgumentError)
|
26
26
|
end
|
27
27
|
|
28
28
|
context "with css selectors" do
|
@@ -53,11 +53,11 @@ Capybara::SpecHelper.spec "#all" do
|
|
53
53
|
|
54
54
|
context "with visible filter" do
|
55
55
|
it "should only find visible nodes when true" do
|
56
|
-
expect(@session.all(:css, "a.simple", :
|
56
|
+
expect(@session.all(:css, "a.simple", visible: true).size).to eq(1)
|
57
57
|
end
|
58
58
|
|
59
59
|
it "should find nodes regardless of whether they are invisible when false" do
|
60
|
-
expect(@session.all(:css, "a.simple", :
|
60
|
+
expect(@session.all(:css, "a.simple", visible: false).size).to eq(2)
|
61
61
|
end
|
62
62
|
|
63
63
|
it "should default to Capybara.ignore_hidden_elements" do
|
@@ -71,68 +71,68 @@ Capybara::SpecHelper.spec "#all" do
|
|
71
71
|
context 'with element count filters' do
|
72
72
|
context ':count' do
|
73
73
|
it 'should succeed when the number of elements founds matches the expectation' do
|
74
|
-
expect { @session.all(:css, 'h1, p', :
|
74
|
+
expect { @session.all(:css, 'h1, p', count: 4) }.to_not raise_error
|
75
75
|
end
|
76
76
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
77
|
-
expect { @session.all(:css, 'h1, p', :
|
77
|
+
expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
context ':minimum' do
|
81
81
|
it 'should succeed when the number of elements founds matches the expectation' do
|
82
|
-
expect { @session.all(:css, 'h1, p', :
|
82
|
+
expect { @session.all(:css, 'h1, p', minimum: 0) }.to_not raise_error
|
83
83
|
end
|
84
84
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
85
|
-
expect { @session.all(:css, 'h1, p', :
|
85
|
+
expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
|
86
86
|
end
|
87
87
|
end
|
88
88
|
context ':maximum' do
|
89
89
|
it 'should succeed when the number of elements founds matches the expectation' do
|
90
|
-
expect { @session.all(:css, 'h1, p', :
|
90
|
+
expect { @session.all(:css, 'h1, p', maximum: 4) }.to_not raise_error
|
91
91
|
end
|
92
92
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
93
|
-
expect { @session.all(:css, 'h1, p', :
|
93
|
+
expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
|
94
94
|
end
|
95
95
|
end
|
96
96
|
context ':between' do
|
97
97
|
it 'should succeed when the number of elements founds matches the expectation' do
|
98
|
-
expect { @session.all(:css, 'h1, p', :
|
98
|
+
expect { @session.all(:css, 'h1, p', between: 2..7) }.to_not raise_error
|
99
99
|
end
|
100
100
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
101
|
-
expect { @session.all(:css, 'h1, p', :
|
101
|
+
expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
105
105
|
context 'with multiple count filters' do
|
106
106
|
it 'ignores other filters when :count is specified' do
|
107
|
-
o = {:
|
108
|
-
:
|
109
|
-
:
|
110
|
-
:
|
107
|
+
o = {count: 4,
|
108
|
+
minimum: 5,
|
109
|
+
maximum: 0,
|
110
|
+
between: 0..3}
|
111
111
|
expect { @session.all(:css, 'h1, p', o) }.to_not raise_error
|
112
112
|
end
|
113
113
|
context 'with no :count expectation' do
|
114
114
|
it 'fails if :minimum is not met' do
|
115
|
-
o = {:
|
116
|
-
:
|
117
|
-
:
|
115
|
+
o = {minimum: 5,
|
116
|
+
maximum: 4,
|
117
|
+
between: 2..7}
|
118
118
|
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
119
119
|
end
|
120
120
|
it 'fails if :maximum is not met' do
|
121
|
-
o = {:
|
122
|
-
:
|
123
|
-
:
|
121
|
+
o = {minimum: 0,
|
122
|
+
maximum: 0,
|
123
|
+
between: 2..7}
|
124
124
|
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
125
125
|
end
|
126
126
|
it 'fails if :between is not met' do
|
127
|
-
o = {:
|
128
|
-
:
|
129
|
-
:
|
127
|
+
o = {minimum: 0,
|
128
|
+
maximum: 4,
|
129
|
+
between: 0..3}
|
130
130
|
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
131
131
|
end
|
132
132
|
it 'succeeds if all combineable expectations are met' do
|
133
|
-
o = {:
|
134
|
-
:
|
135
|
-
:
|
133
|
+
o = {minimum: 0,
|
134
|
+
maximum: 4,
|
135
|
+
between: 2..7}
|
136
136
|
expect { @session.all(:css, 'h1, p', o) }.to_not raise_error
|
137
137
|
end
|
138
138
|
end
|