capybara 3.38.0 → 3.39.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +20 -0
  3. data/lib/capybara/node/actions.rb +4 -4
  4. data/lib/capybara/node/finders.rb +2 -0
  5. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  6. data/lib/capybara/rack_test/node.rb +18 -15
  7. data/lib/capybara/registrations/drivers.rb +3 -3
  8. data/lib/capybara/registrations/servers.rb +16 -4
  9. data/lib/capybara/rspec/matcher_proxies.rb +3 -3
  10. data/lib/capybara/rspec/matchers/base.rb +8 -6
  11. data/lib/capybara/rspec/matchers/compound.rb +1 -1
  12. data/lib/capybara/selector/definition/link.rb +2 -1
  13. data/lib/capybara/selenium/driver.rb +4 -4
  14. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +8 -4
  15. data/lib/capybara/selenium/extensions/html5_drag.rb +3 -0
  16. data/lib/capybara/selenium/node.rb +8 -10
  17. data/lib/capybara/selenium/nodes/chrome_node.rb +5 -1
  18. data/lib/capybara/selenium/nodes/edge_node.rb +24 -2
  19. data/lib/capybara/selenium/patches/action_pauser.rb +3 -3
  20. data/lib/capybara/selenium/patches/atoms.rb +1 -1
  21. data/lib/capybara/selenium/patches/pause_duration_fix.rb +1 -1
  22. data/lib/capybara/server/animation_disabler.rb +2 -3
  23. data/lib/capybara/spec/public/test.js +4 -0
  24. data/lib/capybara/spec/session/all_spec.rb +1 -1
  25. data/lib/capybara/spec/session/click_link_spec.rb +11 -0
  26. data/lib/capybara/spec/session/find_link_spec.rb +10 -0
  27. data/lib/capybara/spec/session/find_spec.rb +1 -1
  28. data/lib/capybara/spec/session/first_spec.rb +1 -1
  29. data/lib/capybara/spec/session/frame/within_frame_spec.rb +2 -0
  30. data/lib/capybara/spec/session/has_all_selectors_spec.rb +5 -5
  31. data/lib/capybara/spec/session/has_any_selectors_spec.rb +2 -2
  32. data/lib/capybara/spec/session/has_current_path_spec.rb +1 -1
  33. data/lib/capybara/spec/session/has_link_spec.rb +5 -1
  34. data/lib/capybara/spec/session/has_none_selectors_spec.rb +7 -7
  35. data/lib/capybara/spec/session/matches_style_spec.rb +2 -0
  36. data/lib/capybara/spec/session/node_spec.rb +16 -0
  37. data/lib/capybara/spec/session/scroll_spec.rb +3 -1
  38. data/lib/capybara/spec/session/window/windows_spec.rb +1 -1
  39. data/lib/capybara/spec/views/form.erb +4 -0
  40. data/lib/capybara/spec/views/with_html.erb +1 -1
  41. data/lib/capybara/version.rb +1 -1
  42. data/spec/css_builder_spec.rb +1 -1
  43. data/spec/css_splitter_spec.rb +1 -1
  44. data/spec/rack_test_spec.rb +2 -2
  45. data/spec/rspec/scenarios_spec.rb +1 -1
  46. data/spec/rspec_matchers_spec.rb +25 -0
  47. data/spec/sauce_spec_chrome.rb +1 -1
  48. data/spec/selenium_spec_chrome.rb +5 -6
  49. data/spec/selenium_spec_chrome_remote.rb +5 -7
  50. data/spec/selenium_spec_edge.rb +11 -7
  51. data/spec/selenium_spec_firefox.rb +10 -4
  52. data/spec/selenium_spec_firefox_remote.rb +16 -3
  53. data/spec/selenium_spec_ie.rb +1 -1
  54. data/spec/selenium_spec_safari.rb +1 -1
  55. data/spec/server_spec.rb +2 -2
  56. data/spec/shared_selenium_session.rb +2 -1
  57. data/spec/spec_helper.rb +33 -0
  58. data/spec/whitespace_normalizer_spec.rb +54 -0
  59. data/spec/xpath_builder_spec.rb +1 -1
  60. metadata +4 -2
@@ -281,6 +281,7 @@ 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)
284
285
  pending "Geckodriver doesn't fully support shadow root yet" if firefox?(session)
285
286
  session.visit('/with_shadow')
286
287
  shadow = session.find(:css, '#shadow_host')
@@ -344,7 +345,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
344
345
  it 'can attach a directory' do
345
346
  pending "Geckodriver doesn't support uploading a directory" if firefox?(session)
346
347
  pending "Selenium remote doesn't support transferring a directory" if remote?(session)
347
- 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.fetch('HEADLESS', nil)
348
+ 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) && chrome_lt?(110, session) && ENV.fetch('HEADLESS', nil)
348
349
  pending "IE doesn't support uploading a directory" if ie?(session)
349
350
  pending 'Chrome/chromedriver 73 breaks this' if chrome?(session) && chrome_gte?(73, session) && chrome_lt?(75, session)
350
351
 
