capybara 3.18.0 → 3.19.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 +14 -44
- data/lib/capybara/node/actions.rb +2 -2
- data/lib/capybara/node/element.rb +3 -5
- data/lib/capybara/queries/selector_query.rb +30 -11
- data/lib/capybara/rack_test/node.rb +1 -1
- data/lib/capybara/result.rb +2 -0
- data/lib/capybara/rspec/matcher_proxies.rb +2 -0
- data/lib/capybara/rspec/matchers/base.rb +2 -2
- data/lib/capybara/rspec/matchers/count_sugar.rb +36 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +3 -0
- data/lib/capybara/rspec/matchers/have_text.rb +3 -0
- data/lib/capybara/selector.rb +196 -599
- data/lib/capybara/selector/css.rb +2 -0
- data/lib/capybara/selector/definition.rb +276 -0
- data/lib/capybara/selector/definition/button.rb +46 -0
- data/lib/capybara/selector/definition/checkbox.rb +23 -0
- data/lib/capybara/selector/definition/css.rb +5 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +27 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +43 -0
- data/lib/capybara/selector/definition/link.rb +45 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +24 -0
- data/lib/capybara/selector/definition/select.rb +62 -0
- data/lib/capybara/selector/definition/table.rb +106 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/filters/base.rb +4 -0
- data/lib/capybara/selector/filters/locator_filter.rb +12 -2
- data/lib/capybara/selector/selector.rb +40 -452
- data/lib/capybara/selenium/driver.rb +4 -10
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +3 -9
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +8 -0
- data/lib/capybara/selenium/extensions/find.rb +1 -1
- data/lib/capybara/selenium/logger_suppressor.rb +5 -0
- data/lib/capybara/selenium/node.rb +19 -13
- data/lib/capybara/selenium/nodes/chrome_node.rb +30 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +14 -12
- data/lib/capybara/selenium/nodes/ie_node.rb +11 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +7 -12
- data/lib/capybara/server/checker.rb +7 -3
- data/lib/capybara/session.rb +2 -2
- data/lib/capybara/spec/session/all_spec.rb +1 -1
- data/lib/capybara/spec/session/find_spec.rb +1 -1
- data/lib/capybara/spec/session/first_spec.rb +1 -1
- data/lib/capybara/spec/session/has_css_spec.rb +7 -0
- data/lib/capybara/spec/session/has_text_spec.rb +6 -0
- data/lib/capybara/spec/session/save_screenshot_spec.rb +11 -0
- data/lib/capybara/spec/session/select_spec.rb +0 -5
- data/lib/capybara/spec/test_app.rb +8 -3
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +1 -1
- data/spec/minitest_spec_spec.rb +1 -0
- data/spec/selector_spec.rb +12 -6
- data/spec/selenium_spec_firefox.rb +0 -3
- data/spec/selenium_spec_firefox_remote.rb +0 -3
- data/spec/selenium_spec_ie.rb +3 -1
- data/spec/server_spec.rb +1 -1
- data/spec/shared_selenium_session.rb +1 -1
- data/spec/spec_helper.rb +9 -2
- metadata +54 -2
@@ -13,6 +13,17 @@ 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
|
+
|
16
27
|
it 'generates sensible filename' do
|
17
28
|
allow(@session.driver).to receive(:save_screenshot)
|
18
29
|
|
@@ -141,11 +141,6 @@ Capybara::SpecHelper.spec '#select' do
|
|
141
141
|
@session.select('Other', from: 'form_title')
|
142
142
|
expect(@session.find_field('form_title').value).not_to eq 'Other'
|
143
143
|
end
|
144
|
-
|
145
|
-
it 'should warn' do
|
146
|
-
expect { @session.select('Other', from: 'form_title') }.to \
|
147
|
-
output(/^Attempt to select disabled option: Other/).to_stderr
|
148
|
-
end
|
149
144
|
end
|
150
145
|
|
151
146
|
context 'with multiple select' do
|
@@ -18,7 +18,6 @@ class TestApp < Sinatra::Base
|
|
18
18
|
set :raise_errors, true
|
19
19
|
set :show_exceptions, false
|
20
20
|
|
21
|
-
@@form_post_count = 0
|
22
21
|
# Also check lib/capybara/spec/views/*.erb for pages not listed here
|
23
22
|
|
24
23
|
get '/' do
|
@@ -176,8 +175,8 @@ class TestApp < Sinatra::Base
|
|
176
175
|
end
|
177
176
|
|
178
177
|
post '/form' do
|
179
|
-
|
180
|
-
'<pre id="results">' + params[:form].merge('post_count' =>
|
178
|
+
self.class.form_post_count += 1
|
179
|
+
'<pre id="results">' + params[:form].merge('post_count' => self.class.form_post_count).to_yaml + '</pre>'
|
181
180
|
end
|
182
181
|
|
183
182
|
post '/upload_empty' do
|
@@ -212,6 +211,12 @@ class TestApp < Sinatra::Base
|
|
212
211
|
'No files uploaded'
|
213
212
|
end
|
214
213
|
end
|
214
|
+
|
215
|
+
class << self
|
216
|
+
attr_accessor :form_post_count
|
217
|
+
end
|
218
|
+
|
219
|
+
@form_post_count = 0
|
215
220
|
end
|
216
221
|
|
217
222
|
Rack::Handler::Puma.run TestApp, Port: 8070 if $PROGRAM_NAME == __FILE__
|
data/lib/capybara/version.rb
CHANGED
data/lib/capybara/window.rb
CHANGED
@@ -49,7 +49,7 @@ module Capybara
|
|
49
49
|
# @return [Boolean] whether this window is the window in which commands are being executed
|
50
50
|
def current?
|
51
51
|
@driver.current_window_handle == @handle
|
52
|
-
rescue @driver.no_such_window_error #
|
52
|
+
rescue @driver.no_such_window_error # _rubocop:disable Naming/RescuedExceptionsVariableName
|
53
53
|
false
|
54
54
|
end
|
55
55
|
|
data/spec/minitest_spec_spec.rb
CHANGED
@@ -124,6 +124,7 @@ class MinitestSpecTest < Minitest::Spec
|
|
124
124
|
it 'supports style expectations' do
|
125
125
|
skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
|
126
126
|
visit('/with_html')
|
127
|
+
find(:css, '#second').must_have_style('display' => 'inline') # deprecated
|
127
128
|
find(:css, '#second').must_match_style('display' => 'inline')
|
128
129
|
end
|
129
130
|
end
|
data/spec/selector_spec.rb
CHANGED
@@ -164,25 +164,28 @@ RSpec.describe Capybara do
|
|
164
164
|
|
165
165
|
describe 'xpath' do
|
166
166
|
it 'uses filter names passed in' do
|
167
|
-
|
167
|
+
Capybara.add_selector :test do
|
168
168
|
xpath(:something, :other) { |_locator| XPath.descendant }
|
169
169
|
end
|
170
|
+
selector = Capybara::Selector.new :test, config: nil, format: nil
|
170
171
|
|
171
172
|
expect(selector.expression_filters.keys).to include(:something, :other)
|
172
173
|
end
|
173
174
|
|
174
175
|
it 'gets filter names from block if none passed to xpath method' do
|
175
|
-
|
176
|
+
Capybara.add_selector :test do
|
176
177
|
xpath { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
177
178
|
end
|
179
|
+
selector = Capybara::Selector.new :test, config: nil, format: nil
|
178
180
|
|
179
181
|
expect(selector.expression_filters.keys).to include(:valid3, :valid4)
|
180
182
|
end
|
181
183
|
|
182
184
|
it 'ignores block parameters if names passed in' do
|
183
|
-
|
185
|
+
Capybara.add_selector :test do
|
184
186
|
xpath(:valid1) { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
185
187
|
end
|
188
|
+
selector = Capybara::Selector.new :test, config: nil, format: nil
|
186
189
|
|
187
190
|
expect(selector.expression_filters.keys).to include(:valid1)
|
188
191
|
expect(selector.expression_filters.keys).not_to include(:valid3, :valid4)
|
@@ -202,25 +205,28 @@ RSpec.describe Capybara do
|
|
202
205
|
end
|
203
206
|
|
204
207
|
it 'uses filter names passed in' do
|
205
|
-
|
208
|
+
Capybara.add_selector :test do
|
206
209
|
css(:name, :other_name) { |_locator| '' }
|
207
210
|
end
|
211
|
+
selector = Capybara::Selector.new :test, config: nil, format: nil
|
208
212
|
|
209
213
|
expect(selector.expression_filters.keys).to include(:name, :other_name)
|
210
214
|
end
|
211
215
|
|
212
216
|
it 'gets filter names from block if none passed to css method' do
|
213
|
-
|
217
|
+
Capybara.add_selector :test do
|
214
218
|
css { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
215
219
|
end
|
220
|
+
selector = Capybara::Selector.new :test, config: nil, format: nil
|
216
221
|
|
217
222
|
expect(selector.expression_filters.keys).to include(:valid3, :valid4)
|
218
223
|
end
|
219
224
|
|
220
225
|
it 'ignores block parameters if names passed in' do
|
221
|
-
|
226
|
+
Capybara.add_selector :test do
|
222
227
|
css(:valid1) { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
|
223
228
|
end
|
229
|
+
selector = Capybara::Selector.new :test, config: nil, format: nil
|
224
230
|
|
225
231
|
expect(selector.expression_filters.keys).to include(:valid1)
|
226
232
|
expect(selector.expression_filters.keys).not_to include(:valid3, :valid4)
|
@@ -53,9 +53,6 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capyba
|
|
53
53
|
pending "selenium-webdriver/geckodriver doesn't generate double click event" if firefox_lt?(59, @session)
|
54
54
|
when 'Capybara::Session selenium #accept_prompt should accept the prompt with a blank response when there is a default'
|
55
55
|
pending "Geckodriver doesn't set a blank response in FF < 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1486485" if firefox_lt?(63, @session)
|
56
|
-
when 'Capybara::Session selenium #attach_file with multipart form should fire change once for each set of files uploaded'
|
57
|
-
pending 'Gekcodriver appends files so we have to first call clear for multiple files which creates an extra change ' \
|
58
|
-
'if files are already set'
|
59
56
|
when 'Capybara::Session selenium #attach_file with multipart form should fire change once when uploading multiple files from empty'
|
60
57
|
pending "FF < 62 doesn't support setting all files at once" if firefox_lt?(62, @session)
|
61
58
|
when 'Capybara::Session selenium #accept_confirm should work with nested modals'
|
@@ -63,9 +63,6 @@ Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVE
|
|
63
63
|
skip "Firefox doesn't generate an event for shift+control+click" if firefox_gte?(62, @session)
|
64
64
|
when 'Capybara::Session selenium_firefox_remote #accept_prompt should accept the prompt with a blank response when there is a default'
|
65
65
|
pending "Geckodriver doesn't set a blank response in FF < 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1486485" if firefox_lt?(63, @session)
|
66
|
-
when 'Capybara::Session selenium_firefox_remote #attach_file with multipart form should fire change once for each set of files uploaded'
|
67
|
-
pending 'Gekcodriver appends files so we have to first call clear for multiple files which creates an extra change ' \
|
68
|
-
'if files are already set'
|
69
66
|
when 'Capybara::Session selenium_firefox_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
|
70
67
|
pending "FF < 62 doesn't support setting all files at once" if firefox_lt?(62, @session)
|
71
68
|
when 'Capybara::Session selenium_firefox_remote #reset_session! removes ALL cookies'
|
data/spec/selenium_spec_ie.rb
CHANGED
@@ -28,7 +28,7 @@ end
|
|
28
28
|
Capybara.register_driver :selenium_ie do |app|
|
29
29
|
# ::Selenium::WebDriver.logger.level = "debug"
|
30
30
|
options = ::Selenium::WebDriver::IE::Options.new
|
31
|
-
options.require_window_focus = true
|
31
|
+
# options.require_window_focus = true
|
32
32
|
# options.add_option("log", {"level": "trace"})
|
33
33
|
|
34
34
|
if ENV['REMOTE']
|
@@ -110,6 +110,8 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, 'selenium', capybara_sk
|
|
110
110
|
# pending "IE driver doesn't error when clicking on covered elements, it just clicks the wrong element"
|
111
111
|
when /#click should go to the same page if href is blank$/
|
112
112
|
pending 'IE treats blank href as a parent request (against HTML spec)'
|
113
|
+
when /#attach_file with a block/
|
114
|
+
skip 'Hangs IE testing for unknown reason'
|
113
115
|
end
|
114
116
|
end
|
115
117
|
|
data/spec/server_spec.rb
CHANGED
@@ -83,7 +83,7 @@ RSpec.describe Capybara::Server do
|
|
83
83
|
server = Capybara::Server.new(app).boot
|
84
84
|
|
85
85
|
expect do
|
86
|
-
Net::HTTP.start(server.host, server.port) { |http| http.get('/__idntify__') }
|
86
|
+
Net::HTTP.start(server.host, server.port, max_retries: 0) { |http| http.get('/__idntify__') }
|
87
87
|
end.to raise_error(EOFError)
|
88
88
|
|
89
89
|
res = Net::HTTP.start(server.host, server.port, use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE) do |https|
|
@@ -360,7 +360,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
|
|
360
360
|
pending "Selenium remote doesn't support transferring a directory" if remote?(session)
|
361
361
|
pending "Headless Chrome doesn't support directory upload - https://bugs.chromium.org/p/chromedriver/issues/detail?id=2521&q=directory%20upload&colspec=ID%20Status%20Pri%20Owner%20Summary" if chrome?(session) && ENV['HEADLESS']
|
362
362
|
pending "IE doesn't support uploading a directory" if ie?(session)
|
363
|
-
pending 'Chrome/chromedriver 73 breaks this'
|
363
|
+
pending 'Chrome/chromedriver 73 breaks this' if chrome?(session) && !chrome_lt?(73, session)
|
364
364
|
pending "Safari doesn't support uploading a directory" if safari?(session)
|
365
365
|
|
366
366
|
session.visit('/form')
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rspec/expectations'
|
4
|
-
require 'capybara/spec/spec_helper'
|
5
4
|
require 'webdrivers' if ENV['CI']
|
6
5
|
require 'selenium_statistics'
|
6
|
+
if ENV['TRAVIS']
|
7
|
+
require 'coveralls'
|
8
|
+
Coveralls.wear! do
|
9
|
+
add_filter '/lib/capybara/driver/'
|
10
|
+
add_filter '/lib/capybara/registrations/'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
require 'capybara/spec/spec_helper'
|
7
14
|
|
8
15
|
module Capybara
|
9
16
|
module SpecHelper
|
@@ -57,7 +64,7 @@ module Capybara
|
|
57
64
|
mod = mod::Service if ::Selenium::WebDriver::Service.respond_to? :driver_path
|
58
65
|
path = mod.driver_path
|
59
66
|
path = path.call if path.respond_to? :call
|
60
|
-
$stdout.puts `#{path} --version`
|
67
|
+
$stdout.puts `#{path.gsub(' ', '\ ')} --version`
|
61
68
|
end
|
62
69
|
end
|
63
70
|
end
|
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.19.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-
|
13
|
+
date: 2019-05-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -124,6 +124,20 @@ dependencies:
|
|
124
124
|
- - ">="
|
125
125
|
- !ruby/object:Gem::Version
|
126
126
|
version: '0'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: coveralls
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
127
141
|
- !ruby/object:Gem::Dependency
|
128
142
|
name: cucumber
|
129
143
|
requirement: !ruby/object:Gem::Requirement
|
@@ -236,6 +250,20 @@ dependencies:
|
|
236
250
|
- - ">="
|
237
251
|
- !ruby/object:Gem::Version
|
238
252
|
version: 3.5.0
|
253
|
+
- !ruby/object:Gem::Dependency
|
254
|
+
name: rspec-instafail
|
255
|
+
requirement: !ruby/object:Gem::Requirement
|
256
|
+
requirements:
|
257
|
+
- - ">="
|
258
|
+
- !ruby/object:Gem::Version
|
259
|
+
version: '0'
|
260
|
+
type: :development
|
261
|
+
prerelease: false
|
262
|
+
version_requirements: !ruby/object:Gem::Requirement
|
263
|
+
requirements:
|
264
|
+
- - ">="
|
265
|
+
- !ruby/object:Gem::Version
|
266
|
+
version: '0'
|
239
267
|
- !ruby/object:Gem::Dependency
|
240
268
|
name: rubocop
|
241
269
|
requirement: !ruby/object:Gem::Requirement
|
@@ -417,6 +445,7 @@ files:
|
|
417
445
|
- lib/capybara/rspec/matchers/base.rb
|
418
446
|
- lib/capybara/rspec/matchers/become_closed.rb
|
419
447
|
- lib/capybara/rspec/matchers/compound.rb
|
448
|
+
- lib/capybara/rspec/matchers/count_sugar.rb
|
420
449
|
- lib/capybara/rspec/matchers/have_current_path.rb
|
421
450
|
- lib/capybara/rspec/matchers/have_selector.rb
|
422
451
|
- lib/capybara/rspec/matchers/have_text.rb
|
@@ -427,6 +456,28 @@ files:
|
|
427
456
|
- lib/capybara/selector/builders/css_builder.rb
|
428
457
|
- lib/capybara/selector/builders/xpath_builder.rb
|
429
458
|
- lib/capybara/selector/css.rb
|
459
|
+
- lib/capybara/selector/definition.rb
|
460
|
+
- lib/capybara/selector/definition/button.rb
|
461
|
+
- lib/capybara/selector/definition/checkbox.rb
|
462
|
+
- lib/capybara/selector/definition/css.rb
|
463
|
+
- lib/capybara/selector/definition/datalist_input.rb
|
464
|
+
- lib/capybara/selector/definition/datalist_option.rb
|
465
|
+
- lib/capybara/selector/definition/element.rb
|
466
|
+
- lib/capybara/selector/definition/field.rb
|
467
|
+
- lib/capybara/selector/definition/fieldset.rb
|
468
|
+
- lib/capybara/selector/definition/file_field.rb
|
469
|
+
- lib/capybara/selector/definition/fillable_field.rb
|
470
|
+
- lib/capybara/selector/definition/frame.rb
|
471
|
+
- lib/capybara/selector/definition/id.rb
|
472
|
+
- lib/capybara/selector/definition/label.rb
|
473
|
+
- lib/capybara/selector/definition/link.rb
|
474
|
+
- lib/capybara/selector/definition/link_or_button.rb
|
475
|
+
- lib/capybara/selector/definition/option.rb
|
476
|
+
- lib/capybara/selector/definition/radio_button.rb
|
477
|
+
- lib/capybara/selector/definition/select.rb
|
478
|
+
- lib/capybara/selector/definition/table.rb
|
479
|
+
- lib/capybara/selector/definition/table_row.rb
|
480
|
+
- lib/capybara/selector/definition/xpath.rb
|
430
481
|
- lib/capybara/selector/filter.rb
|
431
482
|
- lib/capybara/selector/filter_set.rb
|
432
483
|
- lib/capybara/selector/filters/base.rb
|
@@ -448,6 +499,7 @@ files:
|
|
448
499
|
- lib/capybara/selenium/node.rb
|
449
500
|
- lib/capybara/selenium/nodes/chrome_node.rb
|
450
501
|
- lib/capybara/selenium/nodes/firefox_node.rb
|
502
|
+
- lib/capybara/selenium/nodes/ie_node.rb
|
451
503
|
- lib/capybara/selenium/nodes/safari_node.rb
|
452
504
|
- lib/capybara/selenium/patches/pause_duration_fix.rb
|
453
505
|
- lib/capybara/selenium/patches/persistent_client.rb
|