capybara 3.37.1 → 3.38.0

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