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.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +16 -0
  3. data/README.md +14 -44
  4. data/lib/capybara/node/actions.rb +2 -2
  5. data/lib/capybara/node/element.rb +3 -5
  6. data/lib/capybara/queries/selector_query.rb +30 -11
  7. data/lib/capybara/rack_test/node.rb +1 -1
  8. data/lib/capybara/result.rb +2 -0
  9. data/lib/capybara/rspec/matcher_proxies.rb +2 -0
  10. data/lib/capybara/rspec/matchers/base.rb +2 -2
  11. data/lib/capybara/rspec/matchers/count_sugar.rb +36 -0
  12. data/lib/capybara/rspec/matchers/have_selector.rb +3 -0
  13. data/lib/capybara/rspec/matchers/have_text.rb +3 -0
  14. data/lib/capybara/selector.rb +196 -599
  15. data/lib/capybara/selector/css.rb +2 -0
  16. data/lib/capybara/selector/definition.rb +276 -0
  17. data/lib/capybara/selector/definition/button.rb +46 -0
  18. data/lib/capybara/selector/definition/checkbox.rb +23 -0
  19. data/lib/capybara/selector/definition/css.rb +5 -0
  20. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  21. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  22. data/lib/capybara/selector/definition/element.rb +27 -0
  23. data/lib/capybara/selector/definition/field.rb +40 -0
  24. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  25. data/lib/capybara/selector/definition/file_field.rb +13 -0
  26. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  27. data/lib/capybara/selector/definition/frame.rb +17 -0
  28. data/lib/capybara/selector/definition/id.rb +6 -0
  29. data/lib/capybara/selector/definition/label.rb +43 -0
  30. data/lib/capybara/selector/definition/link.rb +45 -0
  31. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  32. data/lib/capybara/selector/definition/option.rb +27 -0
  33. data/lib/capybara/selector/definition/radio_button.rb +24 -0
  34. data/lib/capybara/selector/definition/select.rb +62 -0
  35. data/lib/capybara/selector/definition/table.rb +106 -0
  36. data/lib/capybara/selector/definition/table_row.rb +21 -0
  37. data/lib/capybara/selector/definition/xpath.rb +5 -0
  38. data/lib/capybara/selector/filters/base.rb +4 -0
  39. data/lib/capybara/selector/filters/locator_filter.rb +12 -2
  40. data/lib/capybara/selector/selector.rb +40 -452
  41. data/lib/capybara/selenium/driver.rb +4 -10
  42. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +3 -9
  43. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +8 -0
  44. data/lib/capybara/selenium/extensions/find.rb +1 -1
  45. data/lib/capybara/selenium/logger_suppressor.rb +5 -0
  46. data/lib/capybara/selenium/node.rb +19 -13
  47. data/lib/capybara/selenium/nodes/chrome_node.rb +30 -0
  48. data/lib/capybara/selenium/nodes/firefox_node.rb +14 -12
  49. data/lib/capybara/selenium/nodes/ie_node.rb +11 -0
  50. data/lib/capybara/selenium/nodes/safari_node.rb +7 -12
  51. data/lib/capybara/server/checker.rb +7 -3
  52. data/lib/capybara/session.rb +2 -2
  53. data/lib/capybara/spec/session/all_spec.rb +1 -1
  54. data/lib/capybara/spec/session/find_spec.rb +1 -1
  55. data/lib/capybara/spec/session/first_spec.rb +1 -1
  56. data/lib/capybara/spec/session/has_css_spec.rb +7 -0
  57. data/lib/capybara/spec/session/has_text_spec.rb +6 -0
  58. data/lib/capybara/spec/session/save_screenshot_spec.rb +11 -0
  59. data/lib/capybara/spec/session/select_spec.rb +0 -5
  60. data/lib/capybara/spec/test_app.rb +8 -3
  61. data/lib/capybara/version.rb +1 -1
  62. data/lib/capybara/window.rb +1 -1
  63. data/spec/minitest_spec_spec.rb +1 -0
  64. data/spec/selector_spec.rb +12 -6
  65. data/spec/selenium_spec_firefox.rb +0 -3
  66. data/spec/selenium_spec_firefox_remote.rb +0 -3
  67. data/spec/selenium_spec_ie.rb +3 -1
  68. data/spec/server_spec.rb +1 -1
  69. data/spec/shared_selenium_session.rb +1 -1
  70. data/spec/spec_helper.rb +9 -2
  71. 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
- @@form_post_count += 1
180
- '<pre id="results">' + params[:form].merge('post_count' => @@form_post_count).to_yaml + '</pre>'
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__
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Capybara
4
- VERSION = '3.18.0'
4
+ VERSION = '3.19.0'
5
5
  end
@@ -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 # rubocop:disable Naming/RescuedExceptionsVariableName
52
+ rescue @driver.no_such_window_error # _rubocop:disable Naming/RescuedExceptionsVariableName
53
53
  false
54
54
  end
55
55
 
@@ -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
@@ -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
- selector = Capybara::Selector.new :test do
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
- selector = Capybara::Selector.new :test do
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
- selector = Capybara::Selector.new :test do
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
- selector = Capybara::Selector.new :text do
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
- selector = Capybara::Selector.new :test do
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
- selector = Capybara::Selector.new :test do
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'
@@ -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
 
@@ -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' unless chrome_lt?(73, session)
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')
@@ -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.18.0
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-04-22 00:00:00.000000000 Z
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