data/spec/spec_helper.rb CHANGED
@@ -28,6 +28,18 @@ module Capybara
28
28
  firefox?(session) && (session.driver.browser.capabilities[:browser_version].to_f >= version)
29
29
  end
30
30
 
31
+ def geckodriver_version(session)
32
+ Gem::Version.new(session.driver.browser.capabilities['moz:geckodriverVersion'])
33
+ end
34
+
35
+ def geckodriver_gte?(version, session)
36
+ firefox?(session) && geckodriver_version(session) >= Gem::Version.new(version)
37
+ end
38
+
39
+ def geckodriver_lt?(version, session)
40
+ firefox?(session) && geckodriver_version(session) < Gem::Version.new(version)
41
+ end
42
+
31
43
  def chrome?(session)
32
44
  browser_name(session) == :chrome
33
45
  end
@@ -45,6 +57,27 @@ module Capybara
45
57
  chrome?(session) && (chrome_version(session) >= version)
46
58
  end
47
59
 
60
+ def chromedriver_version(session)
61
+ Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0])
62
+ end
63
+
64
+ def chromedriver_gte?(version, session)
65
+ chrome?(session) && chromedriver_version(session) >= Gem::Version.new(version)
66
+ end
67
+
68
+ def chromedriver_lt?(version, session)
69
+ chrome?(session) && chromedriver_version(session) < Gem::Version.new(version)
70
+ end
71
+
72
+ def selenium?(session)
73
+ session.driver.is_a? Capybara::Selenium::Driver
74
+ end
75
+
76
+ def selenium_lt?(version, session)
77
+ selenium?(session) &&
78
+ Gem::Version.new(::Selenium::WebDriver::VERSION) < Gem::Version.new(version)
79
+ end
80
+
48
81
  def edge?(session)
49
82
  browser_name(session).to_s.start_with?('edge')
50
83
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'capybara/node/whitespace_normalizer'
5
+
6
+ RSpec.describe Capybara::Node::WhitespaceNormalizer do
7
+ subject(:normalizer) do
8
+ klass = Class.new do
9
+ include Capybara::Node::WhitespaceNormalizer
10
+ end
11
+
12
+ klass.new
13
+ end
14
+
15
+ let(:text_needing_correction) do
16
+ <<~TEXT
17
+ Some #{described_class::NON_BREAKING_SPACE}text
18
+ #{described_class::RIGHT_TO_LEFT_MARK}
19
+ #{described_class::ZERO_WIDTH_SPACE * 30}
20
+ #{described_class::LEFT_TO_RIGHT_MARK}
21
+ Here
22
+ TEXT
23
+ end
24
+
25
+ describe '#normalize_spacing' do
26
+ it 'does nothing to text not containing special characters' do
27
+ expect(normalizer.normalize_spacing('text')).to eq('text')
28
+ end
29
+
30
+ it 'compresses excess breaking spacing' do
31
+ expect(
32
+ normalizer.normalize_spacing(text_needing_correction)
33
+ ).to eq('Some text Here')
34
+ end
35
+ end
36
+
37
+ describe '#normalize_visible_spacing' do
38
+ it 'does nothing to text not containing special characters' do
39
+ expect(normalizer.normalize_visible_spacing('text')).to eq('text')
40
+ end
41
+
42
+ it 'compresses excess breaking visible spacing' do
43
+ expect(
44
+ normalizer.normalize_visible_spacing(text_needing_correction)
45
+ ).to eq <<~TEXT.chomp
46
+ Some text
47
+ #{described_class::RIGHT_TO_LEFT_MARK}
48
+ #{described_class::ZERO_WIDTH_SPACE * 30}
49
+ #{described_class::LEFT_TO_RIGHT_MARK}
50
+ Here
51
+ TEXT
52
+ end
53
+ end
54
+ end
@@ -5,7 +5,7 @@ require 'spec_helper'
5
5
  # rubocop:disable RSpec/InstanceVariable
6
6
  RSpec.describe Capybara::Selector::XPathBuilder do
7
7
  let :builder do
8
- ::Capybara::Selector::XPathBuilder.new(@xpath)
8
+ described_class.new(@xpath)
9
9
  end
10
10
 
11
11
  context 'add_attribute_conditions' do
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.38.0
4
+ version: 3.39.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: 2022-11-04 00:00:00.000000000 Z
12
+ date: 2023-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -487,6 +487,7 @@ files:
487
487
  - lib/capybara/node/finders.rb
488
488
  - lib/capybara/node/matchers.rb
489
489
  - lib/capybara/node/simple.rb
490
+ - lib/capybara/node/whitespace_normalizer.rb
490
491
  - lib/capybara/queries/active_element_query.rb
491
492
  - lib/capybara/queries/ancestor_query.rb
492
493
  - lib/capybara/queries/base_query.rb
@@ -781,6 +782,7 @@ files:
781
782
  - spec/shared_selenium_node.rb
782
783
  - spec/shared_selenium_session.rb
783
784
  - spec/spec_helper.rb
785
+ - spec/whitespace_normalizer_spec.rb
784
786
  - spec/xpath_builder_spec.rb
785
787
  homepage: https://github.com/teamcapybara/capybara
786
788
  licenses: