capybara 3.39.1 → 3.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +29 -0
  3. data/README.md +173 -29
  4. data/lib/capybara/helpers.rb +1 -1
  5. data/lib/capybara/minitest/spec.rb +16 -4
  6. data/lib/capybara/minitest.rb +14 -1
  7. data/lib/capybara/node/matchers.rb +25 -0
  8. data/lib/capybara/node/whitespace_normalizer.rb +5 -5
  9. data/lib/capybara/queries/selector_query.rb +2 -1
  10. data/lib/capybara/rack_test/browser.rb +3 -2
  11. data/lib/capybara/rack_test/node.rb +5 -12
  12. data/lib/capybara/registration_container.rb +2 -2
  13. data/lib/capybara/registrations/drivers.rb +1 -1
  14. data/lib/capybara/registrations/servers.rb +8 -7
  15. data/lib/capybara/result.rb +2 -2
  16. data/lib/capybara/rspec/matchers/have_selector.rb +4 -12
  17. data/lib/capybara/rspec/matchers.rb +7 -2
  18. data/lib/capybara/selector/css.rb +5 -5
  19. data/lib/capybara/selector/definition/table.rb +1 -1
  20. data/lib/capybara/selector/definition/table_row.rb +2 -2
  21. data/lib/capybara/selector.rb +251 -0
  22. data/lib/capybara/selenium/driver.rb +11 -51
  23. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +1 -6
  24. data/lib/capybara/selenium/node.rb +4 -31
  25. data/lib/capybara/selenium/nodes/chrome_node.rb +3 -19
  26. data/lib/capybara/selenium/nodes/edge_node.rb +0 -16
  27. data/lib/capybara/server/animation_disabler.rb +1 -1
  28. data/lib/capybara/server.rb +1 -1
  29. data/lib/capybara/session.rb +3 -2
  30. data/lib/capybara/spec/session/all_spec.rb +1 -1
  31. data/lib/capybara/spec/session/click_link_spec.rb +1 -1
  32. data/lib/capybara/spec/session/find_spec.rb +8 -0
  33. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  34. data/lib/capybara/spec/session/has_table_spec.rb +13 -2
  35. data/lib/capybara/spec/session/node_spec.rb +6 -0
  36. data/lib/capybara/spec/session/node_wrapper_spec.rb +1 -1
  37. data/lib/capybara/spec/session/uncheck_spec.rb +1 -1
  38. data/lib/capybara/spec/spec_helper.rb +2 -2
  39. data/lib/capybara/spec/test_app.rb +1 -1
  40. data/lib/capybara/spec/views/form.erb +5 -0
  41. data/lib/capybara/spec/views/with_html.erb +2 -0
  42. data/lib/capybara/version.rb +1 -1
  43. data/lib/capybara.rb +7 -6
  44. data/spec/minitest_spec.rb +8 -1
  45. data/spec/result_spec.rb +9 -0
  46. data/spec/rspec/shared_spec_matchers.rb +26 -2
  47. data/spec/rspec_spec.rb +1 -1
  48. data/spec/sauce_spec_chrome.rb +1 -1
  49. data/spec/selector_spec.rb +1 -1
  50. data/spec/selenium_spec_chrome.rb +7 -5
  51. data/spec/selenium_spec_chrome_remote.rb +1 -6
  52. data/spec/selenium_spec_edge.rb +11 -4
  53. data/spec/selenium_spec_firefox.rb +4 -3
  54. data/spec/selenium_spec_firefox_remote.rb +2 -3
  55. data/spec/server_spec.rb +12 -0
  56. data/spec/shared_selenium_session.rb +0 -2
  57. data/spec/spec_helper.rb +3 -3
  58. metadata +25 -32
  59. data/lib/capybara/selenium/logger_suppressor.rb +0 -44
  60. data/lib/capybara/selenium/patches/action_pauser.rb +0 -26
data/spec/server_spec.rb CHANGED
@@ -118,6 +118,18 @@ RSpec.describe Capybara::Server do
118
118
  Capybara.server = :default
119
119
  end
120
120
 
121
+ it 'should not emit any warnings when booting puma' do
122
+ Capybara.server = :puma
123
+ app_proc = proc { |_env| [200, {}, ['Hello Puma!']] }
124
+ require 'puma'
125
+
126
+ expect do
127
+ described_class.new(app_proc).boot
128
+ end.not_to output.to_stderr
129
+ ensure
130
+ Capybara.server = :default
131
+ end
132
+
121
133
  it 'should support SSL' do
