capybara 3.37.1 → 3.38.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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +34 -4
  3. data/README.md +23 -11
  4. data/lib/capybara/helpers.rb +5 -1
  5. data/lib/capybara/node/base.rb +2 -1
  6. data/lib/capybara/queries/base_query.rb +2 -2
  7. data/lib/capybara/queries/selector_query.rb +4 -2
  8. data/lib/capybara/queries/text_query.rb +1 -1
  9. data/lib/capybara/rack_test/browser.rb +8 -2
  10. data/lib/capybara/rack_test/form.rb +29 -7
  11. data/lib/capybara/registrations/servers.rb +17 -9
  12. data/lib/capybara/selector/definition.rb +1 -1
  13. data/lib/capybara/selector/filter_set.rb +4 -5
  14. data/lib/capybara/selector/regexp_disassembler.rb +2 -5
  15. data/lib/capybara/selenium/driver.rb +3 -0
  16. data/lib/capybara/selenium/extensions/html5_drag.rb +2 -4
  17. data/lib/capybara/selenium/logger_suppressor.rb +4 -0
  18. data/lib/capybara/selenium/node.rb +52 -15
  19. data/lib/capybara/selenium/nodes/firefox_node.rb +2 -2
  20. data/lib/capybara/selenium/nodes/safari_node.rb +2 -2
  21. data/lib/capybara/server/animation_disabler.rb +20 -20
  22. data/lib/capybara/server/middleware.rb +1 -1
  23. data/lib/capybara/session/config.rb +3 -1
  24. data/lib/capybara/session.rb +11 -9
  25. data/lib/capybara/spec/session/attach_file_spec.rb +6 -0
  26. data/lib/capybara/spec/session/check_spec.rb +1 -0
  27. data/lib/capybara/spec/session/current_scope_spec.rb +1 -1
  28. data/lib/capybara/spec/session/fill_in_spec.rb +6 -0
  29. data/lib/capybara/spec/session/find_spec.rb +1 -1
  30. data/lib/capybara/spec/session/has_ancestor_spec.rb +2 -2
  31. data/lib/capybara/spec/session/has_button_spec.rb +6 -0
  32. data/lib/capybara/spec/session/has_link_spec.rb +6 -0
  33. data/lib/capybara/spec/session/has_select_spec.rb +6 -0
  34. data/lib/capybara/spec/session/has_text_spec.rb +4 -8
  35. data/lib/capybara/spec/session/node_spec.rb +24 -1
  36. data/lib/capybara/spec/session/reset_session_spec.rb +13 -0
  37. data/lib/capybara/spec/session/within_spec.rb +13 -0
  38. data/lib/capybara/spec/spec_helper.rb +8 -2
  39. data/lib/capybara/spec/test_app.rb +25 -6
  40. data/lib/capybara/spec/views/form.erb +13 -0
  41. data/lib/capybara/spec/views/with_html.erb +2 -2
  42. data/lib/capybara/spec/views/with_scope.erb +2 -2
  43. data/lib/capybara/version.rb +1 -1
  44. data/lib/capybara.rb +4 -2
  45. data/spec/capybara_spec.rb +12 -0
  46. data/spec/counter_spec.rb +35 -0
  47. data/spec/dsl_spec.rb +2 -0
  48. data/spec/minitest_spec.rb +4 -0
  49. data/spec/minitest_spec_spec.rb +4 -0
  50. data/spec/per_session_config_spec.rb +1 -1
  51. data/spec/rack_test_spec.rb +8 -0
  52. data/spec/rspec/shared_spec_matchers.rb +1 -1
  53. data/spec/rspec_spec.rb +2 -2
  54. data/spec/selector_spec.rb +2 -2
  55. data/spec/selenium_spec_chrome.rb +2 -0
  56. data/spec/selenium_spec_chrome_remote.rb +4 -2
  57. data/spec/selenium_spec_edge.rb +2 -0
  58. data/spec/selenium_spec_firefox.rb +11 -5
  59. data/spec/selenium_spec_firefox_remote.rb +4 -2
  60. data/spec/selenium_spec_ie.rb +3 -1
  61. data/spec/selenium_spec_safari.rb +2 -0
  62. data/spec/shared_selenium_session.rb +3 -4
  63. metadata +3 -2
