capybara 3.26.0 → 3.27.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 +18 -0
- data/README.md +1 -2
- data/lib/capybara/minitest.rb +29 -29
- data/lib/capybara/node/element.rb +2 -1
- data/lib/capybara/node/matchers.rb +6 -6
- data/lib/capybara/node/simple.rb +2 -1
- data/lib/capybara/queries/ancestor_query.rb +5 -9
- data/lib/capybara/queries/selector_query.rb +2 -2
- data/lib/capybara/queries/sibling_query.rb +4 -10
- data/lib/capybara/registrations/servers.rb +4 -1
- data/lib/capybara/selector/regexp_disassembler.rb +7 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -1
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +9 -9
- data/lib/capybara/selenium/driver.rb +2 -1
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +9 -4
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +8 -6
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +9 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +41 -5
- data/lib/capybara/selenium/nodes/firefox_node.rb +16 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/spec/session/node_spec.rb +40 -3
- data/lib/capybara/spec/views/with_html.erb +10 -0
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +6 -6
- data/spec/capybara_spec.rb +28 -28
- data/spec/filter_set_spec.rb +5 -5
- data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
- data/spec/rack_test_spec.rb +9 -9
- data/spec/regexp_dissassembler_spec.rb +12 -2
- data/spec/rspec/shared_spec_matchers.rb +2 -2
- data/spec/rspec_spec.rb +1 -1
- data/spec/selector_spec.rb +15 -15
- data/spec/selenium_spec_chrome.rb +38 -0
- data/spec/selenium_spec_firefox.rb +1 -1
- data/spec/server_spec.rb +18 -18
- data/spec/session_spec.rb +4 -4
- data/spec/shared_selenium_node.rb +36 -0
- metadata +3 -2
@@ -11,7 +11,7 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
|
|
11
11
|
clear_local_storage: nil,
|
12
12
|
clear_session_storage: nil
|
13
13
|
}.freeze
|
14
|
-
SPECIAL_OPTIONS = %i[browser clear_local_storage clear_session_storage timeout].freeze
|
14
|
+
SPECIAL_OPTIONS = %i[browser clear_local_storage clear_session_storage timeout native_displayed].freeze
|
15
15
|
attr_reader :app, :options
|
16
16
|
|
17
17
|
class << self
|
@@ -19,6 +19,7 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
|
|
19
19
|
require 'selenium-webdriver'
|
20
20
|
require 'capybara/selenium/logger_suppressor'
|
21
21
|
require 'capybara/selenium/patches/atoms'
|
22
|
+
require 'capybara/selenium/patches/is_displayed'
|
22
23
|
warn "Warning: You're using an unsupported version of selenium-webdriver, please upgrade." if Gem.loaded_specs['selenium-webdriver'].version < Gem::Version.new('3.5.0')
|
23
24
|
rescue LoadError => e
|
24
25
|
raise e unless e.message.match?(/selenium-webdriver/)
|
@@ -7,6 +7,8 @@ module Capybara::Selenium::Driver::ChromeDriver
|
|
7
7
|
def self.extended(base)
|
8
8
|
bridge = base.send(:bridge)
|
9
9
|
bridge.extend Capybara::Selenium::ChromeLogs unless bridge.respond_to?(:log)
|
10
|
+
bridge.extend Capybara::Selenium::IsDisplayed unless bridge.commands(:is_element_displayed)
|
11
|
+
base.options[:native_displayed] = false if base.options[:native_displayed].nil?
|
10
12
|
end
|
11
13
|
|
12
14
|
def fullscreen_window(handle)
|
@@ -43,8 +45,8 @@ module Capybara::Selenium::Driver::ChromeDriver
|
|
43
45
|
|
44
46
|
timer = Capybara::Helpers.timer(expire_in: 10)
|
45
47
|
begin
|
46
|
-
@browser.navigate.to('about:blank')
|
47
48
|
clear_storage unless uniform_storage_clear?
|
49
|
+
@browser.navigate.to('about:blank')
|
48
50
|
wait_for_empty_page(timer)
|
49
51
|
rescue *unhandled_alert_errors
|
50
52
|
accept_unhandled_reset_alert
|
@@ -63,12 +65,15 @@ private
|
|
63
65
|
end
|
64
66
|
|
65
67
|
def clear_all_storage?
|
66
|
-
|
68
|
+
storage_clears.none? { |s| s == false }
|
67
69
|
end
|
68
70
|
|
69
71
|
def uniform_storage_clear?
|
70
|
-
|
71
|
-
|
72
|
+
storage_clears.uniq { |s| s == false }.length <= 1
|
73
|
+
end
|
74
|
+
|
75
|
+
def storage_clears
|
76
|
+
options.values_at(:clear_session_storage, :clear_local_storage)
|
72
77
|
end
|
73
78
|
|
74
79
|
def clear_storage
|
@@ -39,8 +39,8 @@ module Capybara::Selenium::Driver::EdgeDriver
|
|
39
39
|
|
40
40
|
timer = Capybara::Helpers.timer(expire_in: 10)
|
41
41
|
begin
|
42
|
-
@browser.navigate.to('about:blank')
|
43
42
|
clear_storage unless uniform_storage_clear?
|
43
|
+
@browser.navigate.to('about:blank')
|
44
44
|
wait_for_empty_page(timer)
|
45
45
|
rescue *unhandled_alert_errors
|
46
46
|
accept_unhandled_reset_alert
|
@@ -68,17 +68,19 @@ private
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def clear_all_storage?
|
71
|
-
|
71
|
+
storage_clears.none? { |s| s == false }
|
72
72
|
end
|
73
73
|
|
74
74
|
def uniform_storage_clear?
|
75
|
-
|
76
|
-
|
75
|
+
storage_clears.uniq { |s| s == false }.length <= 1
|
76
|
+
end
|
77
|
+
|
78
|
+
def storage_clears
|
79
|
+
options.values_at(:clear_session_storage, :clear_local_storage)
|
77
80
|
end
|
78
81
|
|
79
82
|
def clear_storage
|
80
|
-
#
|
81
|
-
# In W3C mode it crashes chromedriver
|
83
|
+
# Edgedriver crashes if attempt to clear storage on about:blank
|
82
84
|
url = current_url
|
83
85
|
super unless url.nil? || url.start_with?('about:')
|
84
86
|
end
|
@@ -5,18 +5,27 @@ require 'capybara/selenium/nodes/firefox_node'
|
|
5
5
|
module Capybara::Selenium::Driver::FirefoxDriver
|
6
6
|
def self.extended(driver)
|
7
7
|
driver.extend Capybara::Selenium::Driver::W3CFirefoxDriver if w3c?(driver)
|
8
|
+
bridge = driver.send(:bridge)
|
9
|
+
bridge.extend Capybara::Selenium::IsDisplayed unless bridge.commands(:is_element_displayed)
|
8
10
|
end
|
9
11
|
|
10
12
|
def self.w3c?(driver)
|
11
13
|
(defined?(Selenium::WebDriver::VERSION) && (Selenium::WebDriver::VERSION.to_f >= 4)) ||
|
12
14
|
driver.browser.capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities)
|
13
15
|
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def bridge
|
20
|
+
browser.send(:bridge)
|
21
|
+
end
|
14
22
|
end
|
15
23
|
|
16
24
|
module Capybara::Selenium::Driver::W3CFirefoxDriver
|
17
25
|
class << self
|
18
26
|
def extended(driver)
|
19
27
|
require 'capybara/selenium/patches/pause_duration_fix' if pause_broken?(driver.browser)
|
28
|
+
driver.options[:native_displayed] = false if driver.options[:native_displayed].nil?
|
20
29
|
end
|
21
30
|
|
22
31
|
def pause_broken?(sel_driver)
|
@@ -55,10 +55,22 @@ class Capybara::Selenium::ChromeNode < Capybara::Selenium::Node
|
|
55
55
|
click unless selected_or_disabled
|
56
56
|
end
|
57
57
|
|
58
|
+
def visible?
|
59
|
+
return super unless native_displayed?
|
60
|
+
|
61
|
+
begin
|
62
|
+
bridge.send(:execute, :is_element_displayed, id: native.ref)
|
63
|
+
rescue Selenium::WebDriver::Error::UnknownCommandError
|
64
|
+
# If the is_element_displayed command is unknown, no point in trying again
|
65
|
+
driver.options[:native_displayed] = false
|
66
|
+
super
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
58
70
|
private
|
59
71
|
|
60
72
|
def perform_legacy_drag(element)
|
61
|
-
return super
|
73
|
+
return super if chromedriver_fixed_actions_key_state? || !w3c? || element.obscured?
|
62
74
|
|
63
75
|
# W3C Chrome/chromedriver < 77 doesn't maintain mouse button state across actions API performs
|
64
76
|
# https://bugs.chromium.org/p/chromedriver/issues/detail?id=2981
|
@@ -78,11 +90,35 @@ private
|
|
78
90
|
|
79
91
|
def w3c?
|
80
92
|
(defined?(Selenium::WebDriver::VERSION) && (Selenium::WebDriver::VERSION.to_f >= 4)) ||
|
81
|
-
|
93
|
+
capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities)
|
94
|
+
end
|
95
|
+
|
96
|
+
def browser_version(to_float = true)
|
97
|
+
caps = capabilities
|
98
|
+
ver = (caps[:browser_version] || caps[:version])
|
99
|
+
ver = ver.to_f if to_float
|
100
|
+
ver
|
101
|
+
end
|
102
|
+
|
103
|
+
def chromedriver_fixed_actions_key_state?
|
104
|
+
Gem::Version.new(chromedriver_version) >= Gem::Version.new('76.0.3809.68')
|
105
|
+
end
|
106
|
+
|
107
|
+
def chromedriver_supports_displayed_endpoint?
|
108
|
+
Gem::Version.new(chromedriver_version) >= Gem::Version.new('76.0.3809.25')
|
109
|
+
end
|
110
|
+
|
111
|
+
def chromedriver_version
|
112
|
+
capabilities['chrome']['chromedriverVersion'].split(' ')[0]
|
113
|
+
end
|
114
|
+
|
115
|
+
def capabilities
|
116
|
+
driver.browser.capabilities
|
82
117
|
end
|
83
118
|
|
84
|
-
def
|
85
|
-
|
86
|
-
|
119
|
+
def native_displayed?
|
120
|
+
(driver.options[:native_displayed] != false) &&
|
121
|
+
(w3c? && chromedriver_supports_displayed_endpoint?) &&
|
122
|
+
(!ENV['DISABLE_CAPYBARA_SELENIUM_OPTIMIZATIONS'])
|
87
123
|
end
|
88
124
|
end
|
@@ -65,8 +65,24 @@ class Capybara::Selenium::FirefoxNode < Capybara::Selenium::Node
|
|
65
65
|
click unless selected_or_disabled
|
66
66
|
end
|
67
67
|
|
68
|
+
def visible?
|
69
|
+
return super unless native_displayed?
|
70
|
+
|
71
|
+
begin
|
72
|
+
bridge.send(:execute, :is_element_displayed, id: native.ref)
|
73
|
+
rescue Selenium::WebDriver::Error::UnknownCommandError
|
74
|
+
# If the is_element_displayed command is unknown, no point in trying again
|
75
|
+
driver.options[:native_displayed] = false
|
76
|
+
super
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
68
80
|
private
|
69
81
|
|
82
|
+
def native_displayed?
|
83
|
+
(driver.options[:native_displayed] != false) && !ENV['DISABLE_CAPYBARA_SELENIUM_OPTIMIZATIONS']
|
84
|
+
end
|
85
|
+
|
70
86
|
def click_with_options(click_options)
|
71
87
|
# Firefox/marionette has an issue clicking with offset near viewport edge
|
72
88
|
# scroll element to middle just in case
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module Selenium
|
5
|
+
module IsDisplayed
|
6
|
+
def commands(command)
|
7
|
+
case command
|
8
|
+
when :is_element_displayed
|
9
|
+
[:get, 'session/:session_id/element/:id/displayed']
|
10
|
+
else
|
11
|
+
super
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -233,8 +233,9 @@ Capybara::SpecHelper.spec 'node' do
|
|
233
233
|
end
|
234
234
|
|
235
235
|
describe '#visible?' do
|
236
|
+
before { Capybara.ignore_hidden_elements = false }
|
237
|
+
|
236
238
|
it 'should extract node visibility' do
|
237
|
-
Capybara.ignore_hidden_elements = false
|
238
239
|
expect(@session.first('//a')).to be_visible
|
239
240
|
|
240
241
|
expect(@session.find('//div[@id="hidden"]')).not_to be_visible
|
@@ -245,15 +246,29 @@ Capybara::SpecHelper.spec 'node' do
|
|
245
246
|
end
|
246
247
|
|
247
248
|
it 'template elements should not be visible' do
|
248
|
-
Capybara.ignore_hidden_elements = false
|
249
249
|
expect(@session.find('//template')).not_to be_visible
|
250
250
|
end
|
251
251
|
|
252
252
|
it 'should be boolean' do
|
253
|
-
Capybara.ignore_hidden_elements = false
|
254
253
|
expect(@session.first('//a').visible?).to be true
|
255
254
|
expect(@session.find('//div[@id="hidden"]').visible?).to be false
|
256
255
|
end
|
256
|
+
|
257
|
+
it 'details > summary elements and descendants should be visible' do
|
258
|
+
expect(@session.find(:css, 'details summary')).to be_visible
|
259
|
+
expect(@session.find(:css, 'details summary h6')).to be_visible
|
260
|
+
end
|
261
|
+
|
262
|
+
it 'details non-summary descendants should be non-visible' do
|
263
|
+
@session.first(:css, 'details li').visible?
|
264
|
+
descendants = @session.all(:css, 'details > *:not(summary), details > *:not(summary) *', minimum: 2)
|
265
|
+
expect(descendants).not_to include(be_visible)
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'sees open details as visible', requires: [:js] do
|
269
|
+
@session.find(:css, 'details').click
|
270
|
+
expect(@session.all(:css, 'details *')).to all(be_visible)
|
271
|
+
end
|
257
272
|
end
|
258
273
|
|
259
274
|
describe '#obscured?', requires: [:css] do
|
@@ -987,6 +1002,28 @@ Capybara::SpecHelper.spec 'node' do
|
|
987
1002
|
end
|
988
1003
|
|
989
1004
|
describe '#reload', requires: [:js] do
|
1005
|
+
it 'should reload elements found via ancestor with CSS' do
|
1006
|
+
@session.visit('/with_js')
|
1007
|
+
node = @session.find(:css, '#reload-me em').ancestor(:css, 'div')
|
1008
|
+
node.reload
|
1009
|
+
expect(node[:id]).to eq 'reload-me'
|
1010
|
+
end
|
1011
|
+
|
1012
|
+
it 'should reload elements found via ancestor with XPath' do
|
1013
|
+
@session.visit('/with_js')
|
1014
|
+
node = @session.find(:css, '#reload-me em').ancestor(:xpath, './/div')
|
1015
|
+
node.reload
|
1016
|
+
expect(node[:id]).to eq 'reload-me'
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
it 'should reload elements found via sibling' do
|
1020
|
+
@session.visit('/with_js')
|
1021
|
+
node = @session.find(:css, '#the-list li', text: 'Item 1').sibling(:css, 'li')
|
1022
|
+
expect(node.text).to eq 'Item 2'
|
1023
|
+
node.reload
|
1024
|
+
expect(node.text).to eq 'Item 2'
|
1025
|
+
end
|
1026
|
+
|
990
1027
|
context 'without automatic reload' do
|
991
1028
|
before { Capybara.automatic_reload = false }
|
992
1029
|
|
@@ -181,6 +181,16 @@ banana
|
|
181
181
|
                   