122
134
  key = File.join(Dir.pwd, 'spec', 'fixtures', 'key.pem')
123
135
  cert = File.join(Dir.pwd, 'spec', 'fixtures', 'certificate.pem')
@@ -281,8 +281,6 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
281
281
  end
282
282
 
283
283
  it 'returns a shadow root' do
284
- skip 'Not supported with this Selenium version' if selenium_lt?('4.1', session)
285
- pending "Geckodriver doesn't fully support shadow root yet" if firefox?(session)
286
284
  session.visit('/with_shadow')
287
285
  shadow = session.find(:css, '#shadow_host')
288
286
  element = session.evaluate_script('arguments[0].shadowRoot', shadow)
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rspec/expectations'
4
- require 'webdrivers' if ENV.fetch('CI', nil) || ENV.fetch('WEBDRIVERS', nil)
4
+ require 'webdrivers' if ENV.fetch('WEBDRIVERS', nil)
5
5
  require 'selenium_statistics'
6
6
  if ENV['TRAVIS']
7
7
  require 'coveralls'
@@ -16,7 +16,7 @@ module Capybara
16
16
  module SpecHelper
17
17
  def firefox?(session)
18
18
  browser_name(session) == :firefox &&
19
- ((defined?(::Selenium::WebDriver::VERSION) && (::Selenium::WebDriver::VERSION.to_f >= 4)) ||
19
+ ((defined?(::Selenium::WebDriver::VERSION) && (Gem::Version.new(::Selenium::WebDriver::VERSION) >= Gem::Version.new('4'))) ||
20
20
  session.driver.browser.capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities))
21
21
  end
22
22
 
@@ -114,7 +114,7 @@ module Capybara
114
114
  mod = mod::Service if ::Selenium::WebDriver::Service.respond_to? :driver_path
115
115
  path = mod.driver_path
116
116
  path = path.call if path.respond_to? :call
117
- $stdout.puts `#{path.gsub(' ', '\ ')} --version`
117
+ $stdout.puts `#{path.gsub(' ', '\ ')} --version` if path
118
118
  end
119
119
  end
120
120
  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.39.1
4
+ version: 3.40.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Walpole
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2023-05-12 00:00:00.000000000 Z
12
+ date: 2024-01-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -59,14 +59,14 @@ dependencies:
59
59
  requirements:
60
60
  - - "~>"
61
61
  - !ruby/object:Gem::Version
62
- version: '1.8'
62
+ version: '1.11'
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '1.8'
69
+ version: '1.11'
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: rack
72
72
  requirement: !ruby/object:Gem::Requirement
@@ -241,6 +241,20 @@ dependencies:
241
241
  - - ">="
242
242
  - !ruby/object:Gem::Version
243
243
  version: '0'
244
+ - !ruby/object:Gem::Dependency
245
+ name: rackup
246
+ requirement: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ type: :development
252
+ prerelease: false
253
+ version_requirements: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
256
+ - !ruby/object:Gem::Version
257
+ version: '0'
244
258
  - !ruby/object:Gem::Dependency
245
259
  name: rake
246
260
  requirement: !ruby/object:Gem::Requirement
@@ -385,22 +399,16 @@ dependencies:
385
399
  name: selenium-webdriver
386
400
  requirement: !ruby/object:Gem::Requirement
387
401
  requirements:
388
- - - ">="
389
- - !ruby/object:Gem::Version
390
- version: 3.142.7
391
- - - "<"
402
+ - - "~>"
392
403
  - !ruby/object:Gem::Version
393
- version: '5.0'
404
+ version: '4.8'
394
405
  type: :development
395
406
  prerelease: false
396
407
  version_requirements: !ruby/object:Gem::Requirement
397
408
  requirements:
398
- - - ">="
399
- - !ruby/object:Gem::Version
400
- version: 3.142.7
401
- - - "<"
409
+ - - "~>"
402
410
  - !ruby/object:Gem::Version
403
- version: '5.0'
411
+ version: '4.8'
404
412
  - !ruby/object:Gem::Dependency
405
413
  name: sinatra
406
414
  requirement: !ruby/object:Gem::Requirement
@@ -429,20 +437,6 @@ dependencies:
429
437
  - - ">="
430
438
  - !ruby/object:Gem::Version
431
439
  version: '0'
432
- - !ruby/object:Gem::Dependency
433
- name: webdrivers
434
- requirement: !ruby/object:Gem::Requirement
435
- requirements:
436
- - - ">="
437
- - !ruby/object:Gem::Version
438
- version: 3.6.0
439
- type: :development
440
- prerelease: false
441
- version_requirements: !ruby/object:Gem::Requirement
442
- requirements:
443
- - - ">="
444
- - !ruby/object:Gem::Version
445
- version: 3.6.0
446
440
  - !ruby/object:Gem::Dependency