data/spec/dsl_spec.rb CHANGED
@@ -15,6 +15,8 @@ Capybara::SpecHelper.run_specs TestClass.new, 'DSL', capybara_skip: %i[
15
15
  pending "Nokogiri doesn't support case insensitive CSS attribute matchers"
16
16
  when /#click_button should follow permanent redirects that maintain method/
17
17
  pending "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
18
+ when /#attach_file with multipart form should send prior hidden field if no file submitted/
19
+ skip 'Rack-test < 2 needs an empty file to detect multipart form' if Gem.loaded_specs['rack-test'].version < Gem::Version.new('2.0.0')
18
20
  end
19
21
  end
20
22
 
@@ -15,6 +15,10 @@ class MinitestTest < Minitest::Test
15
15
  Capybara.reset_sessions!
16
16
  end
17
17
 
18
+ def self.test_order
19
+ :sorted
20
+ end
21
+
18
22
  def test_assert_text
19
23
  assert_text('Form', normalize_ws: false)
20
24
  assert_no_text('Not on the page')
@@ -16,6 +16,10 @@ class MinitestSpecTest < Minitest::Spec
16
16
  Capybara.reset_sessions!
17
17
  end
18
18
 
19
+ def self.test_order
20
+ :sorted
21
+ end
22
+
19
23
  it 'supports text expectations' do
20
24
  _(page).must_have_text('Form', minimum: 1)
21
25
  _(page).wont_have_text('Not a form')
@@ -12,7 +12,7 @@ RSpec.describe Capybara::SessionConfig do
12
12
  default_selector default_max_wait_time ignore_hidden_elements
13
13
  automatic_reload match exact raise_server_errors visible_text_only
14
14
  automatic_label_click enable_aria_label save_path
15
- asset_host].each do |m|
15
+ asset_host default_retry_interval].each do |m|
16
16
  expect(session.config.public_send(m)).to eq Capybara.public_send(m)
17
17
  end
18
18
  end
@@ -30,6 +30,8 @@ Capybara::SpecHelper.run_specs TestSessions::RackTest, 'RackTest', capybara_skip
30
30
  skip "Nokogiri doesn't support case insensitive CSS attribute matchers"
31
31
  when /#click_button should follow permanent redirects that maintain method/
32
32
  skip "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
33
+ when /#attach_file with multipart form should send prior hidden field if no file submitted/
34
+ skip 'Rack-test < 2 needs an empty file to detect multipart form' if Gem.loaded_specs['rack-test'].version < Gem::Version.new('2.0.0')
33
35
  end
34
36
  end
35
37
 
@@ -93,6 +95,12 @@ RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
93
95
  session.click_button('Upload Empty')
94
96
  expect(session.html).to include('Successfully ignored empty file field.')
95
97
  end
98
+
99
+ it 'should submit multipart even if no file is submitted' do
100
+ session.visit('/form')
101
+ session.click_button('Upload Empty')
102
+ expect(session.html).to include('Content type was multipart/form-data;')
103
+ end
96
104
  end
97
105
 
98
106
  it 'should not submit an obsolete mime type' do
@@ -120,7 +120,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
120
120
 
121
121
  describe 'have_xpath matcher' do
122
122
  it 'gives proper description' do
123
- expect(have_xpath('//h1').description).to eq("have visible xpath \"\/\/h1\"")
123
+ expect(have_xpath('//h1').description).to eq('have visible xpath "//h1"')
124
124
  end
125
125
 
126
126
  context 'on a string' do
data/spec/rspec_spec.rb CHANGED
@@ -15,7 +15,7 @@ RSpec.describe 'capybara/rspec' do
15
15
  expect(self.class.ancestors).to include Capybara::RSpecMatcherProxies
16
16
  end
17
17
 
18
- context 'resetting session' do
18
+ context 'resetting session', order: :defined do
19
19
  it 'sets a cookie in one example...' do
20
20
  visit('/set_cookie')
21
21
  expect(page.body).to include('Cookie set to test_cookie')
@@ -27,7 +27,7 @@ RSpec.describe 'capybara/rspec' do
27
27
  end
28
28
  end
29
29
 
