capybara 3.18.0 → 3.19.0

Sign up to get free protection for your applications and to get access to all the features.
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