capybara 3.6.0 → 3.7.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 +16 -0
- data/README.md +5 -1
- data/lib/capybara.rb +2 -0
- data/lib/capybara/minitest/spec.rb +1 -1
- data/lib/capybara/node/actions.rb +34 -25
- data/lib/capybara/node/base.rb +15 -17
- data/lib/capybara/node/document_matchers.rb +1 -3
- data/lib/capybara/node/element.rb +11 -12
- data/lib/capybara/node/finders.rb +2 -1
- data/lib/capybara/node/simple.rb +13 -6
- data/lib/capybara/queries/base_query.rb +4 -4
- data/lib/capybara/queries/selector_query.rb +119 -94
- data/lib/capybara/queries/text_query.rb +2 -1
- data/lib/capybara/rack_test/form.rb +4 -4
- data/lib/capybara/rack_test/node.rb +5 -5
- data/lib/capybara/result.rb +23 -32
- data/lib/capybara/rspec/compound.rb +1 -1
- data/lib/capybara/rspec/matchers.rb +63 -61
- data/lib/capybara/selector.rb +28 -10
- data/lib/capybara/selector/css.rb +17 -17
- data/lib/capybara/selector/filter_set.rb +9 -9
- data/lib/capybara/selector/selector.rb +3 -4
- data/lib/capybara/selenium/driver.rb +73 -95
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +4 -4
- data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +9 -0
- data/lib/capybara/selenium/node.rb +127 -67
- data/lib/capybara/selenium/nodes/chrome_node.rb +3 -3
- data/lib/capybara/selenium/nodes/marionette_node.rb +14 -8
- data/lib/capybara/server.rb +2 -2
- data/lib/capybara/server/animation_disabler.rb +17 -3
- data/lib/capybara/server/middleware.rb +8 -4
- data/lib/capybara/session.rb +43 -37
- data/lib/capybara/session/config.rb +8 -6
- data/lib/capybara/spec/session/assert_text_spec.rb +14 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +7 -0
- data/lib/capybara/spec/session/check_spec.rb +21 -0
- data/lib/capybara/spec/session/choose_spec.rb +15 -1
- data/lib/capybara/spec/session/fill_in_spec.rb +7 -0
- data/lib/capybara/spec/session/find_spec.rb +2 -1
- data/lib/capybara/spec/session/has_selector_spec.rb +18 -0
- data/lib/capybara/spec/session/has_text_spec.rb +14 -0
- data/lib/capybara/spec/session/node_spec.rb +2 -1
- data/lib/capybara/spec/session/reset_session_spec.rb +4 -4
- data/lib/capybara/spec/session/text_spec.rb +2 -1
- data/lib/capybara/spec/session/title_spec.rb +2 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +8 -0
- data/lib/capybara/spec/session/within_spec.rb +2 -1
- data/lib/capybara/spec/spec_helper.rb +1 -32
- data/lib/capybara/spec/views/with_js.erb +3 -4
- data/lib/capybara/version.rb +1 -1
- data/spec/minitest_spec.rb +4 -0
- data/spec/minitest_spec_spec.rb +4 -0
- data/spec/rack_test_spec.rb +4 -4
- data/spec/rspec/shared_spec_matchers.rb +4 -2
- data/spec/selector_spec.rb +15 -1
- data/spec/selenium_spec_chrome.rb +1 -6
- data/spec/selenium_spec_chrome_remote.rb +1 -1
- data/spec/selenium_spec_firefox_remote.rb +2 -5
- data/spec/selenium_spec_ie.rb +41 -4
- data/spec/selenium_spec_marionette.rb +1 -25
- data/spec/shared_selenium_session.rb +74 -16
- data/spec/spec_helper.rb +41 -0
- metadata +2 -2
@@ -20,7 +20,7 @@ module Capybara
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
attr_reader :error
|
24
24
|
|
25
25
|
def initialize(app, server_errors, extra_middleware = [])
|
26
26
|
@app = app
|
@@ -35,6 +35,10 @@ module Capybara
|
|
35
35
|
@counter.value.positive?
|
36
36
|
end
|
37
37
|
|
38
|
+
def clear_error
|
39
|
+
@error = nil
|
40
|
+
end
|
41
|
+
|
38
42
|
def call(env)
|
39
43
|
if env['PATH_INFO'] == '/__identify__'
|
40
44
|
[200, {}, [@app.object_id.to_s]]
|
@@ -42,9 +46,9 @@ module Capybara
|
|
42
46
|
@counter.increment
|
43
47
|
begin
|
44
48
|
@extended_app.call(env)
|
45
|
-
rescue *@server_errors =>
|
46
|
-
@error ||=
|
47
|
-
raise
|
49
|
+
rescue *@server_errors => err
|
50
|
+
@error ||= err
|
51
|
+
raise err
|
48
52
|
ensure
|
49
53
|
@counter.decrement
|
50
54
|
end
|
data/lib/capybara/session.rb
CHANGED
@@ -137,7 +137,7 @@ module Capybara
|
|
137
137
|
# Raise errors encountered in the server
|
138
138
|
#
|
139
139
|
def raise_server_error!
|
140
|
-
return
|
140
|
+
return unless @server&.error
|
141
141
|
# Force an explanation for the error being raised as the exception cause
|
142
142
|
begin
|
143
143
|
if config.raise_server_errors
|
@@ -244,26 +244,19 @@ module Capybara
|
|
244
244
|
@touched = true
|
245
245
|
|
246
246
|
visit_uri = ::Addressable::URI.parse(visit_uri.to_s)
|
247
|
+
base_uri = ::Addressable::URI.parse(config.app_host || server_url)
|
247
248
|
|
248
|
-
|
249
|
-
base ||= "http#{'s' if @server.using_ssl?}://#{@server.host}:#{@server.port}" if @server
|
250
|
-
|
251
|
-
uri_base = ::Addressable::URI.parse(base)
|
252
|
-
|
253
|
-
if uri_base && [nil, 'http', 'https'].include?(visit_uri.scheme)
|
249
|
+
if base_uri && [nil, 'http', 'https'].include?(visit_uri.scheme)
|
254
250
|
if visit_uri.relative?
|
255
|
-
|
256
|
-
|
257
|
-
visit_uri_parts = visit_uri.to_hash.delete_if { |_k, v| v.nil? }
|
251
|
+
visit_uri_parts = visit_uri.to_hash.delete_if { |_k, value| value.nil? }
|
258
252
|
|
259
253
|
# Useful to people deploying to a subdirectory
|
260
254
|
# and/or single page apps where only the url fragment changes
|
261
|
-
visit_uri_parts[:path] =
|
255
|
+
visit_uri_parts[:path] = base_uri.path + visit_uri.path
|
262
256
|
|
263
|
-
visit_uri =
|
264
|
-
elsif @server && config.always_include_port
|
265
|
-
visit_uri.port ||= @server.port
|
257
|
+
visit_uri = base_uri.merge(visit_uri_parts)
|
266
258
|
end
|
259
|
+
adjust_server_port(visit_uri)
|
267
260
|
end
|
268
261
|
|
269
262
|
driver.visit(visit_uri.to_s)
|
@@ -544,8 +537,7 @@ module Capybara
|
|
544
537
|
old_handles = driver.window_handles
|
545
538
|
yield
|
546
539
|
|
547
|
-
|
548
|
-
document.synchronize(wait_time, errors: [Capybara::WindowError]) do
|
540
|
+
synchronize_windows(options) do
|
549
541
|
opened_handles = (driver.window_handles - old_handles)
|
550
542
|
if opened_handles.size != 1
|
551
543
|
raise Capybara::WindowError, 'block passed to #window_opened_by '\
|
@@ -675,8 +667,8 @@ module Capybara
|
|
675
667
|
# @return [String] the path to which the file was saved
|
676
668
|
#
|
677
669
|
def save_page(path = nil)
|
678
|
-
prepare_path(path, 'html').tap do |
|
679
|
-
File.write(
|
670
|
+
prepare_path(path, 'html').tap do |p_path|
|
671
|
+
File.write(p_path, Capybara::Helpers.inject_asset_host(body, host: config.asset_host), mode: 'wb')
|
680
672
|
end
|
681
673
|
end
|
682
674
|
|
@@ -691,7 +683,7 @@ module Capybara
|
|
691
683
|
# @param [String] path the path to where it should be saved
|
692
684
|
#
|
693
685
|
def save_and_open_page(path = nil)
|
694
|
-
save_page(path).tap { |
|
686
|
+
save_page(path).tap { |s_path| open_file(s_path) }
|
695
687
|
end
|
696
688
|
|
697
689
|
##
|
@@ -706,7 +698,7 @@ module Capybara
|
|
706
698
|
# @param [Hash] options a customizable set of options
|
707
699
|
# @return [String] the path to which the file was saved
|
708
700
|
def save_screenshot(path = nil, **options)
|
709
|
-
prepare_path(path, 'png').tap { |
|
701
|
+
prepare_path(path, 'png').tap { |p_path| driver.save_screenshot(p_path, options) }
|
710
702
|
end
|
711
703
|
|
712
704
|
##
|
@@ -722,7 +714,7 @@ module Capybara
|
|
722
714
|
#
|
723
715
|
def save_and_open_screenshot(path = nil, **options)
|
724
716
|
# rubocop:disable Lint/Debugger
|
725
|
-
save_screenshot(path, options).tap { |
|
717
|
+
save_screenshot(path, options).tap { |s_path| open_file(s_path) }
|
726
718
|
# rubocop:enable Lint/Debugger
|
727
719
|
end
|
728
720
|
|
@@ -822,7 +814,7 @@ module Capybara
|
|
822
814
|
end
|
823
815
|
|
824
816
|
def prepare_path(path, extension)
|
825
|
-
File.expand_path(path || default_fn(extension), config.save_path).tap { |
|
817
|
+
File.expand_path(path || default_fn(extension), config.save_path).tap { |p_path| FileUtils.mkdir_p(File.dirname(p_path)) }
|
826
818
|
end
|
827
819
|
|
828
820
|
def default_fn(extension)
|
@@ -837,9 +829,9 @@ module Capybara
|
|
837
829
|
def element_script_result(arg)
|
838
830
|
case arg
|
839
831
|
when Array
|
840
|
-
arg.map { |
|
832
|
+
arg.map { |subarg| element_script_result(subarg) }
|
841
833
|
when Hash
|
842
|
-
arg.each { |
|
834
|
+
arg.each { |key, value| arg[key] = element_script_result(value) }
|
843
835
|
when Capybara::Driver::Node
|
844
836
|
Capybara::Node::Element.new(self, arg, nil, nil)
|
845
837
|
else
|
@@ -847,6 +839,14 @@ module Capybara
|
|
847
839
|
end
|
848
840
|
end
|
849
841
|
|
842
|
+
def server_url
|
843
|
+
"http#{'s' if @server.using_ssl?}://#{@server.host}:#{@server.port}" if @server
|
844
|
+
end
|
845
|
+
|
846
|
+
def adjust_server_port(uri)
|
847
|
+
uri.port ||= @server.port if @server && config.always_include_port
|
848
|
+
end
|
849
|
+
|
850
850
|
def _find_frame(*args)
|
851
851
|
return find(:frame) if args.length.zero?
|
852
852
|
|
@@ -865,31 +865,37 @@ module Capybara
|
|
865
865
|
end
|
866
866
|
end
|
867
867
|
|
868
|
-
def _switch_to_window(window = nil, **options)
|
868
|
+
def _switch_to_window(window = nil, **options, &window_locator)
|
869
869
|
raise Capybara::ScopeError, 'Window cannot be switched inside a `within_frame` block' if scopes.include?(:frame)
|
870
|
-
raise Capybara::ScopeError, 'Window cannot be
|
870
|
+
raise Capybara::ScopeError, 'Window cannot be switched inside a `within` block' unless scopes.last.nil?
|
871
871
|
|
872
872
|
if window
|
873
873
|
driver.switch_to_window(window.handle)
|
874
874
|
window
|
875
875
|
else
|
876
|
-
|
877
|
-
document.synchronize(wait_time, errors: [Capybara::WindowError]) do
|
876
|
+
synchronize_windows(options) do
|
878
877
|
original_window_handle = driver.current_window_handle
|
879
878
|
begin
|
880
|
-
|
881
|
-
|
882
|
-
return Window.new(self, handle) if yield
|
883
|
-
end
|
884
|
-
rescue StandardError => e
|
879
|
+
_switch_to_window_by_locator(&window_locator)
|
880
|
+
rescue StandardError
|
885
881
|
driver.switch_to_window(original_window_handle)
|
886
|
-
raise
|
887
|
-
else
|
888
|
-
driver.switch_to_window(original_window_handle)
|
889
|
-
raise Capybara::WindowError, 'Could not find a window matching block/lambda'
|
882
|
+
raise
|
890
883
|
end
|
891
884
|
end
|
892
885
|
end
|
893
886
|
end
|
887
|
+
|
888
|
+
def _switch_to_window_by_locator
|
889
|
+
driver.window_handles.each do |handle|
|
890
|
+
driver.switch_to_window handle
|
891
|
+
return Window.new(self, handle) if yield
|
892
|
+
end
|
893
|
+
raise Capybara::WindowError, 'Could not find a window matching block/lambda'
|
894
|
+
end
|
895
|
+
|
896
|
+
def synchronize_windows(options, &block)
|
897
|
+
wait_time = Capybara::Queries::BaseQuery.wait(options, config.default_max_wait_time)
|
898
|
+
document.synchronize(wait_time, errors: [Capybara::WindowError], &block)
|
899
|
+
end
|
894
900
|
end
|
895
901
|
end
|
@@ -8,7 +8,7 @@ module Capybara
|
|
8
8
|
automatic_reload match exact exact_text raise_server_errors visible_text_only
|
9
9
|
automatic_label_click enable_aria_label save_path asset_host default_host app_host
|
10
10
|
server_host server_port server_errors default_set_options disable_animation test_id
|
11
|
-
predicates_wait].freeze
|
11
|
+
predicates_wait default_normalize_ws].freeze
|
12
12
|
|
13
13
|
attr_accessor(*OPTIONS)
|
14
14
|
|
@@ -57,6 +57,8 @@ module Capybara
|
|
57
57
|
# See {Capybara.configure}
|
58
58
|
# @!method test_id
|
59
59
|
# See {Capybara.configure}
|
60
|
+
# @!method default_normalize_ws
|
61
|
+
# See {Capybara.configure}
|
60
62
|
|
61
63
|
remove_method :server_host
|
62
64
|
|
@@ -86,9 +88,9 @@ module Capybara
|
|
86
88
|
end
|
87
89
|
|
88
90
|
remove_method :disable_animation=
|
89
|
-
def disable_animation=(
|
90
|
-
warn 'Capybara.disable_animation is a beta feature - it may change/disappear in a future point version' if
|
91
|
-
@disable_animation =
|
91
|
+
def disable_animation=(bool_or_allowlist)
|
92
|
+
warn 'Capybara.disable_animation is a beta feature - it may change/disappear in a future point version' if bool_or_allowlist
|
93
|
+
@disable_animation = bool_or_allowlist
|
92
94
|
end
|
93
95
|
|
94
96
|
remove_method :test_id=
|
@@ -111,8 +113,8 @@ module Capybara
|
|
111
113
|
end
|
112
114
|
|
113
115
|
class ReadOnlySessionConfig < SimpleDelegator
|
114
|
-
SessionConfig::OPTIONS.each do |
|
115
|
-
define_method "#{
|
116
|
+
SessionConfig::OPTIONS.each do |option|
|
117
|
+
define_method "#{option}=" do |_|
|
116
118
|
raise 'Per session settings are only supported when Capybara.threadsafe == true'
|
117
119
|
end
|
118
120
|
end
|
@@ -15,6 +15,20 @@ Capybara::SpecHelper.spec '#assert_text' do
|
|
15
15
|
expect(@session.assert_text('text with whitespace', normalize_ws: true)).to eq(true)
|
16
16
|
end
|
17
17
|
|
18
|
+
context 'with enabled default collapsing whitespace' do
|
19
|
+
before { Capybara.default_normalize_ws = true }
|
20
|
+
|
21
|
+
it 'should be true if the given unnormalized text is on the page' do
|
22
|
+
@session.visit('/with_html')
|
23
|
+
expect(@session.assert_text('text with whitespace', normalize_ws: false)).to eq(true)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should support collapsing whitespace' do
|
27
|
+
@session.visit('/with_html')
|
28
|
+
expect(@session.assert_text('text with whitespace')).to eq(true)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
18
32
|
it 'should take scopes into account' do
|
19
33
|
@session.visit('/with_html')
|
20
34
|
@session.within("//a[@title='awesome title']") do
|
@@ -22,6 +22,13 @@ Capybara::SpecHelper.spec '#attach_file' do
|
|
22
22
|
expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
|
23
23
|
end
|
24
24
|
|
25
|
+
it 'should be able to set on element if no locator passed' do
|
26
|
+
ff = @session.find(:file_field, 'Image')
|
27
|
+
ff.attach_file(with_os_path_separators(__FILE__))
|
28
|
+
@session.click_button('awesome')
|
29
|
+
expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
|
30
|
+
end
|
31
|
+
|
25
32
|
it 'casts to string' do
|
26
33
|
@session.attach_file :form_image, with_os_path_separators(__FILE__)
|
27
34
|
@session.click_button('awesome')
|
@@ -68,6 +68,13 @@ Capybara::SpecHelper.spec '#check' do
|
|
68
68
|
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
69
69
|
end
|
70
70
|
|
71
|
+
it 'should be able to check itself if no locator specified' do
|
72
|
+
cb = @session.find(:id, 'form_pets_cat')
|
73
|
+
cb.check
|
74
|
+
@session.click_button('awesome')
|
75
|
+
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
76
|
+
end
|
77
|
+
|
71
78
|
it 'casts to string' do
|
72
79
|
@session.check(:form_pets_cat)
|
73
80
|
@session.click_button('awesome')
|
@@ -142,6 +149,20 @@ Capybara::SpecHelper.spec '#check' do
|
|
142
149
|
expect(extract_results(@session)['cars']).to include('mclaren')
|
143
150
|
end
|
144
151
|
|
152
|
+
it 'should check via clicking the label with :for attribute if locator nil' do
|
153
|
+
cb = @session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)
|
154
|
+
cb.check
|
155
|
+
@session.click_button('awesome')
|
156
|
+
expect(extract_results(@session)['cars']).to include('tesla')
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should check self via clicking the wrapping label if locator nil' do
|
160
|
+
cb = @session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)
|
161
|
+
cb.check
|
162
|
+
@session.click_button('awesome')
|
163
|
+
expect(extract_results(@session)['cars']).to include('mclaren')
|
164
|
+
end
|
165
|
+
|
145
166
|
it 'should not click the label if unneeded' do
|
146
167
|
expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
|
147
168
|
@session.check('form_cars_jaguar')
|
@@ -23,6 +23,13 @@ Capybara::SpecHelper.spec '#choose' do
|
|
23
23
|
expect(extract_results(@session)['gender']).to eq('male')
|
24
24
|
end
|
25
25
|
|
26
|
+
it 'should be able to choose self when no locator string specified' do
|
27
|
+
rb = @session.find(:id, 'gender_male')
|
28
|
+
rb.choose
|
29
|
+
@session.click_button('awesome')
|
30
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
31
|
+
end
|
32
|
+
|
26
33
|
it 'casts to string' do
|
27
34
|
@session.choose('Both')
|
28
35
|
@session.click_button(:awesome)
|
@@ -82,12 +89,19 @@ Capybara::SpecHelper.spec '#choose' do
|
|
82
89
|
Capybara.automatic_label_click = old_click_label
|
83
90
|
end
|
84
91
|
|
85
|
-
it 'should select by clicking the
|
92
|
+
it 'should select by clicking the label if available' do
|
86
93
|
@session.choose('party_democrat')
|
87
94
|
@session.click_button('awesome')
|
88
95
|
expect(extract_results(@session)['party']).to eq('democrat')
|
89
96
|
end
|
90
97
|
|
98
|
+
it 'should select self by clicking the label if no locator specified' do
|
99
|
+
cb = @session.find(:id, 'party_democrat', visible: :hidden)
|
100
|
+
cb.choose
|
101
|
+
@session.click_button('awesome')
|
102
|
+
expect(extract_results(@session)['party']).to eq('democrat')
|
103
|
+
end
|
104
|
+
|
91
105
|
it 'should raise error if not allowed to click label' do
|
92
106
|
expect { @session.choose('party_democrat', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible radio button "party_democrat"')
|
93
107
|
end
|
@@ -137,6 +137,13 @@ Capybara::SpecHelper.spec '#fill_in' do
|
|
137
137
|
expect(extract_results(@session)['schmooo']).to eq('Schmooo for all')
|
138
138
|
end
|
139
139
|
|
140
|
+
it 'should be able to fill in element called on when no locator passed' do
|
141
|
+
field = @session.find(:fillable_field, 'form[password]')
|
142
|
+
field.fill_in(with: 'supasikrit')
|
143
|
+
@session.click_button('awesome')
|
144
|
+
expect(extract_results(@session)['password']).to eq('supasikrit')
|
145
|
+
end
|
146
|
+
|
140
147
|
it "should throw an exception if a hash containing 'with' is not provided" do
|
141
148
|
expect { @session.fill_in 'Name' }.to raise_error(ArgumentError, /with/)
|
142
149
|
end
|
@@ -208,11 +208,12 @@ Capybara::SpecHelper.spec '#find' do
|
|
208
208
|
context 'with css as default selector' do
|
209
209
|
before { Capybara.default_selector = :css }
|
210
210
|
|
211
|
+
after { Capybara.default_selector = :xpath }
|
212
|
+
|
211
213
|
it 'should find the first element using the given locator' do
|
212
214
|
expect(@session.find('h1').text).to eq('This is a test')
|
213
215
|
expect(@session.find("input[id='test_field']").value).to eq('monkey')
|
214
216
|
end
|
215
|
-
after { Capybara.default_selector = :xpath }
|
216
217
|
end
|
217
218
|
|
218
219
|
it 'should raise ElementNotFound with a useful default message if nothing was found' do
|
@@ -78,6 +78,24 @@ Capybara::SpecHelper.spec '#has_selector?' do
|
|
78
78
|
expect(@session).to have_selector(:css, 'p a#foo', 'extra')
|
79
79
|
end.to raise_error ArgumentError, /extra/
|
80
80
|
end
|
81
|
+
|
82
|
+
context 'with whitespace normalization' do
|
83
|
+
context 'Capybara.default_normalize_ws = false' do
|
84
|
+
it 'should support normalize_ws option' do
|
85
|
+
Capybara.default_normalize_ws = false
|
86
|
+
expect(@session).not_to have_selector(:id, 'second', text: 'text with whitespace')
|
87
|
+
expect(@session).to have_selector(:id, 'second', text: 'text with whitespace', normalize_ws: true)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'Capybara.default_normalize_ws = true' do
|
92
|
+
it 'should support normalize_ws option' do
|
93
|
+
Capybara.default_normalize_ws = true
|
94
|
+
expect(@session).to have_selector(:id, 'second', text: 'text with whitespace')
|
95
|
+
expect(@session).not_to have_selector(:id, 'second', text: 'text with whitespace', normalize_ws: false)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
81
99
|
end
|
82
100
|
|
83
101
|
context 'with exact_text' do
|
@@ -39,6 +39,20 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
39
39
|
expect(@session).to have_text('text with whitespace', normalize_ws: true)
|
40
40
|
end
|
41
41
|
|
42
|
+
context 'with enabled default collapsing whitespace' do
|
43
|
+
before { Capybara.default_normalize_ws = true }
|
44
|
+
|
45
|
+
it 'should search unnormalized text' do
|
46
|
+
@session.visit('/with_html')
|
47
|
+
expect(@session).to have_text('text with whitespace', normalize_ws: false)
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'should search whitespace collapsed text' do
|
51
|
+
@session.visit('/with_html')
|
52
|
+
expect(@session).to have_text('text with whitespace')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
42
56
|
it 'should be false if the given text is not on the page' do
|
43
57
|
@session.visit('/with_html')
|
44
58
|
expect(@session).not_to have_text('xxxxyzzz')
|
@@ -545,6 +545,8 @@ Capybara::SpecHelper.spec 'node' do
|
|
545
545
|
context 'without automatic reload' do
|
546
546
|
before { Capybara.automatic_reload = false }
|
547
547
|
|
548
|
+
after { Capybara.automatic_reload = true }
|
549
|
+
|
548
550
|
it 'should reload the current context of the node' do
|
549
551
|
@session.visit('/with_js')
|
550
552
|
node = @session.find(:css, '#reload-me')
|
@@ -574,7 +576,6 @@ Capybara::SpecHelper.spec 'node' do
|
|
574
576
|
expect(error).to be_an_invalid_element_error(@session)
|
575
577
|
end)
|
576
578
|
end
|
577
|
-
after { Capybara.automatic_reload = true }
|
578
579
|
end
|
579
580
|
|
580
581
|
context 'with automatic reload' do
|
@@ -87,6 +87,10 @@ Capybara::SpecHelper.spec '#reset_session!' do
|
|
87
87
|
Capybara.reuse_server = false
|
88
88
|
end
|
89
89
|
|
90
|
+
after do
|
91
|
+
Capybara.reuse_server = @reuse_server
|
92
|
+
end
|
93
|
+
|
90
94
|
it 'raises any standard errors caught inside the server during a second session', requires: [:server] do
|
91
95
|
Capybara.using_driver(@session.mode) do
|
92
96
|
Capybara.using_session(:another_session) do
|
@@ -100,10 +104,6 @@ Capybara::SpecHelper.spec '#reset_session!' do
|
|
100
104
|
end
|
101
105
|
end
|
102
106
|
end
|
103
|
-
|
104
|
-
after do
|
105
|
-
Capybara.reuse_server = @reuse_server
|
106
|
-
end
|
107
107
|
end
|
108
108
|
|
109
109
|
it 'raises configured errors caught inside the server', requires: [:server] do
|