30
- context 'setting the current driver' do
30
+ context 'setting the current driver', order: :defined do
31
31
  it 'sets the current driver in one example...' do
32
32
  Capybara.current_driver = :selenium
33
33
  end
@@ -111,13 +111,13 @@ RSpec.describe Capybara do
111
111
  end
112
112
 
113
113
  describe 'adding a selector' do
114
- it 'can set default visiblity' do
114
+ it 'can set default visibility' do
115
115
  described_class.add_selector :hidden_field do
116
116
  visible :hidden
117
117
  css { |_sel| 'input[type="hidden"]' }
118
118
  end
119
119
 
120
- expect(string).to have_no_css('input[type="hidden"]')
120
+ expect(string).to have_no_css('input[type="hidden"]') # rubocop:disable RSpec/Capybara/SpecificMatcher
121
121
  expect(string).to have_selector(:hidden_field)
122
122
  end
123
123
  end
@@ -85,6 +85,8 @@ Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_DRIVER.to_s, capybar
85
85
  skip 'Need to figure out testing of file downloading on windows platform' if Gem.win_platform?
86
86
  when /Capybara::Session selenium_chrome Capybara::Window#maximize/
87
87
  pending "Chrome headless doesn't support maximize" if ENV['HEADLESS']
88
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
89
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
88
90
  end
89
91
  end
90
92
 
@@ -21,8 +21,8 @@ def ensure_selenium_running!
21
21
  rescue StandardError
22
22
  if timer.expired?
23
23
  raise 'Selenium is not running. ' \
24
- "You can run a selenium server easily with: \n" \
25
- ' $ docker-compose up -d selenium_chrome'
24
+ "You can run a selenium server easily with: \n " \
25
+ '$ docker-compose up -d selenium_chrome'
26
26
  else
27
27
  puts 'Waiting for Selenium docker instance...'
28
28
  sleep 1
@@ -62,6 +62,8 @@ Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_REMOTE_DRIVER.to_s,
62
62
  'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once for each set of files uploaded',
63
63
  'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
64
64
  pending "Selenium with Remote Chrome doesn't support multiple file upload" unless selenium_gte?(3.14)
65
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
66
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
65
67
  end
66
68
  end
67
69
 
@@ -36,6 +36,8 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, 'selenium', capybara_
36
36
  case example.metadata[:full_description]
37
37
  when 'Capybara::Session selenium #attach_file with a block can upload by clicking the file input'
38
38
  pending "EdgeChrome doesn't allow clicking on file inputs"
39
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
40
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
39
41
  end
40
42
  end
41
43
 
@@ -68,14 +68,20 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capyba
68
68
  when 'Capybara::Session selenium #reset_session! removes ALL cookies'
69
69
  pending "Geckodriver doesn't provide a way to remove cookies outside the current domain"
70
70
  when /drag_to.*HTML5/
71
- pending "Firefox < 62 doesn't support a DataTransfer constuctor" if firefox_lt?(62.0, @session)
71
+ pending "Firefox < 62 doesn't support a DataTransfer constructor" if firefox_lt?(62.0, @session)
72
72
  when 'Capybara::Session selenium #accept_alert should handle the alert if the page changes',
73
73
  'Capybara::Session selenium #accept_alert with an asynchronous alert should accept the alert'
74
74
  skip 'No clue what Firefox is doing here - works fine on MacOS locally'
75
- when 'Capybara::Session selenium node #shadow_root should get the shadow root',
76
- 'Capybara::Session selenium node #shadow_root should find elements inside the shadow dom using CSS',
77
- 'Capybara::Session selenium node #shadow_root should find nested shadow roots'
78
- pending "Firefox doesn't yet have W3C shadow root support"
75
+ when 'Capybara::Session selenium node #shadow_root should find elements inside the shadow dom using CSS',
76
+ 'Capybara::Session selenium node #shadow_root should find nested shadow roots',
77
+ 'Capybara::Session selenium node #shadow_root should click on elements',
78
+ 'Capybara::Session selenium node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
79
+ 'Capybara::Session with firefox with selenium driver #evaluate_script returns a shadow root'
80
+ pending "Firefox doesn't yet have full W3C shadow root support"
81
+ when 'Capybara::Session selenium #fill_in should handle carriage returns with line feeds in a textarea correctly'
82
+ pending 'Not sure what firefox is doing here'
83
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
84
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
79
85
  end
