capybara 3.23.0 → 3.24.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 +17 -0
- data/README.md +1 -2
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +8 -4
- data/lib/capybara/selenium/node.rb +2 -5
- data/lib/capybara/selenium/nodes/chrome_node.rb +2 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +3 -1
- data/lib/capybara/selenium/patches/logs.rb +34 -7
- data/lib/capybara/spec/session/save_screenshot_spec.rb +0 -11
- data/lib/capybara/spec/test_app.rb +4 -0
- data/lib/capybara/version.rb +1 -1
- data/spec/selenium_spec_chrome.rb +5 -4
- data/spec/selenium_spec_chrome_remote.rb +17 -0
- data/spec/shared_selenium_session.rb +7 -0
- data/spec/spec_helper.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ea1da81bd27199aadc0d73d61e33b7ff0ea9911114acc375ea2e6f798a49eb4
|
4
|
+
data.tar.gz: 30279a8a5ab221ae029bc95625c7c82ad11cdf68d91ef6be33e7a0b022268537
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b8d7f760540297a204ae5eb0dac8b9450e8961652de87d543ae114edb9af6a48219db7c55a40e004d49847431ef545cc5628a6bbde858e58921209f984852d2
|
7
|
+
data.tar.gz: 56d10157a97fd98f7e2e23c98fc21f0dc0f70f53338a271c9fa22b639648d919134fe1c7c803be43f435a9618d49e2517ccce5d207139635c49d9f6f18a66bd6
|
data/History.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
# Version 3.24.0
|
2
|
+
Release date: 2079-06-13
|
3
|
+
|
4
|
+
### Added
|
5
|
+
|
6
|
+
* Log access when using the Selenium driver with Chrome 75 in W3C mode has been reenabled.
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
|
10
|
+
* Selenium driver now selects all current content and then sends keys rather than clearing field by JS
|
11
|
+
and then sending keys when setting values to text inputs in order to more closely simulate user behavior
|
12
|
+
|
13
|
+
### Fixed
|
14
|
+
|
15
|
+
* Relative paths passed to `attach_file` will be assumed to be relative to the current working directory when using the
|
16
|
+
Selenium driver
|
17
|
+
|
1
18
|
# Version 3.23.0
|
2
19
|
Release date: 2019-06-10
|
3
20
|
|
data/README.md
CHANGED
@@ -7,8 +7,7 @@
|
|
7
7
|
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
8
8
|
[![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=capybara&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
|
9
9
|
|
10
|
-
**Note** You are viewing the README for the 3.
|
11
|
-
|
10
|
+
**Note** You are viewing the README for the 3.24.x version of Capybara.
|
12
11
|
|
13
12
|
Capybara helps you test web applications by simulating how a real user would
|
14
13
|
interact with your app. It is agnostic about the driver running your tests and
|
@@ -6,7 +6,7 @@ require 'capybara/selenium/patches/logs'
|
|
6
6
|
module Capybara::Selenium::Driver::ChromeDriver
|
7
7
|
def self.extended(base)
|
8
8
|
bridge = base.send(:bridge)
|
9
|
-
bridge.extend Capybara::Selenium::ChromeLogs unless bridge.respond_to?(:
|
9
|
+
bridge.extend Capybara::Selenium::ChromeLogs unless bridge.respond_to?(:log)
|
10
10
|
end
|
11
11
|
|
12
12
|
def fullscreen_window(handle)
|
@@ -90,9 +90,13 @@ private
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def execute_cdp(cmd, params = {})
|
93
|
-
|
94
|
-
|
95
|
-
|
93
|
+
if browser.respond_to? :execute_cdp
|
94
|
+
browser.execute_cdp(cmd, params)
|
95
|
+
else
|
96
|
+
args = { cmd: cmd, params: params }
|
97
|
+
result = bridge.http.call(:post, "session/#{bridge.session_id}/goog/cdp/execute", args)
|
98
|
+
result['value']
|
99
|
+
end
|
96
100
|
end
|
97
101
|
|
98
102
|
def build_node(native_node, initial_cache = {})
|
@@ -224,10 +224,7 @@ private
|
|
224
224
|
elsif clear.is_a? Array
|
225
225
|
send_keys(*clear, value)
|
226
226
|
else
|
227
|
-
|
228
|
-
# Script can change a readonly element which user input cannot, so
|
229
|
-
# don't execute if readonly.
|
230
|
-
driver.execute_script "if (!arguments[0].readOnly){ arguments[0].value = '' }", self unless clear == :none
|
227
|
+
driver.execute_script 'arguments[0].select()', self unless clear == :none
|
231
228
|
send_keys(value)
|
232
229
|
end
|
233
230
|
end
|
@@ -303,7 +300,7 @@ private
|
|
303
300
|
|
304
301
|
def set_file(value) # rubocop:disable Naming/AccessorMethodName
|
305
302
|
path_names = value.to_s.empty? ? [] : value
|
306
|
-
native.send_keys(Array(path_names).join("\n"))
|
303
|
+
native.send_keys(Array(path_names).map(&File.method(:expand_path)).join("\n"))
|
307
304
|
end
|
308
305
|
|
309
306
|
def set_content_editable(value) # rubocop:disable Naming/AccessorMethodName
|
@@ -34,6 +34,8 @@ class Capybara::Selenium::ChromeNode < Capybara::Selenium::Node
|
|
34
34
|
|
35
35
|
def click(*)
|
36
36
|
super
|
37
|
+
rescue ::Selenium::WebDriver::Error::ElementClickInterceptedError
|
38
|
+
raise
|
37
39
|
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
38
40
|
# chromedriver 74 (at least on mac) raises the wrong error for this
|
39
41
|
raise ::Selenium::WebDriver::Error::ElementClickInterceptedError, e.message if e.message.match?(/element click intercepted/)
|
@@ -16,7 +16,9 @@ class Capybara::Selenium::SafariNode < Capybara::Selenium::Node
|
|
16
16
|
return find_css('th:first-child,td:first-child')[0].click(keys, options)
|
17
17
|
end
|
18
18
|
raise
|
19
|
-
rescue ::Selenium::WebDriver::Error::WebDriverError
|
19
|
+
rescue ::Selenium::WebDriver::Error::WebDriverError => e
|
20
|
+
raise unless e.instance_of? ::Selenium::WebDriver::Error::WebDriverError
|
21
|
+
|
20
22
|
# Safari doesn't return a specific error here - assume it's an ElementNotInteractableError
|
21
23
|
raise ::Selenium::WebDriver::Error::ElementNotInteractableError,
|
22
24
|
'Non distinct error raised in #click, translated to ElementNotInteractableError for retry'
|
@@ -4,16 +4,43 @@ module Capybara
|
|
4
4
|
module Selenium
|
5
5
|
module ChromeLogs
|
6
6
|
LOG_MSG = <<~MSG
|
7
|
-
Chromedriver 75+ defaults to W3C mode.
|
8
|
-
|
9
|
-
It is unknown how long non-W3C mode will be supported by chromedriver (it won't be supported by selenium-webdriver 4+) \
|
10
|
-
so you may need to consider other solutions in the near future.
|
7
|
+
Chromedriver 75+ defaults to W3C mode. Please upgrade to chromedriver >= \
|
8
|
+
75.0.3770.90 if you need to access logs while in W3C compliant mode.
|
11
9
|
MSG
|
12
10
|
|
13
|
-
|
14
|
-
|
11
|
+
COMMANDS = {
|
12
|
+
get_available_log_types: [:get, 'session/:session_id/se/log/types'],
|
13
|
+
get_log: [:post, 'session/:session_id/se/log'],
|
14
|
+
get_log_legacy: [:post, 'session/:session_id/log']
|
15
|
+
}.freeze
|
15
16
|
|
16
|
-
|
17
|
+
def commands(command)
|
18
|
+
COMMANDS[command] || super
|
19
|
+
end
|
20
|
+
|
21
|
+
def available_log_types
|
22
|
+
types = execute :get_available_log_types
|
23
|
+
Array(types).map(&:to_sym)
|
24
|
+
rescue ::Selenium::WebDriver::Error::UnknownCommandError
|
25
|
+
raise NotImplementedError, LOG_MSG
|
26
|
+
end
|
27
|
+
|
28
|
+
def log(type)
|
29
|
+
data = begin
|
30
|
+
execute :get_log, {}, type: type.to_s
|
31
|
+
rescue ::Selenium::WebDriver::Error::UnknownCommandError
|
32
|
+
execute :get_log_legacy, {}, type: type.to_s
|
33
|
+
end
|
34
|
+
|
35
|
+
Array(data).map do |l|
|
36
|
+
begin
|
37
|
+
::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
|
38
|
+
rescue KeyError
|
39
|
+
next
|
40
|
+
end
|
41
|
+
end
|
42
|
+
rescue ::Selenium::WebDriver::Error::UnknownCommandError
|
43
|
+
raise NotImplementedError, LOG_MSG
|
17
44
|
end
|
18
45
|
end
|
19
46
|
end
|
@@ -13,17 +13,6 @@ Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
|
|
13
13
|
FileUtils.rm_rf alternative_path
|
14
14
|
end
|
15
15
|
|
16
|
-
around do |example|
|
17
|
-
# Workaround RSpec Issue - https://github.com/rspec/rspec-support/issues/374
|
18
|
-
if respond_to?(:without_partial_double_verification)
|
19
|
-
without_partial_double_verification do
|
20
|
-
example.run
|
21
|
-
end
|
22
|
-
else
|
23
|
-
example.run
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
16
|
it 'generates sensible filename' do
|
28
17
|
allow(@session.driver).to receive(:save_screenshot)
|
29
18
|
|
data/lib/capybara/version.rb
CHANGED
@@ -125,16 +125,17 @@ RSpec.describe 'Capybara::Session with chrome' do
|
|
125
125
|
describe 'log access' do
|
126
126
|
before { skip 'Only makes sense in W3C mode' if ENV['W3C'] == 'false' }
|
127
127
|
|
128
|
-
it '
|
128
|
+
it 'does not error getting log types' do
|
129
|
+
skip if Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0]) < Gem::Version.new('75.0.3770.90')
|
129
130
|
expect do
|
130
131
|
session.driver.browser.manage.logs.available_types
|
131
|
-
end.
|
132
|
+
end.not_to raise_error
|
132
133
|
end
|
133
134
|
|
134
|
-
it '
|
135
|
+
it 'does not error when getting logs' do
|
135
136
|
expect do
|
136
137
|
session.driver.browser.manage.logs.get(:browser)
|
137
|
-
end.
|
138
|
+
end.not_to raise_error
|
138
139
|
end
|
139
140
|
end
|
140
141
|
end
|
@@ -80,4 +80,21 @@ RSpec.describe 'Capybara::Session with remote Chrome' do
|
|
80
80
|
it 'is considered to be chrome' do
|
81
81
|
expect(session.driver.browser.browser).to eq :chrome
|
82
82
|
end
|
83
|
+
|
84
|
+
describe 'log access' do
|
85
|
+
before { skip 'Only makes sense in W3C mode' if ENV['W3C'] == 'false' }
|
86
|
+
|
87
|
+
it 'does not error when getting log types' do
|
88
|
+
skip if Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0]) < Gem::Version.new('75.0.3770.90')
|
89
|
+
expect do
|
90
|
+
session.driver.browser.manage.logs.available_types
|
91
|
+
end.not_to raise_error
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'does not error when getting logs' do
|
95
|
+
expect do
|
96
|
+
session.driver.browser.manage.logs.get(:browser)
|
97
|
+
end.not_to raise_error
|
98
|
+
end
|
99
|
+
end
|
83
100
|
end
|
@@ -321,6 +321,13 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
|
|
321
321
|
session.click_button('Upload Multiple')
|
322
322
|
expect(session.body).to include('5 | ') # number of files
|
323
323
|
end
|
324
|
+
|
325
|
+
it 'can attach a relative file' do
|
326
|
+
session.visit('/form')
|
327
|
+
session.attach_file('Single Document', 'spec/fixtures/capybara.csv')
|
328
|
+
session.click_button('Upload Single')
|
329
|
+
expect(session.body).to include('Content-type: text/csv')
|
330
|
+
end
|
324
331
|
end
|
325
332
|
|
326
333
|
context 'Windows' do
|
data/spec/spec_helper.rb
CHANGED
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.24.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-06-
|
13
|
+
date: 2019-06-14 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|