capybara 3.17.0 → 3.18.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 +11 -0
- data/README.md +1 -1
- data/lib/capybara/queries/current_path_query.rb +1 -1
- data/lib/capybara/queries/selector_query.rb +13 -3
- data/lib/capybara/queries/title_query.rb +1 -1
- data/lib/capybara/selector.rb +1 -1
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +7 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +9 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +3 -1
- data/lib/capybara/spec/session/assert_current_path_spec.rb +5 -2
- data/lib/capybara/spec/session/find_spec.rb +4 -5
- data/lib/capybara/spec/session/has_current_path_spec.rb +4 -2
- data/lib/capybara/spec/session/matches_style_spec.rb +2 -2
- data/lib/capybara/spec/session/select_spec.rb +2 -2
- data/lib/capybara/version.rb +1 -1
- data/spec/rack_test_spec.rb +3 -3
- data/spec/result_spec.rb +0 -19
- data/spec/selenium_spec_chrome.rb +3 -1
- data/spec/selenium_spec_edge.rb +1 -1
- data/spec/selenium_spec_firefox.rb +1 -1
- data/spec/selenium_spec_ie.rb +8 -2
- data/spec/selenium_spec_safari.rb +6 -2
- data/spec/spec_helper.rb +13 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3cb32760328428839877de78f879a68af52098b0d1540c1d0de102acce58bc4b
|
4
|
+
data.tar.gz: b2c40ed521b21b43b4a44e1fe91f38b704e6c85e04829673fcc4493ff8fd217a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69163470d9db2ce8831cad207bbc14aa286181357ac650b909f266fde4e50e2400a851f1451fb0091d54f859f8e270cfe267afbfc8d76b74b6e46f4a2cca21b9
|
7
|
+
data.tar.gz: 48b79d23c6c3c87e9bdcbfd2128a15b475b001699b3b15b79f208772d2dfbc8444f442267ece4d331be25b7489f6c39c869c4edcc017f4d03629d79b09dbbe57
|
data/History.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# Version 3.18.0
|
2
|
+
Release date: 2019-04-22
|
3
|
+
|
4
|
+
### Added
|
5
|
+
|
6
|
+
* XPath Selector query optimized to make use of Regexp :text option in initial element find
|
7
|
+
|
8
|
+
### Fixed
|
9
|
+
|
10
|
+
* Workaround issue where Chrome/chromedriver 74 can return the wrong error type when a click is intercepted
|
11
|
+
|
1
12
|
# Version 3.17.0
|
2
13
|
Release date: 2019-04-18
|
3
14
|
|
data/README.md
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
[](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
7
7
|
[](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
|
8
8
|
|
9
|
-
**Note** You are viewing the README for the 3.
|
9
|
+
**Note** You are viewing the README for the 3.18.x version of Capybara.
|
10
10
|
|
11
11
|
|
12
12
|
Capybara helps you test web applications by simulating how a real user would
|
@@ -22,7 +22,7 @@ module Capybara
|
|
22
22
|
@actual_path = options[:url] ? uri&.to_s : uri&.request_uri
|
23
23
|
|
24
24
|
if @expected_path.is_a? Regexp
|
25
|
-
@actual_path.to_s.match(@expected_path)
|
25
|
+
@actual_path.to_s.match?(@expected_path)
|
26
26
|
else
|
27
27
|
::Addressable::URI.parse(@expected_path) == ::Addressable::URI.parse(@actual_path)
|
28
28
|
end
|
@@ -148,12 +148,22 @@ module Capybara
|
|
148
148
|
end
|
149
149
|
|
150
150
|
def xpath_text_conditions
|
151
|
-
(options[:text] || options[:exact_text])
|
151
|
+
text = (options[:text] || options[:exact_text])
|
152
|
+
case text
|
153
|
+
when String
|
154
|
+
text.split.map { |txt| XPath.contains(txt) }.reduce(&:&)
|
155
|
+
when Regexp
|
156
|
+
condition = XPath.current
|
157
|
+
condition = condition.uppercase if text.casefold?
|
158
|
+
Selector::RegexpDisassembler.new(text).alternated_substrings.map do |strs|
|
159
|
+
strs.flat_map(&:split).map { |str| condition.contains(str) }.reduce(:&)
|
160
|
+
end.reduce(:|)
|
161
|
+
end
|
152
162
|
end
|
153
163
|
|
154
164
|
def try_text_match_in_expression?
|
155
165
|
first_try? &&
|
156
|
-
(options[:text] || options[:exact_text])
|
166
|
+
(options[:text] || options[:exact_text]) &&
|
157
167
|
@resolved_node&.respond_to?(:session) &&
|
158
168
|
@resolved_node.session.driver.wait?
|
159
169
|
end
|
@@ -436,7 +446,7 @@ module Capybara
|
|
436
446
|
def matches_text_regexp?(node, regexp)
|
437
447
|
text_visible = visible
|
438
448
|
text_visible = :all if text_visible == :hidden
|
439
|
-
|
449
|
+
node.text(text_visible, normalize_ws: normalize_ws).match?(regexp)
|
440
450
|
end
|
441
451
|
|
442
452
|
def default_visibility
|
data/lib/capybara/selector.rb
CHANGED
@@ -120,7 +120,7 @@ Capybara.add_selector(:link, locator_type: [String, Symbol]) do
|
|
120
120
|
|
121
121
|
node_filter(:href) do |node, href|
|
122
122
|
# If not a Regexp it's been handled in the main XPath
|
123
|
-
(href.is_a?(Regexp) ? node[:href].match(href) : true).tap do |res|
|
123
|
+
(href.is_a?(Regexp) ? node[:href].match?(href) : true).tap do |res|
|
124
124
|
add_error "Expected href to match #{href.inspect} but it was #{node[:href].inspect}" unless res
|
125
125
|
end
|
126
126
|
end
|
@@ -38,6 +38,13 @@ module Capybara::Selenium::Driver::ChromeDriver
|
|
38
38
|
|
39
39
|
private
|
40
40
|
|
41
|
+
def clear_storage
|
42
|
+
# Chrome errors if attempt to clear storage on about:blank
|
43
|
+
# In W3C mode it crashes chromedriver
|
44
|
+
url = current_url
|
45
|
+
super unless url.nil? || url.start_with?('about:')
|
46
|
+
end
|
47
|
+
|
41
48
|
def delete_all_cookies
|
42
49
|
execute_cdp('Network.clearBrowserCookies')
|
43
50
|
rescue *cdp_unsupported_errors
|
@@ -26,6 +26,15 @@ class Capybara::Selenium::ChromeNode < Capybara::Selenium::Node
|
|
26
26
|
html5_drag_to(element)
|
27
27
|
end
|
28
28
|
|
29
|
+
def click(*)
|
30
|
+
super
|
31
|
+
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
32
|
+
# chromedriver 74 (at least on mac) raises the wrong error for this
|
33
|
+
raise ::Selenium::WebDriver::Error::ElementClickInterceptedError, e.message if e.message.match?(/element click intercepted/)
|
34
|
+
|
35
|
+
raise
|
36
|
+
end
|
37
|
+
|
29
38
|
private
|
30
39
|
|
31
40
|
def file_errors
|
@@ -40,10 +40,12 @@ class Capybara::Selenium::SafariNode < Capybara::Selenium::Node
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def disabled?
|
43
|
-
return true if super
|
43
|
+
return true if super
|
44
44
|
|
45
45
|
# workaround for safaridriver reporting elements as enabled when they are nested in disabling elements
|
46
46
|
if %w[option optgroup].include? tag_name
|
47
|
+
return true if self[:disabled] == 'true'
|
48
|
+
|
47
49
|
find_xpath('parent::*[self::optgroup or self::select]')[0].disabled?
|
48
50
|
else
|
49
51
|
!find_xpath(DISABLED_BY_FIELDSET_XPATH).empty?
|
@@ -37,7 +37,9 @@ Capybara::SpecHelper.spec '#assert_current_path' do
|
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'should not cause an exception when current_url is nil' do
|
40
|
-
|
40
|
+
allow(@session).to receive(:current_url).and_return(nil)
|
41
|
+
allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
|
42
|
+
|
41
43
|
expect { @session.assert_current_path(nil) }.not_to raise_error
|
42
44
|
end
|
43
45
|
end
|
@@ -65,7 +67,8 @@ Capybara::SpecHelper.spec '#assert_no_current_path?' do
|
|
65
67
|
end
|
66
68
|
|
67
69
|
it 'should not cause an exception when current_url is nil' do
|
68
|
-
|
70
|
+
allow(@session).to receive(:current_url).and_return(nil)
|
71
|
+
allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
|
69
72
|
|
70
73
|
expect { @session.assert_no_current_path('/with_html') }.not_to raise_error
|
71
74
|
end
|
@@ -107,8 +107,8 @@ Capybara::SpecHelper.spec '#find' do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
it 'should warn if passed a non-valid locator type' do
|
110
|
-
|
111
|
-
|
110
|
+
expect { @session.find(:xpath, 123) }.to raise_error(Exception) # The exact error is not yet well defined
|
111
|
+
.and output(/must respond to to_xpath or be an instance of String/).to_stderr
|
112
112
|
end
|
113
113
|
end
|
114
114
|
|
@@ -263,9 +263,8 @@ Capybara::SpecHelper.spec '#find' do
|
|
263
263
|
end
|
264
264
|
|
265
265
|
it 'warns when the option has no effect' do
|
266
|
-
|
267
|
-
|
268
|
-
@session.find(:css, '#test_field', exact: true)
|
266
|
+
expect { @session.find(:css, '#test_field', exact: true) }.to \
|
267
|
+
output(/^The :exact option only has an effect on queries using the XPath#is method. Using it with the query "#test_field" has no effect/).to_stderr
|
269
268
|
end
|
270
269
|
end
|
271
270
|
|
@@ -81,7 +81,8 @@ Capybara::SpecHelper.spec '#has_current_path?' do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it 'should not raise an exception if the current_url is nil' do
|
84
|
-
|
84
|
+
allow(@session).to receive(:current_url).and_return(nil)
|
85
|
+
allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
|
85
86
|
|
86
87
|
# Without ignore_query option
|
87
88
|
expect do
|
@@ -121,7 +122,8 @@ Capybara::SpecHelper.spec '#has_no_current_path?' do
|
|
121
122
|
end
|
122
123
|
|
123
124
|
it 'should not raise an exception if the current_url is nil' do
|
124
|
-
|
125
|
+
allow(@session).to receive(:current_url).and_return(nil)
|
126
|
+
allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
|
125
127
|
|
126
128
|
# Without ignore_query option
|
127
129
|
expect do
|
@@ -24,8 +24,8 @@ Capybara::SpecHelper.spec '#matches_style?', requires: [:css] do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'deprecated has_style?' do
|
27
|
-
|
28
|
-
|
27
|
+
expect { have_style(display: /^bl/) }.to \
|
28
|
+
output(/have_style is deprecated/).to_stderr
|
29
29
|
|
30
30
|
el = @session.find(:css, '#first')
|
31
31
|
allow(el).to receive(:warn).and_return(nil)
|
@@ -143,8 +143,8 @@ Capybara::SpecHelper.spec '#select' do
|
|
143
143
|
end
|
144
144
|
|
145
145
|
it 'should warn' do
|
146
|
-
|
147
|
-
|
146
|
+
expect { @session.select('Other', from: 'form_title') }.to \
|
147
|
+
output(/^Attempt to select disabled option: Other/).to_stderr
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
data/lib/capybara/version.rb
CHANGED
data/spec/rack_test_spec.rb
CHANGED
@@ -80,11 +80,11 @@ RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
|
80
80
|
|
81
81
|
describe '#fill_in' do
|
82
82
|
it 'should warn that :fill_options are not supported' do
|
83
|
-
allow_any_instance_of(Capybara::RackTest::Node).to receive(:warn)
|
84
83
|
session.visit '/with_html'
|
85
|
-
|
84
|
+
|
85
|
+
expect { session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true } }.to \
|
86
|
+
output(/^Options passed to Node#set but the RackTest driver doesn't support any - ignoring/).to_stderr
|
86
87
|
expect(session).to have_field('test_field', with: 'not_monkey')
|
87
|
-
expect(field.base).to have_received(:warn).with("Options passed to Node#set but the RackTest driver doesn't support any - ignoring")
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
data/spec/result_spec.rb
CHANGED
@@ -85,25 +85,6 @@ RSpec.describe Capybara::Result do
|
|
85
85
|
expect(result.size).to eq 1
|
86
86
|
end
|
87
87
|
|
88
|
-
it 'should catch invalid element errors during filtering' do
|
89
|
-
allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
|
90
|
-
allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(
|
91
|
-
instance_double('Capybara::Session', driver: instance_double('Capybara::Driver::Base', invalid_element_errors: [StandardError], wait?: false))
|
92
|
-
)
|
93
|
-
result = string.all('//li', text: 'Alpha')
|
94
|
-
expect(result.size).to eq 0
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'should return non-invalid element errors during filtering' do
|
98
|
-
allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
|
99
|
-
allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(
|
100
|
-
instance_double('Capybara::Session', driver: instance_double('Capybara::Driver::Base', invalid_element_errors: [ArgumentError], wait?: false))
|
101
|
-
)
|
102
|
-
expect do
|
103
|
-
string.all('//li', text: 'Alpha').to_a
|
104
|
-
end.to raise_error(StandardError)
|
105
|
-
end
|
106
|
-
|
107
88
|
# Not a great test but it indirectly tests what is needed
|
108
89
|
it 'should evaluate filters lazily for idx' do
|
109
90
|
skip 'JRuby has an issue with lazy enumerator evaluation' if jruby_lazy_enumerator_workaround?
|
@@ -7,6 +7,8 @@ require 'rspec/shared_spec_matchers'
|
|
7
7
|
|
8
8
|
CHROME_DRIVER = :selenium_chrome
|
9
9
|
|
10
|
+
Selenium::WebDriver::Chrome.path = '/usr/bin/google-chrome-beta' if ENV['CI'] && ENV['W3C']
|
11
|
+
|
10
12
|
browser_options = ::Selenium::WebDriver::Chrome::Options.new
|
11
13
|
browser_options.headless! if ENV['HEADLESS']
|
12
14
|
browser_options.add_option(:w3c, !!ENV['W3C'])
|
@@ -31,7 +33,7 @@ end
|
|
31
33
|
|
32
34
|
skipped_tests = %i[response_headers status_code trigger]
|
33
35
|
|
34
|
-
|
36
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Chrome) if ENV['CI']
|
35
37
|
|
36
38
|
Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_DRIVER.to_s, capybara_skip: skipped_tests do |example|
|
37
39
|
case example.metadata[:full_description]
|
data/spec/selenium_spec_edge.rb
CHANGED
@@ -16,7 +16,7 @@ end
|
|
16
16
|
|
17
17
|
skipped_tests = %i[response_headers status_code trigger modals]
|
18
18
|
|
19
|
-
|
19
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Edge) if ENV['CI']
|
20
20
|
|
21
21
|
Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, 'selenium', capybara_skip: skipped_tests do |example|
|
22
22
|
case example.metadata[:description]
|
@@ -43,7 +43,7 @@ end
|
|
43
43
|
|
44
44
|
skipped_tests = %i[response_headers status_code trigger]
|
45
45
|
|
46
|
-
|
46
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Firefox) if ENV['CI']
|
47
47
|
|
48
48
|
Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capybara_skip: skipped_tests do |example|
|
49
49
|
case example.metadata[:full_description]
|
data/spec/selenium_spec_ie.rb
CHANGED
@@ -5,7 +5,13 @@ require 'selenium-webdriver'
|
|
5
5
|
require 'shared_selenium_session'
|
6
6
|
require 'rspec/shared_spec_matchers'
|
7
7
|
|
8
|
-
|
8
|
+
if ENV['CI']
|
9
|
+
if ::Selenium::WebDriver::Service.respond_to? :driver_path=
|
10
|
+
::Selenium::WebDriver::IE::Service
|
11
|
+
else
|
12
|
+
::Selenium::WebDriver::IE
|
13
|
+
end.driver_path = 'C:\Tools\WebDriver\IEDriverServer.exe'
|
14
|
+
end
|
9
15
|
|
10
16
|
def selenium_host
|
11
17
|
ENV.fetch('SELENIUM_HOST', '192.168.56.102')
|
@@ -58,7 +64,7 @@ TestSessions::SeleniumIE.current_window.resize_to(800, 500)
|
|
58
64
|
|
59
65
|
skipped_tests = %i[response_headers status_code trigger modals hover form_attribute windows]
|
60
66
|
|
61
|
-
|
67
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::IE) if ENV['CI']
|
62
68
|
|
63
69
|
TestSessions::SeleniumIE.current_window.resize_to(1600, 1200)
|
64
70
|
|
@@ -7,7 +7,11 @@ require 'rspec/shared_spec_matchers'
|
|
7
7
|
|
8
8
|
SAFARI_DRIVER = :selenium_safari
|
9
9
|
|
10
|
-
::Selenium::WebDriver::
|
10
|
+
if ::Selenium::WebDriver::Service.respond_to? :driver_path=
|
11
|
+
::Selenium::WebDriver::Safari::Service
|
12
|
+
else
|
13
|
+
::Selenium::WebDriver::Safari
|
14
|
+
end.driver_path = '/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver'
|
11
15
|
|
12
16
|
browser_options = ::Selenium::WebDriver::Safari::Options.new
|
13
17
|
# browser_options.headless! if ENV['HEADLESS']
|
@@ -33,7 +37,7 @@ end
|
|
33
37
|
|
34
38
|
skipped_tests = %i[response_headers status_code trigger windows drag]
|
35
39
|
|
36
|
-
|
40
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Safari) if ENV['CI']
|
37
41
|
|
38
42
|
Capybara::SpecHelper.run_specs TestSessions::Safari, SAFARI_DRIVER.to_s, capybara_skip: skipped_tests do |example|
|
39
43
|
case example.metadata[:full_description]
|
data/spec/spec_helper.rb
CHANGED
@@ -52,11 +52,24 @@ module Capybara
|
|
52
52
|
def remote?(session)
|
53
53
|
session.driver.browser.is_a? ::Selenium::WebDriver::Remote::Driver
|
54
54
|
end
|
55
|
+
|
56
|
+
def self.log_selenium_driver_version(mod)
|
57
|
+
mod = mod::Service if ::Selenium::WebDriver::Service.respond_to? :driver_path
|
58
|
+
path = mod.driver_path
|
59
|
+
path = path.call if path.respond_to? :call
|
60
|
+
$stdout.puts `#{path} --version`
|
61
|
+
end
|
55
62
|
end
|
56
63
|
end
|
57
64
|
|
58
65
|
RSpec.configure do |config|
|
59
66
|
Capybara::SpecHelper.configure(config)
|
67
|
+
config.expect_with :rspec do |expectations|
|
68
|
+
expectations.syntax = :expect
|
69
|
+
end
|
70
|
+
config.mock_with :rspec do |mocks|
|
71
|
+
mocks.verify_partial_doubles = true
|
72
|
+
end
|
60
73
|
config.filter_run_including focus_: true unless ENV['CI']
|
61
74
|
config.run_all_when_everything_filtered = true
|
62
75
|
config.after(:suite) { SeleniumStatistics.print_results }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.18.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Walpole
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain:
|
12
12
|
- gem-public_cert.pem
|
13
|
-
date: 2019-04-
|
13
|
+
date: 2019-04-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -334,6 +334,20 @@ dependencies:
|
|
334
334
|
- - ">="
|
335
335
|
- !ruby/object:Gem::Version
|
336
336
|
version: 1.4.0
|
337
|
+
- !ruby/object:Gem::Dependency
|
338
|
+
name: webdrivers
|
339
|
+
requirement: !ruby/object:Gem::Requirement
|
340
|
+
requirements:
|
341
|
+
- - ">="
|
342
|
+
- !ruby/object:Gem::Version
|
343
|
+
version: 3.6.0
|
344
|
+
type: :development
|
345
|
+
prerelease: false
|
346
|
+
version_requirements: !ruby/object:Gem::Requirement
|
347
|
+
requirements:
|
348
|
+
- - ">="
|
349
|
+
- !ruby/object:Gem::Version
|
350
|
+
version: 3.6.0
|
337
351
|
- !ruby/object:Gem::Dependency
|
338
352
|
name: yard
|
339
353
|
requirement: !ruby/object:Gem::Requirement
|