|
182
182
|
</div>
|
183
183
|
|
184
|
+
<details>
|
185
|
+
<summary>
|
186
|
+
<h6>Something</h6>
|
187
|
+
</summary>
|
188
|
+
<ul>
|
189
|
+
<li>Random</li>
|
190
|
+
<li>Things</li>
|
191
|
+
</ul>
|
192
|
+
</details>
|
193
|
+
|
184
194
|
<template id="template">
|
185
195
|
<input />
|
186
196
|
</template>
|
data/lib/capybara/version.rb
CHANGED
data/spec/basic_node_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require 'spec_helper'
|
|
5
5
|
RSpec.describe Capybara do
|
6
6
|
describe '.string' do
|
7
7
|
let :string do
|
8
|
-
|
8
|
+
described_class.string <<-STRING
|
9
9
|
<html>
|
10
10
|
<head>
|
11
11
|
<title>simple_node</title>
|
@@ -52,7 +52,7 @@ RSpec.describe Capybara do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
it 'allows using custom matchers' do
|
55
|
-
|
55
|
+
described_class.add_selector :lifeform do
|
56
56
|
xpath { |name| ".//option[contains(.,'#{name}')]" }
|
57
57
|
end
|
58
58
|
expect(string).to have_selector(:id, 'page')
|
@@ -62,7 +62,7 @@ RSpec.describe Capybara do
|
|
62
62
|
end
|
63
63
|
|
64
64
|
it 'allows custom matcher using css' do
|
65
|
-
|
65
|
+
described_class.add_selector :section do
|
66
66
|
css { |css_class| "section .#{css_class}" }
|
67
67
|
end
|
68
68
|
expect(string).to have_selector(:section, 'subsection')
|
@@ -112,13 +112,13 @@ RSpec.describe Capybara do
|
|
112
112
|
|
113
113
|
it 'drops illegal fragments when using gumbo' do
|
114
114
|
skip 'libxml is less strict than Gumbo' unless Nokogiri.respond_to?(:HTML5)
|
115
|
-
expect(
|
115
|
+
expect(described_class.string('<td>1</td>')).not_to have_css('td')
|
116
116
|
end
|
117
117
|
|
118
118
|
it 'can disable use of gumbo' do
|
119
119
|
skip "Test doesn't make sense unlesss nokogumbo is loaded" unless Nokogiri.respond_to?(:HTML5)
|
120
|
-
|
121
|
-
expect(
|
120
|
+
described_class.allow_gumbo = false
|
121
|
+
expect(described_class.string('<td>1</td>')).to have_css('td')
|
122
122
|
end
|
123
123
|
|
124
124
|
describe '#title' do
|
data/spec/capybara_spec.rb
CHANGED
@@ -4,20 +4,20 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
RSpec.describe Capybara do
|
6
6
|
describe 'default_max_wait_time' do
|
7
|
-
before { @previous_default_time =
|
7
|
+
before { @previous_default_time = described_class.default_max_wait_time }
|
8
8
|
|
9
|
-
after {
|
9
|
+
after { described_class.default_max_wait_time = @previous_default_time } # rubocop:disable RSpec/InstanceVariable
|
10
10
|
|
11
11
|
it 'should be changeable' do
|
12
|
-
expect(
|
13
|
-
|
14
|
-
expect(
|
12
|
+
expect(described_class.default_max_wait_time).not_to eq(5)
|
13
|
+
described_class.default_max_wait_time = 5
|
14
|
+
expect(described_class.default_max_wait_time).to eq(5)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
describe '.register_driver' do
|
19
19
|
it 'should add a new driver' do
|
20
|
-
|
20
|
+
described_class.register_driver :schmoo do |app|
|
21
21
|
Capybara::RackTest::Driver.new(app)
|
22
22
|
end
|
23
23
|
session = Capybara::Session.new(:schmoo, TestApp)
|
@@ -28,85 +28,85 @@ RSpec.describe Capybara do
|
|
28
28
|
|
29
29
|
describe '.register_server' do
|
30
30
|
it 'should add a new server' do
|
31
|
-
|
31
|
+
described_class.register_server :blob do |_app, _port, _host|
|
32
32
|
# do nothing
|
33
33
|
end
|
34
34
|
|
35
|
-
expect(
|
35
|
+
expect(described_class.servers).to have_key(:blob)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
39
|
describe '.server' do
|
40
40
|
after do
|
41
|
-
|
41
|
+
described_class.server = :default
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'should default to a proc that calls run_default_server' do
|
45
45
|
mock_app = Object.new
|
46
|
-
allow(
|
47
|
-
|
48
|
-
expect(
|
46
|
+
allow(described_class).to receive(:run_default_server).and_return(true)
|
47
|
+
described_class.server.call(mock_app, 8000)
|
48
|
+
expect(described_class).to have_received(:run_default_server).with(mock_app, 8000)
|
49
49
|
end
|
50
50
|
|
51
51
|
it 'should return a custom server proc' do
|
52
52
|
server = ->(_app, _port) {}
|
53
|
-
|
54
|
-
|
55
|
-
expect(
|
53
|
+
described_class.register_server :custom, &server
|
54
|
+
described_class.server = :custom
|
55
|
+
expect(described_class.server).to eq(server)
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'should have :webrick registered' do
|
59
|
-
expect(
|
59
|
+
expect(described_class.servers[:webrick]).not_to be_nil
|
60
60
|
end
|
61
61
|
|
62
62
|
it 'should have :puma registered' do
|
63
|
-
expect(
|
63
|
+
expect(described_class.servers[:puma]).not_to be_nil
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
67
|
describe 'server=' do
|
68
68
|
after do
|
69
|
-
|
69
|
+
described_class.server = :default
|
70
70
|
end
|
71
71
|
|
72
72
|
it 'accepts a proc' do
|
73
73
|
server = ->(_app, _port) {}
|
74
|
-
|
75
|
-
expect(
|
74
|
+
described_class.server = server
|
75
|
+
expect(described_class.server).to eq server
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
79
|
describe 'app_host' do
|
80
80
|
after do
|
81
|
-
|
81
|
+
described_class.app_host = nil
|
82
82
|
end
|
83
83
|
|
84
84
|
it 'should warn if not a valid URL' do
|
85
|
-
expect {
|
85
|
+
expect { described_class.app_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.app_host should be set to a url/)
|
86
86
|
end
|
87
87
|
|
88
88
|
it 'should not warn if a valid URL' do
|
89
|
-
expect {
|
89
|
+
expect { described_class.app_host = 'http://www.example.com' }.not_to raise_error
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'should not warn if nil' do
|
93
|
-
expect {
|
93
|
+
expect { described_class.app_host = nil }.not_to raise_error
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
97
|
describe 'default_host' do
|
98
98
|
around do |test|
|
99
|
-
old_default =
|
99
|
+
old_default = described_class.default_host
|
100
100
|
test.run
|
101
|
-
|
101
|
+
described_class.default_host = old_default
|
102
102
|
end
|
103
103
|
|
104
104
|
it 'should raise if not a valid URL' do
|
105
|
-
expect {
|
105
|
+
expect { described_class.default_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.default_host should be set to a url/)
|
106
106
|
end
|
107
107
|
|
108
108
|
it 'should not warn if a valid URL' do
|
109
|
-
expect {
|
109
|
+
expect { described_class.default_host = 'http://www.example.com' }.not_to raise_error
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|