capybara 2.10.2 → 2.11.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/README.md +48 -29
- data/lib/capybara.rb +8 -9
- data/lib/capybara/node/actions.rb +39 -48
- data/lib/capybara/node/document.rb +4 -0
- data/lib/capybara/node/document_matchers.rb +13 -14
- data/lib/capybara/node/element.rb +21 -0
- data/lib/capybara/node/finders.rb +3 -3
- data/lib/capybara/node/matchers.rb +38 -31
- data/lib/capybara/node/simple.rb +3 -0
- data/lib/capybara/queries/selector_query.rb +4 -2
- data/lib/capybara/rack_test/node.rb +1 -1
- data/lib/capybara/result.rb +3 -1
- data/lib/capybara/rspec/matchers.rb +53 -95
- data/lib/capybara/selector.rb +7 -7
- data/lib/capybara/selector/selector.rb +10 -5
- data/lib/capybara/selenium/driver.rb +34 -7
- data/lib/capybara/selenium/node.rb +5 -1
- data/lib/capybara/session.rb +22 -27
- data/lib/capybara/session/matchers.rb +12 -14
- data/lib/capybara/spec/public/test.js +4 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
- data/lib/capybara/spec/session/attach_file_spec.rb +1 -1
- data/lib/capybara/spec/session/check_spec.rb +8 -0
- data/lib/capybara/spec/session/choose_spec.rb +5 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +5 -0
- data/lib/capybara/spec/session/click_link_spec.rb +5 -0
- data/lib/capybara/spec/session/element/assert_match_selector.rb +5 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +6 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +2 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +5 -0
- data/lib/capybara/spec/session/find_spec.rb +1 -1
- data/lib/capybara/spec/session/first_spec.rb +10 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +11 -0
- data/lib/capybara/spec/session/node_spec.rb +3 -3
- data/lib/capybara/spec/session/text_spec.rb +3 -4
- data/lib/capybara/spec/views/with_js.erb +3 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +18 -2
- data/spec/basic_node_spec.rb +1 -1
- data/spec/capybara_spec.rb +4 -1
- data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +4 -1
- data/spec/result_spec.rb +28 -2
- data/spec/rspec/{matchers_spec.rb → shared_spec_matchers.rb} +4 -3
- data/spec/selector_spec.rb +1 -1
- data/spec/selenium_spec_chrome.rb +36 -5
- data/spec/selenium_spec_firefox.rb +67 -0
- data/spec/selenium_spec_marionette.rb +114 -0
- data/spec/shared_selenium_session.rb +6 -4
- metadata +13 -6
- data/spec/selenium_firefox_spec.rb +0 -44
@@ -15,13 +15,7 @@ module Capybara
|
|
15
15
|
# @return [true]
|
16
16
|
#
|
17
17
|
def assert_title(title, options = {})
|
18
|
-
query
|
19
|
-
synchronize(query.wait) do
|
20
|
-
unless query.resolves_for?(self)
|
21
|
-
raise Capybara::ExpectationNotMet, query.failure_message
|
22
|
-
end
|
23
|
-
end
|
24
|
-
return true
|
18
|
+
_verify_title(title,options) { |query| raise Capybara::ExpectationNotMet, query.failure_message unless query.resolves_for?(self) }
|
25
19
|
end
|
26
20
|
|
27
21
|
##
|
@@ -32,13 +26,7 @@ module Capybara
|
|
32
26
|
# @return [true]
|
33
27
|
#
|
34
28
|
def assert_no_title(title, options = {})
|
35
|
-
query
|
36
|
-
synchronize(query.wait) do
|
37
|
-
if query.resolves_for?(self)
|
38
|
-
raise Capybara::ExpectationNotMet, query.negative_failure_message
|
39
|
-
end
|
40
|
-
end
|
41
|
-
return true
|
29
|
+
_verify_title(title,options) { |query| raise Capybara::ExpectationNotMet, query.negative_failure_message if query.resolves_for?(self) }
|
42
30
|
end
|
43
31
|
|
44
32
|
##
|
@@ -64,6 +52,17 @@ module Capybara
|
|
64
52
|
rescue Capybara::ExpectationNotMet
|
65
53
|
return false
|
66
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def _verify_title(title, options)
|
59
|
+
query = Capybara::Queries::TitleQuery.new(title, options)
|
60
|
+
synchronize(query.wait) do
|
61
|
+
yield(query)
|
62
|
+
end
|
63
|
+
return true
|
64
|
+
end
|
65
|
+
|
67
66
|
end
|
68
67
|
end
|
69
68
|
end
|
@@ -27,6 +27,7 @@ module Capybara
|
|
27
27
|
super(session, base)
|
28
28
|
@query_scope = query_scope
|
29
29
|
@query = query
|
30
|
+
@allow_reload = false
|
30
31
|
end
|
31
32
|
|
32
33
|
def allow_reload!
|
@@ -92,6 +93,7 @@ module Capybara
|
|
92
93
|
# @param [String] value The new value
|
93
94
|
# @param [Hash{}] options Driver specific options for how to set the value
|
94
95
|
#
|
96
|
+
# @return [Capybara::Node::Element] The element
|
95
97
|
def set(value, options={})
|
96
98
|
options ||= {}
|
97
99
|
|
@@ -108,47 +110,58 @@ module Capybara
|
|
108
110
|
base.set(value)
|
109
111
|
end
|
110
112
|
end
|
113
|
+
return self
|
111
114
|
end
|
112
115
|
|
113
116
|
##
|
114
117
|
#
|
115
118
|
# Select this node if is an option element inside a select tag
|
116
119
|
#
|
120
|
+
# @return [Capybara::Node::Element] The element
|
117
121
|
def select_option
|
118
122
|
warn "Attempt to select disabled option: #{value || text}" if disabled?
|
119
123
|
synchronize { base.select_option }
|
124
|
+
return self
|
120
125
|
end
|
121
126
|
|
122
127
|
##
|
123
128
|
#
|
124
129
|
# Unselect this node if is an option element inside a multiple select tag
|
125
130
|
#
|
131
|
+
# @return [Capybara::Node::Element] The element
|
126
132
|
def unselect_option
|
127
133
|
synchronize { base.unselect_option }
|
134
|
+
return self
|
128
135
|
end
|
129
136
|
|
130
137
|
##
|
131
138
|
#
|
132
139
|
# Click the Element
|
133
140
|
#
|
141
|
+
# @return [Capybara::Node::Element] The element
|
134
142
|
def click
|
135
143
|
synchronize { base.click }
|
144
|
+
return self
|
136
145
|
end
|
137
146
|
|
138
147
|
##
|
139
148
|
#
|
140
149
|
# Right Click the Element
|
141
150
|
#
|
151
|
+
# @return [Capybara::Node::Element] The element
|
142
152
|
def right_click
|
143
153
|
synchronize { base.right_click }
|
154
|
+
return self
|
144
155
|
end
|
145
156
|
|
146
157
|
##
|
147
158
|
#
|
148
159
|
# Double Click the Element
|
149
160
|
#
|
161
|
+
# @return [Capybara::Node::Element] The element
|
150
162
|
def double_click
|
151
163
|
synchronize { base.double_click }
|
164
|
+
return self
|
152
165
|
end
|
153
166
|
|
154
167
|
##
|
@@ -221,16 +234,20 @@ module Capybara
|
|
221
234
|
# :meta
|
222
235
|
# :command - alias of :meta
|
223
236
|
#
|
237
|
+
# @return [Capybara::Node::Element] The element
|
224
238
|
def send_keys(*args)
|
225
239
|
synchronize { base.send_keys(*args) }
|
240
|
+
return self
|
226
241
|
end
|
227
242
|
|
228
243
|
##
|
229
244
|
#
|
230
245
|
# Hover on the Element
|
231
246
|
#
|
247
|
+
# @return [Capybara::Node::Element] The element
|
232
248
|
def hover
|
233
249
|
synchronize { base.hover }
|
250
|
+
return self
|
234
251
|
end
|
235
252
|
|
236
253
|
##
|
@@ -319,8 +336,10 @@ module Capybara
|
|
319
336
|
#
|
320
337
|
# @param [String] event The name of the event to trigger
|
321
338
|
#
|
339
|
+
# @return [Capybara::Node::Element] The element
|
322
340
|
def trigger(event)
|
323
341
|
synchronize { base.trigger(event) }
|
342
|
+
return self
|
324
343
|
end
|
325
344
|
|
326
345
|
##
|
@@ -333,8 +352,10 @@ module Capybara
|
|
333
352
|
#
|
334
353
|
# @param [Capybara::Node::Element] node The element to drag to
|
335
354
|
#
|
355
|
+
# @return [Capybara::Node::Element] The element
|
336
356
|
def drag_to(node)
|
337
357
|
synchronize { base.drag_to(node.base) }
|
358
|
+
return self
|
338
359
|
end
|
339
360
|
|
340
361
|
def reload
|
@@ -18,7 +18,7 @@ module Capybara
|
|
18
18
|
# +find+ takes the same options as +all+.
|
19
19
|
#
|
20
20
|
# page.find('#foo').find('.bar')
|
21
|
-
# page.find(:xpath, '
|
21
|
+
# page.find(:xpath, './/div[contains(., "bar")]')
|
22
22
|
# page.find('li', text: 'Quox').click_link('Delete')
|
23
23
|
#
|
24
24
|
# @param (see Capybara::Node::Finders#all)
|
@@ -155,7 +155,7 @@ module Capybara
|
|
155
155
|
# following statements are equivalent:
|
156
156
|
#
|
157
157
|
# page.all(:css, 'a#person_123')
|
158
|
-
# page.all(:xpath, '
|
158
|
+
# page.all(:xpath, './/a[@id="person_123"]')
|
159
159
|
#
|
160
160
|
#
|
161
161
|
# If the type of selector is left out, Capybara uses
|
@@ -164,7 +164,7 @@ module Capybara
|
|
164
164
|
# page.all("a#person_123")
|
165
165
|
#
|
166
166
|
# Capybara.default_selector = :xpath
|
167
|
-
# page.all('
|
167
|
+
# page.all('.//a[@id="person_123"]')
|
168
168
|
#
|
169
169
|
# The set of found elements can further be restricted by specifying
|
170
170
|
# options. It's possible to select elements by their text or visibility:
|
@@ -90,14 +90,11 @@ module Capybara
|
|
90
90
|
# @raise [Capybara::ExpectationNotMet] If the selector does not exist
|
91
91
|
#
|
92
92
|
def assert_selector(*args, &optional_filter_block)
|
93
|
-
|
94
|
-
synchronize(query.wait) do
|
95
|
-
result = query.resolve_for(self)
|
93
|
+
_verify_selector_result(args, optional_filter_block) do |result, query|
|
96
94
|
unless result.matches_count? && ((!result.empty?) || query.expects_none?)
|
97
95
|
raise Capybara::ExpectationNotMet, result.failure_message
|
98
96
|
end
|
99
97
|
end
|
100
|
-
return true
|
101
98
|
end
|
102
99
|
|
103
100
|
##
|
@@ -117,14 +114,11 @@ module Capybara
|
|
117
114
|
# @raise [Capybara::ExpectationNotMet] If the selector exists
|
118
115
|
#
|
119
116
|
def assert_no_selector(*args, &optional_filter_block)
|
120
|
-
|
121
|
-
synchronize(query.wait) do
|
122
|
-
result = query.resolve_for(self)
|
117
|
+
_verify_selector_result(args, optional_filter_block) do |result, query|
|
123
118
|
if result.matches_count? && ((!result.empty?) || query.expects_none?)
|
124
119
|
raise Capybara::ExpectationNotMet, result.negative_failure_message
|
125
120
|
end
|
126
121
|
end
|
127
|
-
return true
|
128
122
|
end
|
129
123
|
alias_method :refute_selector, :assert_no_selector
|
130
124
|
|
@@ -333,7 +327,7 @@ module Capybara
|
|
333
327
|
#
|
334
328
|
def has_no_checked_field?(locator=nil, options={}, &optional_filter_block)
|
335
329
|
locator, options = nil, locator if locator.is_a? Hash
|
336
|
-
has_no_selector?(:field, locator, options.merge(checked: true))
|
330
|
+
has_no_selector?(:field, locator, options.merge(checked: true), &optional_filter_block)
|
337
331
|
end
|
338
332
|
|
339
333
|
##
|
@@ -455,25 +449,15 @@ module Capybara
|
|
455
449
|
# @raise [Capybara::ExpectationNotMet] If the selector does not match
|
456
450
|
#
|
457
451
|
def assert_matches_selector(*args, &optional_filter_block)
|
458
|
-
|
459
|
-
|
460
|
-
result = query.resolve_for(self.query_scope)
|
461
|
-
unless result.include? self
|
462
|
-
raise Capybara::ExpectationNotMet, "Item does not match the provided selector"
|
463
|
-
end
|
452
|
+
_verify_match_result(args, optional_filter_block) do |result|
|
453
|
+
raise Capybara::ExpectationNotMet, "Item does not match the provided selector" unless result.include? self
|
464
454
|
end
|
465
|
-
return true
|
466
455
|
end
|
467
456
|
|
468
457
|
def assert_not_matches_selector(*args, &optional_filter_block)
|
469
|
-
|
470
|
-
|
471
|
-
result = query.resolve_for(self.query_scope)
|
472
|
-
if result.include? self
|
473
|
-
raise Capybara::ExpectationNotMet, 'Item matched the provided selector'
|
474
|
-
end
|
458
|
+
_verify_match_result(args, optional_filter_block) do |result|
|
459
|
+
raise Capybara::ExpectationNotMet, 'Item matched the provided selector' if result.include? self
|
475
460
|
end
|
476
|
-
return true
|
477
461
|
end
|
478
462
|
alias_method :refute_matches_selector, :assert_not_matches_selector
|
479
463
|
|
@@ -573,14 +557,11 @@ module Capybara
|
|
573
557
|
# @return [true]
|
574
558
|
#
|
575
559
|
def assert_text(*args)
|
576
|
-
|
577
|
-
synchronize(query.wait) do
|
578
|
-
count = query.resolve_for(self)
|
560
|
+
_verify_text(args) do |count, query|
|
579
561
|
unless query.matches_count?(count) && ((count > 0) || query.expects_none?)
|
580
562
|
raise Capybara::ExpectationNotMet, query.failure_message
|
581
563
|
end
|
582
564
|
end
|
583
|
-
return true
|
584
565
|
end
|
585
566
|
|
586
567
|
##
|
@@ -592,14 +573,11 @@ module Capybara
|
|
592
573
|
# @return [true]
|
593
574
|
#
|
594
575
|
def assert_no_text(*args)
|
595
|
-
|
596
|
-
synchronize(query.wait) do
|
597
|
-
count = query.resolve_for(self)
|
576
|
+
_verify_text(args) do |count, query|
|
598
577
|
if query.matches_count?(count) && ((count > 0) || query.expects_none?)
|
599
578
|
raise Capybara::ExpectationNotMet, query.negative_failure_message
|
600
579
|
end
|
601
580
|
end
|
602
|
-
return true
|
603
581
|
end
|
604
582
|
|
605
583
|
##
|
@@ -645,6 +623,35 @@ module Capybara
|
|
645
623
|
self.eql?(other) || (other.respond_to?(:base) && base == other.base)
|
646
624
|
end
|
647
625
|
|
626
|
+
private
|
627
|
+
|
628
|
+
def _verify_selector_result(query_args, optional_filter_block, &result_block)
|
629
|
+
query = Capybara::Queries::SelectorQuery.new(*query_args, &optional_filter_block)
|
630
|
+
synchronize(query.wait) do
|
631
|
+
result = query.resolve_for(self)
|
632
|
+
result_block.call(result, query)
|
633
|
+
end
|
634
|
+
return true
|
635
|
+
end
|
636
|
+
|
637
|
+
def _verify_match_result(query_args, optional_filter_block, &result_block)
|
638
|
+
query = Capybara::Queries::MatchQuery.new(*query_args, &optional_filter_block)
|
639
|
+
synchronize(query.wait) do
|
640
|
+
result = query.resolve_for(self.query_scope)
|
641
|
+
result_block.call(result)
|
642
|
+
end
|
643
|
+
return true
|
644
|
+
end
|
645
|
+
|
646
|
+
def _verify_text(query_args)
|
647
|
+
query = Capybara::Queries::TextQuery.new(*query_args)
|
648
|
+
synchronize(query.wait) do
|
649
|
+
count = query.resolve_for(self)
|
650
|
+
yield(count, query)
|
651
|
+
end
|
652
|
+
return true
|
653
|
+
end
|
654
|
+
|
648
655
|
end
|
649
656
|
end
|
650
657
|
end
|
data/lib/capybara/node/simple.rb
CHANGED
@@ -53,7 +53,9 @@ module Capybara
|
|
53
53
|
def matches_filters?(node)
|
54
54
|
if options[:text]
|
55
55
|
regexp = options[:text].is_a?(Regexp) ? options[:text] : Regexp.escape(options[:text].to_s)
|
56
|
-
|
56
|
+
text_visible = visible
|
57
|
+
text_visible = :all if text_visible == :hidden
|
58
|
+
return false if not node.text(text_visible).match(regexp)
|
57
59
|
end
|
58
60
|
|
59
61
|
case visible
|
@@ -71,7 +73,7 @@ module Capybara
|
|
71
73
|
end
|
72
74
|
end
|
73
75
|
|
74
|
-
res &&= @filter_block.call(node) unless @filter_block.nil?
|
76
|
+
res &&= Capybara.using_wait_time(0){ @filter_block.call(node)} unless @filter_block.nil?
|
75
77
|
res
|
76
78
|
end
|
77
79
|
|
@@ -152,7 +152,7 @@ private
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
155
|
-
def set_radio(
|
155
|
+
def set_radio(_value)
|
156
156
|
other_radios_xpath = XPath.generate { |x| x.anywhere(:input)[x.attr(:name).equals(self[:name])] }.to_s
|
157
157
|
driver.dom.xpath(other_radios_xpath).each { |node| node.remove_attribute("checked") }
|
158
158
|
native['checked'] = 'checked'
|
data/lib/capybara/result.rb
CHANGED
@@ -40,6 +40,8 @@ module Capybara
|
|
40
40
|
alias :index :find_index
|
41
41
|
|
42
42
|
def each(&block)
|
43
|
+
return enum_for(:each) unless block_given?
|
44
|
+
|
43
45
|
@result_cache.each(&block)
|
44
46
|
loop do
|
45
47
|
next_result = @results_enum.next
|
@@ -137,7 +139,7 @@ module Capybara
|
|
137
139
|
|
138
140
|
def lazy_select_elements(&block)
|
139
141
|
if @elements.respond_to? :lazy #Ruby 2.0+
|
140
|
-
@elements.lazy.select
|
142
|
+
@elements.lazy.select(&block)
|
141
143
|
else
|
142
144
|
Enumerator.new do |yielder|
|
143
145
|
@elements.each do |val|
|
@@ -4,6 +4,8 @@ module Capybara
|
|
4
4
|
class Matcher
|
5
5
|
include ::RSpec::Matchers::Composable if defined?(::RSpec::Expectations::Version) && (Gem::Version.new(RSpec::Expectations::Version::STRING) >= Gem::Version.new('3.0'))
|
6
6
|
|
7
|
+
attr_reader :failure_message, :failure_message_when_negated
|
8
|
+
|
7
9
|
def wrap(actual)
|
8
10
|
if actual.respond_to?("has_selector?")
|
9
11
|
actual
|
@@ -11,10 +13,29 @@ module Capybara
|
|
11
13
|
Capybara.string(actual.to_s)
|
12
14
|
end
|
13
15
|
end
|
16
|
+
|
17
|
+
# RSpec 2 compatibility:
|
18
|
+
def failure_message_for_should; failure_message end
|
19
|
+
def failure_message_for_should_not; failure_message_when_negated end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def wrap_matches?(actual)
|
24
|
+
yield(wrap(actual))
|
25
|
+
rescue Capybara::ExpectationNotMet => e
|
26
|
+
@failure_message = e.message
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
def wrap_does_not_match?(actual)
|
31
|
+
yield(wrap(actual))
|
32
|
+
rescue Capybara::ExpectationNotMet => e
|
33
|
+
@failure_message_when_negated = e.message
|
34
|
+
return false
|
35
|
+
end
|
14
36
|
end
|
15
37
|
|
16
38
|
class HaveSelector < Matcher
|
17
|
-
attr_reader :failure_message, :failure_message_when_negated
|
18
39
|
|
19
40
|
def initialize(*args, &filter_block)
|
20
41
|
@args = args
|
@@ -22,17 +43,11 @@ module Capybara
|
|
22
43
|
end
|
23
44
|
|
24
45
|
def matches?(actual)
|
25
|
-
|
26
|
-
rescue Capybara::ExpectationNotMet => e
|
27
|
-
@failure_message = e.message
|
28
|
-
return false
|
46
|
+
wrap_matches?(actual){ |el| el.assert_selector(*@args, &@filter_block) }
|
29
47
|
end
|
30
48
|
|
31
49
|
def does_not_match?(actual)
|
32
|
-
|
33
|
-
rescue Capybara::ExpectationNotMet => e
|
34
|
-
@failure_message_when_negated = e.message
|
35
|
-
return false
|
50
|
+
wrap_does_not_match?(actual){ |el| el.assert_no_selector(*@args, &@filter_block) }
|
36
51
|
end
|
37
52
|
|
38
53
|
def description
|
@@ -42,17 +57,29 @@ module Capybara
|
|
42
57
|
def query
|
43
58
|
@query ||= Capybara::Queries::SelectorQuery.new(*@args, &@filter_block)
|
44
59
|
end
|
60
|
+
end
|
45
61
|
|
46
|
-
|
47
|
-
|
48
|
-
|
62
|
+
class MatchSelector < HaveSelector
|
63
|
+
def matches?(actual)
|
64
|
+
wrap_matches?(actual) { |el| el.assert_matches_selector(*@args, &@filter_block) }
|
65
|
+
end
|
66
|
+
|
67
|
+
def does_not_match?(actual)
|
68
|
+
wrap_does_not_match?(actual) { |el| el.assert_not_matches_selector(*@args, &@filter_block) }
|
69
|
+
end
|
70
|
+
|
71
|
+
def description
|
72
|
+
"match #{query.description}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def query
|
76
|
+
@query ||= Capybara::Queries::MatchQuery.new(*@args)
|
77
|
+
end
|
49
78
|
end
|
50
79
|
|
51
80
|
class HaveText < Matcher
|
52
81
|
attr_reader :type, :content, :options
|
53
82
|
|
54
|
-
attr_reader :failure_message, :failure_message_when_negated
|
55
|
-
|
56
83
|
def initialize(*args)
|
57
84
|
@args = args.dup
|
58
85
|
|
@@ -63,17 +90,11 @@ module Capybara
|
|
63
90
|
end
|
64
91
|
|
65
92
|
def matches?(actual)
|
66
|
-
|
67
|
-
rescue Capybara::ExpectationNotMet => e
|
68
|
-
@failure_message = e.message
|
69
|
-
return false
|
93
|
+
wrap_matches?(actual) { |el| el.assert_text(*@args) }
|
70
94
|
end
|
71
95
|
|
72
96
|
def does_not_match?(actual)
|
73
|
-
|
74
|
-
rescue Capybara::ExpectationNotMet => e
|
75
|
-
@failure_message_when_negated = e.message
|
76
|
-
return false
|
97
|
+
wrap_does_not_match?(actual) { |el| el.assert_no_text(*@args) }
|
77
98
|
end
|
78
99
|
|
79
100
|
def description
|
@@ -84,17 +105,11 @@ module Capybara
|
|
84
105
|
content = Capybara::Helpers.normalize_whitespace(content) unless content.is_a? Regexp
|
85
106
|
content.inspect
|
86
107
|
end
|
87
|
-
|
88
|
-
# RSpec 2 compatibility:
|
89
|
-
alias_method :failure_message_for_should, :failure_message
|
90
|
-
alias_method :failure_message_for_should_not, :failure_message_when_negated
|
91
108
|
end
|
92
109
|
|
93
110
|
class HaveTitle < Matcher
|
94
111
|
attr_reader :title
|
95
112
|
|
96
|
-
attr_reader :failure_message, :failure_message_when_negated
|
97
|
-
|
98
113
|
def initialize(*args)
|
99
114
|
@args = args
|
100
115
|
|
@@ -103,33 +118,21 @@ module Capybara
|
|
103
118
|
end
|
104
119
|
|
105
120
|
def matches?(actual)
|
106
|
-
|
107
|
-
rescue Capybara::ExpectationNotMet => e
|
108
|
-
@failure_message = e.message
|
109
|
-
return false
|
121
|
+
wrap_matches?(actual) { |el| el.assert_title(*@args) }
|
110
122
|
end
|
111
123
|
|
112
124
|
def does_not_match?(actual)
|
113
|
-
|
114
|
-
rescue Capybara::ExpectationNotMet => e
|
115
|
-
@failure_message_when_negated = e.message
|
116
|
-
return false
|
125
|
+
wrap_does_not_match?(actual) { |el| el.assert_no_title(*@args) }
|
117
126
|
end
|
118
127
|
|
119
128
|
def description
|
120
129
|
"have title #{title.inspect}"
|
121
130
|
end
|
122
|
-
|
123
|
-
# RSpec 2 compatibility:
|
124
|
-
alias_method :failure_message_for_should, :failure_message
|
125
|
-
alias_method :failure_message_for_should_not, :failure_message_when_negated
|
126
131
|
end
|
127
132
|
|
128
133
|
class HaveCurrentPath < Matcher
|
129
134
|
attr_reader :current_path
|
130
135
|
|
131
|
-
attr_reader :failure_message, :failure_message_when_negated
|
132
|
-
|
133
136
|
def initialize(*args)
|
134
137
|
@args = args
|
135
138
|
|
@@ -138,26 +141,16 @@ module Capybara
|
|
138
141
|
end
|
139
142
|
|
140
143
|
def matches?(actual)
|
141
|
-
|
142
|
-
rescue Capybara::ExpectationNotMet => e
|
143
|
-
@failure_message = e.message
|
144
|
-
return false
|
144
|
+
wrap_matches?(actual) { |el| el.assert_current_path(*@args) }
|
145
145
|
end
|
146
146
|
|
147
147
|
def does_not_match?(actual)
|
148
|
-
|
149
|
-
rescue Capybara::ExpectationNotMet => e
|
150
|
-
@failure_message_when_negated = e.message
|
151
|
-
return false
|
148
|
+
wrap_does_not_match?(actual) { |el| el.assert_no_current_path(*@args) }
|
152
149
|
end
|
153
150
|
|
154
151
|
def description
|
155
152
|
"have current path #{current_path.inspect}"
|
156
153
|
end
|
157
|
-
|
158
|
-
# RSpec 2 compatibility:
|
159
|
-
alias_method :failure_message_for_should, :failure_message
|
160
|
-
alias_method :failure_message_for_should_not, :failure_message_when_negated
|
161
154
|
end
|
162
155
|
|
163
156
|
class BecomeClosed
|
@@ -188,46 +181,12 @@ module Capybara
|
|
188
181
|
alias_method :failure_message_for_should_not, :failure_message_when_negated
|
189
182
|
end
|
190
183
|
|
191
|
-
class MatchSelector < Matcher
|
192
|
-
attr_reader :failure_message, :failure_message_when_negated
|
193
|
-
|
194
|
-
def initialize(*args)
|
195
|
-
@args = args
|
196
|
-
end
|
197
|
-
|
198
|
-
def matches?(actual)
|
199
|
-
actual.assert_matches_selector(*@args)
|
200
|
-
rescue Capybara::ExpectationNotMet => e
|
201
|
-
@failure_message = e.message
|
202
|
-
return false
|
203
|
-
end
|
204
|
-
|
205
|
-
def does_not_match?(actual)
|
206
|
-
actual.assert_not_matches_selector(*@args)
|
207
|
-
rescue Capybara::ExpectationNotMet => e
|
208
|
-
@failure_message_when_negated = e.message
|
209
|
-
return false
|
210
|
-
end
|
211
|
-
|
212
|
-
def description
|
213
|
-
"match #{query.description}"
|
214
|
-
end
|
215
|
-
|
216
|
-
def query
|
217
|
-
@query ||= Capybara::Queries::MatchQuery.new(*@args)
|
218
|
-
end
|
219
|
-
|
220
|
-
# RSpec 2 compatibility:
|
221
|
-
alias_method :failure_message_for_should, :failure_message
|
222
|
-
alias_method :failure_message_for_should_not, :failure_message_when_negated
|
223
|
-
end
|
224
|
-
|
225
184
|
def have_selector(*args, &optional_filter_block)
|
226
185
|
HaveSelector.new(*args, &optional_filter_block)
|
227
186
|
end
|
228
187
|
|
229
|
-
def match_selector(*args)
|
230
|
-
MatchSelector.new(*args)
|
188
|
+
def match_selector(*args, &optional_filter_block)
|
189
|
+
MatchSelector.new(*args, &optional_filter_block)
|
231
190
|
end
|
232
191
|
# defined_negated_matcher was added in RSpec 3.1 - it's syntactic sugar only since a user can do
|
233
192
|
# expect(page).not_to match_selector, so not sure we really need to support not_match_selector for prior to RSpec 3.1
|
@@ -238,16 +197,16 @@ module Capybara
|
|
238
197
|
HaveSelector.new(:xpath, xpath, options, &optional_filter_block)
|
239
198
|
end
|
240
199
|
|
241
|
-
def match_xpath(xpath, options={})
|
242
|
-
MatchSelector.new(:xpath, xpath, options)
|
200
|
+
def match_xpath(xpath, options={}, &optional_filter_block)
|
201
|
+
MatchSelector.new(:xpath, xpath, options, &optional_filter_block)
|
243
202
|
end
|
244
203
|
|
245
204
|
def have_css(css, options={}, &optional_filter_block)
|
246
205
|
HaveSelector.new(:css, css, options, &optional_filter_block)
|
247
206
|
end
|
248
207
|
|
249
|
-
def match_css(css, options={})
|
250
|
-
MatchSelector.new(:css, css, options)
|
208
|
+
def match_css(css, options={}, &optional_filter_block)
|
209
|
+
MatchSelector.new(:css, css, options, &optional_filter_block)
|
251
210
|
end
|
252
211
|
|
253
212
|
def have_text(*args)
|
@@ -307,6 +266,5 @@ module Capybara
|
|
307
266
|
def become_closed(options = {})
|
308
267
|
BecomeClosed.new(options)
|
309
268
|
end
|
310
|
-
|
311
269
|
end
|
312
270
|
end
|