447
441
  name: yard
448
442
  requirement: !ruby/object:Gem::Requirement
@@ -577,14 +571,12 @@ files:
577
571
  - lib/capybara/selenium/extensions/html5_drag.rb
578
572
  - lib/capybara/selenium/extensions/modifier_keys_stack.rb
579
573
  - lib/capybara/selenium/extensions/scroll.rb
580
- - lib/capybara/selenium/logger_suppressor.rb
581
574
  - lib/capybara/selenium/node.rb
582
575
  - lib/capybara/selenium/nodes/chrome_node.rb
583
576
  - lib/capybara/selenium/nodes/edge_node.rb
584
577
  - lib/capybara/selenium/nodes/firefox_node.rb
585
578
  - lib/capybara/selenium/nodes/ie_node.rb
586
579
  - lib/capybara/selenium/nodes/safari_node.rb
587
- - lib/capybara/selenium/patches/action_pauser.rb
588
580
  - lib/capybara/selenium/patches/atoms.rb
589
581
  - lib/capybara/selenium/patches/is_displayed.rb
590
582
  - lib/capybara/selenium/patches/logs.rb
@@ -654,6 +646,7 @@ files:
654
646
  - lib/capybara/spec/session/has_button_spec.rb
655
647
  - lib/capybara/spec/session/has_css_spec.rb
656
648
  - lib/capybara/spec/session/has_current_path_spec.rb
649
+ - lib/capybara/spec/session/has_element_spec.rb
657
650
  - lib/capybara/spec/session/has_field_spec.rb
658
651
  - lib/capybara/spec/session/has_link_spec.rb
659
652
  - lib/capybara/spec/session/has_none_selectors_spec.rb
@@ -799,14 +792,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
799
792
  requirements:
800
793
  - - ">="
801
794
  - !ruby/object:Gem::Version
802
- version: 2.7.0
795
+ version: 3.0.0
803
796
  required_rubygems_version: !ruby/object:Gem::Requirement
804
797
  requirements:
805
798
  - - ">="
806
799
  - !ruby/object:Gem::Version
807
800
  version: '0'
808
801
  requirements: []
809
- rubygems_version: 3.3.7
802
+ rubygems_version: 3.4.19
810
803
  signing_key:
811
804
  specification_version: 4
812
805
  summary: Capybara aims to simplify the process of integration testing Rack applications,
@@ -1,44 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Capybara
4
- module Selenium
5
- module DeprecationSuppressor
6
- def initialize(...)
7
- @suppress_for_capybara = false
8
- super
9
- end
10
-
11
- def deprecate(*args, **opts, &block)
12
- return if @suppress_for_capybara
13
-
14
- if opts.empty?
15
- super(*args, &block) # support Selenium 3
16
- else
17
- super
18
- end
19
- end
20
-
21
- def warn(*args, **opts)
22
- super unless @suppress_for_capybara
23
- end
24
-
25
- def suppress_deprecations
26
- prev_suppress_for_capybara, @suppress_for_capybara = @suppress_for_capybara, true
27
- yield
28
- ensure
29
- @suppress_for_capybara = prev_suppress_for_capybara
30
- end
31
- end
32
-
33
- module ErrorSuppressor
34
- def for_code(...)
35
- ::Selenium::WebDriver.logger.suppress_deprecations do
36
- super
37
- end
38
- end
39
- end
40
- end
41
- end
42
-
43
- Selenium::WebDriver::Logger.prepend Capybara::Selenium::DeprecationSuppressor
44
- Selenium::WebDriver::Error.singleton_class.prepend Capybara::Selenium::ErrorSuppressor
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ActionPauser
4
- def initialize(mouse, keyboard)
5
- super
6
- @devices[:pauser] = Pauser.new
7
- end
8
-
9
- def pause(duration)
10
- @actions << [:pauser, :pause, [duration]]
11
- self
12
- end
13
-
14
- class Pauser
15
- def pause(duration)
16
- sleep duration
17
- end
18
- end
19
-
20
- private_constant :Pauser
21
- end
22
-
23
- if defined?(Selenium::WebDriver::VERSION) && (Selenium::WebDriver::VERSION.to_f < 4) &&
24
- defined?(Selenium::WebDriver::ActionBuilder)
25
- Selenium::WebDriver::ActionBuilder.prepend(ActionPauser)
26
- end