80
86
  end
81
87
 
@@ -21,8 +21,8 @@ def ensure_selenium_running!
21
21
  rescue StandardError
22
22
  if timer.expired?
23
23
  raise 'Selenium is not running. ' \
24
- "You can run a selenium server easily with: \n" \
25
- ' $ docker-compose up -d selenium_firefox'
24
+ "You can run a selenium server easily with: \n. " \
25
+ '$ docker-compose up -d selenium_firefox'
26
26
  else
27
27
  puts 'Waiting for Selenium docker instance...'
28
28
  sleep 1
@@ -65,6 +65,8 @@ Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVE
65
65
  when /#accept_confirm should work with nested modals$/
66
66
  # skip because this is timing based and hence flaky when set to pending
67
67
  skip 'Broken in FF 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1487358' if firefox_gte?(63, @session)
68
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
69
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
68
70
  end
69
71
  end
70
72
 
@@ -103,11 +103,13 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, 'selenium', capybara_sk
103
103
  when /#attach_file with a block/
104
104
  skip 'Hangs IE testing for unknown reason'
105
105
  when /drag_to.*HTML5/
106
- pending "IE doesn't support a DataTransfer constuctor"
106
+ pending "IE doesn't support a DataTransfer constructor"
107
107
  when /template elements should not be visible/
108
108
  skip "IE doesn't support template elements"
109
109
  when /Element#drop/
110
110
  pending "IE doesn't support DataTransfer constructor"
111
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
112
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
111
113
  end
112
114
  end
113
115
 
@@ -88,6 +88,8 @@ Capybara::SpecHelper.run_specs TestSessions::Safari, SAFARI_DRIVER.to_s, capybar
88
88
  'Capybara::Session selenium node #shadow_root should find elements inside the shadow dom using CSS',
89
89
  'Capybara::Session selenium node #shadow_root should find nested shadow roots'
90
90
  pending "Safari doesn't yet have W3C shadow root support"
91
+ when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
92
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
91
93
  end
92
94
  end
93
95
 
@@ -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
+ pending "Geckodriver doesn't fully support shadow root yet" if firefox?(session)
284
285
  session.visit('/with_shadow')
285
286
  shadow = session.find(:css, '#shadow_host')
286
287
  element = session.evaluate_script('arguments[0].shadowRoot', shadow)
@@ -346,14 +347,12 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
346
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)
347
348
  pending "IE doesn't support uploading a directory" if ie?(session)
348
349
  pending 'Chrome/chromedriver 73 breaks this' if chrome?(session) && chrome_gte?(73, session) && chrome_lt?(75, session)
349
- pending "Safari doesn't support uploading a directory" if safari?(session)
350
- # pending "Edge/msedgedriver doesn't support directory upload" if edge?(session) && edge_gte?(75, session)
351
350
 
352
351
  session.visit('/form')
353
352
  test_file_dir = File.expand_path('./fixtures', File.dirname(__FILE__))
354
353
  session.attach_file('Directory Upload', test_file_dir)
355
354
  session.click_button('Upload Multiple')
356
- expect(session.body).to include('5 | ') # number of files
355
+ expect(session).to have_text('5 | ') # number of files
357
356
  end
358
357
 
359
358
  it 'can attach a relative file' do
@@ -362,7 +361,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
362
361
  session.visit('/form')
363
362
  session.attach_file('Single Document', 'spec/fixtures/capybara.csv')
364
363
  session.click_button('Upload Single')
365
- expect(session.body).to include('Content-type: text/csv')
364
+ expect(session).to have_text('Content-type: text/csv')
366
365
  end
367
366
  end
368
367
 
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.37.1
4
+ version: 3.38.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-05-09 00:00:00.000000000 Z
12
+ date: 2022-11-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -745,6 +745,7 @@ files:
745
745
  - lib/capybara/window.rb
746
746
  - spec/basic_node_spec.rb
747
747
  - spec/capybara_spec.rb
748
+ - spec/counter_spec.rb
748
749
  - spec/css_builder_spec.rb
749
750
  - spec/css_splitter_spec.rb
750
751
  - spec/dsl_spec.rb