capybara 2.9.2 → 2.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 +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
|