capybara 3.35.3 → 3.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +90 -4
  3. data/README.md +28 -12
  4. data/lib/capybara/config.rb +16 -4
  5. data/lib/capybara/driver/base.rb +4 -0
  6. data/lib/capybara/driver/node.rb +5 -1
  7. data/lib/capybara/dsl.rb +4 -10
  8. data/lib/capybara/helpers.rb +8 -13
  9. data/lib/capybara/minitest/spec.rb +2 -2
  10. data/lib/capybara/node/actions.rb +10 -5
  11. data/lib/capybara/node/base.rb +2 -1
  12. data/lib/capybara/node/document.rb +2 -2
  13. data/lib/capybara/node/element.rb +13 -2
  14. data/lib/capybara/node/finders.rb +9 -2
  15. data/lib/capybara/node/simple.rb +5 -1
  16. data/lib/capybara/queries/active_element_query.rb +18 -0
  17. data/lib/capybara/queries/ancestor_query.rb +2 -1
  18. data/lib/capybara/queries/base_query.rb +2 -2
  19. data/lib/capybara/queries/current_path_query.rb +1 -1
  20. data/lib/capybara/queries/selector_query.rb +38 -10
  21. data/lib/capybara/queries/sibling_query.rb +2 -1
  22. data/lib/capybara/queries/text_query.rb +1 -1
  23. data/lib/capybara/rack_test/browser.rb +63 -8
  24. data/lib/capybara/rack_test/driver.rb +4 -4
  25. data/lib/capybara/rack_test/form.rb +29 -7
  26. data/lib/capybara/rack_test/node.rb +10 -7
  27. data/lib/capybara/registration_container.rb +0 -3
  28. data/lib/capybara/registrations/drivers.rb +3 -3
  29. data/lib/capybara/registrations/servers.rb +17 -9
  30. data/lib/capybara/rspec/matcher_proxies.rb +3 -3
  31. data/lib/capybara/rspec/matchers/have_selector.rb +5 -5
  32. data/lib/capybara/rspec/matchers.rb +14 -14
  33. data/lib/capybara/selector/builders/css_builder.rb +1 -1
  34. data/lib/capybara/selector/builders/xpath_builder.rb +1 -1
  35. data/lib/capybara/selector/css.rb +1 -1
  36. data/lib/capybara/selector/definition/button.rb +9 -4
  37. data/lib/capybara/selector/definition/checkbox.rb +1 -1
  38. data/lib/capybara/selector/definition/file_field.rb +1 -1
  39. data/lib/capybara/selector/definition/fillable_field.rb +1 -1
  40. data/lib/capybara/selector/definition/radio_button.rb +1 -1
  41. data/lib/capybara/selector/definition.rb +4 -2
  42. data/lib/capybara/selector/filter_set.rb +4 -7
  43. data/lib/capybara/selector/regexp_disassembler.rb +2 -5
  44. data/lib/capybara/selector/selector.rb +5 -1
  45. data/lib/capybara/selector.rb +1 -0
  46. data/lib/capybara/selenium/driver.rb +28 -11
  47. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +1 -1
  48. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +1 -1
  49. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +1 -1
  50. data/lib/capybara/selenium/extensions/html5_drag.rb +2 -4
  51. data/lib/capybara/selenium/logger_suppressor.rb +4 -0
  52. data/lib/capybara/selenium/node.rb +74 -23
  53. data/lib/capybara/selenium/nodes/chrome_node.rb +1 -1
  54. data/lib/capybara/selenium/nodes/edge_node.rb +1 -1
  55. data/lib/capybara/selenium/nodes/firefox_node.rb +3 -3
  56. data/lib/capybara/selenium/nodes/safari_node.rb +4 -4
  57. data/lib/capybara/server/animation_disabler.rb +41 -23
  58. data/lib/capybara/server/middleware.rb +1 -1
  59. data/lib/capybara/session/config.rb +4 -2
  60. data/lib/capybara/session.rb +31 -32
  61. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  62. data/lib/capybara/spec/session/all_spec.rb +9 -13
  63. data/lib/capybara/spec/session/assert_text_spec.rb +17 -17
  64. data/lib/capybara/spec/session/attach_file_spec.rb +6 -0
  65. data/lib/capybara/spec/session/check_spec.rb +10 -0
  66. data/lib/capybara/spec/session/choose_spec.rb +6 -0
  67. data/lib/capybara/spec/session/current_scope_spec.rb +1 -1
  68. data/lib/capybara/spec/session/fill_in_spec.rb +6 -0
  69. data/lib/capybara/spec/session/find_spec.rb +6 -0
  70. data/lib/capybara/spec/session/has_ancestor_spec.rb +2 -2
  71. data/lib/capybara/spec/session/has_any_selectors_spec.rb +4 -0
  72. data/lib/capybara/spec/session/has_button_spec.rb +30 -0
  73. data/lib/capybara/spec/session/has_current_path_spec.rb +2 -2
  74. data/lib/capybara/spec/session/has_field_spec.rb +25 -1
  75. data/lib/capybara/spec/session/has_link_spec.rb +36 -0
  76. data/lib/capybara/spec/session/has_select_spec.rb +10 -4
  77. data/lib/capybara/spec/session/has_selector_spec.rb +15 -0
  78. data/lib/capybara/spec/session/has_text_spec.rb +6 -14
  79. data/lib/capybara/spec/session/node_spec.rb +66 -1
  80. data/lib/capybara/spec/session/reset_session_spec.rb +13 -0
  81. data/lib/capybara/spec/session/scroll_spec.rb +4 -4
  82. data/lib/capybara/spec/session/visit_spec.rb +20 -0
  83. data/lib/capybara/spec/session/window/window_spec.rb +1 -1
  84. data/lib/capybara/spec/session/within_spec.rb +13 -0
  85. data/lib/capybara/spec/spec_helper.rb +12 -5
  86. data/lib/capybara/spec/test_app.rb +91 -14
  87. data/lib/capybara/spec/views/animated.erb +1 -1
  88. data/lib/capybara/spec/views/form.erb +24 -3
  89. data/lib/capybara/spec/views/frame_child.erb +1 -1
  90. data/lib/capybara/spec/views/frame_one.erb +1 -1
  91. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  92. data/lib/capybara/spec/views/frame_two.erb +1 -1
  93. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  94. data/lib/capybara/spec/views/layout.erb +10 -0
  95. data/lib/capybara/spec/views/obscured.erb +1 -1
  96. data/lib/capybara/spec/views/offset.erb +2 -1
  97. data/lib/capybara/spec/views/path.erb +2 -2
  98. data/lib/capybara/spec/views/popup_one.erb +1 -1
  99. data/lib/capybara/spec/views/popup_two.erb +1 -1
  100. data/lib/capybara/spec/views/react.erb +2 -2
  101. data/lib/capybara/spec/views/scroll.erb +2 -1
  102. data/lib/capybara/spec/views/spatial.erb +1 -1
  103. data/lib/capybara/spec/views/with_animation.erb +2 -3
  104. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  105. data/lib/capybara/spec/views/with_dragula.erb +2 -2
  106. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  107. data/lib/capybara/spec/views/with_hover.erb +2 -2
  108. data/lib/capybara/spec/views/with_html.erb +3 -3
  109. data/lib/capybara/spec/views/with_jquery_animation.erb +1 -1
  110. data/lib/capybara/spec/views/with_js.erb +2 -3
  111. data/lib/capybara/spec/views/with_jstree.erb +1 -1
  112. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  113. data/lib/capybara/spec/views/with_scope.erb +2 -2
  114. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  115. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  116. data/lib/capybara/spec/views/with_sortable_js.erb +2 -2
  117. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  118. data/lib/capybara/spec/views/with_windows.erb +1 -1
  119. data/lib/capybara/spec/views/within_frames.erb +1 -1
  120. data/lib/capybara/version.rb +1 -1
  121. data/lib/capybara/window.rb +1 -1
  122. data/lib/capybara.rb +23 -24
  123. data/spec/basic_node_spec.rb +16 -3
  124. data/spec/capybara_spec.rb +12 -0
  125. data/spec/counter_spec.rb +35 -0
  126. data/spec/dsl_spec.rb +5 -3
  127. data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -2
  128. data/spec/fixtures/selenium_driver_rspec_success.rb +2 -2
  129. data/spec/minitest_spec.rb +4 -0
  130. data/spec/minitest_spec_spec.rb +4 -0
  131. data/spec/per_session_config_spec.rb +1 -1
  132. data/spec/rack_test_spec.rb +28 -10
  133. data/spec/result_spec.rb +32 -35
  134. data/spec/rspec/features_spec.rb +3 -3
  135. data/spec/rspec/scenarios_spec.rb +1 -1
  136. data/spec/rspec/shared_spec_matchers.rb +3 -3
  137. data/spec/rspec_spec.rb +2 -2
  138. data/spec/sauce_spec_chrome.rb +3 -3
  139. data/spec/selector_spec.rb +4 -4
  140. data/spec/selenium_spec_chrome.rb +11 -10
  141. data/spec/selenium_spec_chrome_remote.rb +11 -8
  142. data/spec/selenium_spec_edge.rb +2 -0
  143. data/spec/selenium_spec_firefox.rb +15 -4
  144. data/spec/selenium_spec_firefox_remote.rb +4 -2
  145. data/spec/selenium_spec_ie.rb +6 -7
  146. data/spec/selenium_spec_safari.rb +33 -19
  147. data/spec/server_spec.rb +5 -5
  148. data/spec/shared_selenium_node.rb +0 -4
  149. data/spec/shared_selenium_session.rb +23 -14
  150. data/spec/spec_helper.rb +1 -1
  151. metadata +38 -14
  152. data/lib/capybara/spec/views/with_title.erb +0 -5
@@ -23,7 +23,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
23
23
  it 'freshly reset session should not be touched' do
24
24
  session.instance_variable_set(:@touched, true)
25
25
  session.reset!
26
- expect(session.instance_variable_get(:@touched)).to eq false
26
+ expect(session.instance_variable_get(:@touched)).to be false
27
27
  end
28
28
  end
29
29
 
@@ -74,7 +74,6 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
74
74
 
75
75
  describe '#fill_in_with empty string and no options' do
76
76
  it 'should trigger change when clearing a field' do
77
- pending "safaridriver doesn't trigger change for clear" if safari?(session)
78
77
  session.visit('/with_js')
79
78
  session.fill_in('with_change_event', with: '')
80
79
  # click outside the field to trigger the change event
@@ -188,14 +187,12 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
188
187
 
189
188
  it 'should generate standard events on changing value' do
190
189
  pending "IE 11 doesn't support date input type" if ie?(session)
191
- pending "Safari doesn't support date input type" if safari?(session)
192
190
  session.fill_in('form_date', with: Date.today)
193
191
  expect(session.evaluate_script('window.capybara_formDateFiredEvents')).to eq %w[focus input change]
194
192
  end
195
193
 
196
194
  it 'should not generate input and change events if the value is not changed' do
197
195
  pending "IE 11 doesn't support date input type" if ie?(session)
198
- pending "Safari doesn't support date input type" if safari?(session)
199
196
  session.fill_in('form_date', with: Date.today)
200
197
  session.fill_in('form_date', with: Date.today)
201
198
  # Chrome adds an extra focus for some reason - ok for now
@@ -223,14 +220,14 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
223
220
  end
224
221
 
225
222
  describe '#send_keys' do
226
- it 'defaults to sending keys to the document.activeElement' do
223
+ it 'defaults to sending keys to the active_element' do
227
224
  session.visit('/form')
228
225
 
229
- expect(session.evaluate_script('document.activeElement')).to eq(session.find('//body'))
226
+ expect(session.active_element).to match_selector(:css, 'body')
230
227
 
231
228
  session.send_keys(:tab)
232
229
 
233
- expect(session.evaluate_script('document.activeElement')).to eq(session.first(:field))
230
+ expect(session.active_element).to match_selector(:css, '[tabindex="1"]')
234
231
  end
235
232
  end
236
233
 
@@ -283,6 +280,14 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
283
280
  expect(element).to eq session.find(:id, 'form_title')
284
281
  end
285
282
 
283
+ it 'returns a shadow root' do
284
+ pending "Geckodriver doesn't fully support shadow root yet" if firefox?(session)
285
+ session.visit('/with_shadow')
286
+ shadow = session.find(:css, '#shadow_host')
287
+ element = session.evaluate_script('arguments[0].shadowRoot', shadow)
288
+ expect(element).to be_instance_of(Capybara::Node::Element)
289
+ end
290
+
286
291
  it 'can return arrays of nested elements' do
287
292
  session.visit('/form')
288
293
  elements = session.evaluate_script('document.querySelectorAll("#form_city option")')
@@ -339,17 +344,15 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
339
344
  it 'can attach a directory' do
340
345
  pending "Geckodriver doesn't support uploading a directory" if firefox?(session)
341
346
  pending "Selenium remote doesn't support transferring a directory" if remote?(session)
342
- 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']
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)
343
348
  pending "IE doesn't support uploading a directory" if ie?(session)
344
349
  pending 'Chrome/chromedriver 73 breaks this' if chrome?(session) && chrome_gte?(73, session) && chrome_lt?(75, session)
345
- pending "Safari doesn't support uploading a directory" if safari?(session)
346
- # pending "Edge/msedgedriver doesn't support directory upload" if edge?(session) && edge_gte?(75, session)
347
350
 
348
351
  session.visit('/form')
349
352
  test_file_dir = File.expand_path('./fixtures', File.dirname(__FILE__))
350
353
  session.attach_file('Directory Upload', test_file_dir)
351
354
  session.click_button('Upload Multiple')
352
- expect(session.body).to include('5 | ') # number of files
355
+ expect(session).to have_text('5 | ') # number of files
353
356
  end
354
357
 
355
358
  it 'can attach a relative file' do
@@ -358,7 +361,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
358
361
  session.visit('/form')
359
362
  session.attach_file('Single Document', 'spec/fixtures/capybara.csv')
360
363
  session.click_button('Upload Single')
361
- expect(session.body).to include('Content-type: text/csv')
364
+ expect(session).to have_text('Content-type: text/csv')
362
365
  end
363
366
  end
364
367
 
@@ -381,6 +384,12 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
381
384
  @animation_session = Capybara::Session.new(session.mode, TestApp.new)
382
385
  end
383
386
 
387
+ it 'should add CSS to the <head> element' do
388
+ @animation_session.visit('with_animation')
389
+
390
+ expect(@animation_session).to have_selector(:css, 'head > style', text: 'transition: none', visible: :hidden)
391
+ end
392
+
384
393
  it 'should disable CSS transitions' do
385
394
  @animation_session.visit('with_animation')
386
395
  @animation_session.click_link('transition me away')
@@ -514,8 +523,8 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
514
523
 
515
524
  it 'can query attributes with strange characters' do
516
525
  session.visit('/form')
517
- expect(session).to have_selector(:element, "{custom}": true)
518
- expect(session).to have_selector(:element, "{custom}": 'abcdef')
526
+ expect(session).to have_selector(:element, '{custom}': true)
527
+ expect(session).to have_selector(:element, '{custom}': 'abcdef')
519
528
  end
520
529
  end
521
530
 
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['CI'] || ENV['WEBDRIVERS']
4
+ require 'webdrivers' if ENV.fetch('CI', nil) || ENV.fetch('WEBDRIVERS', nil)
5
5
  require 'selenium_statistics'
6
6
  if ENV['TRAVIS']
7
7
  require 'coveralls'
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.35.3
4
+ version: 3.38.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Walpole
8
8
  - Jonas Nicklas
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
- cert_chain:
12
- - gem-public_cert.pem
13
- date: 2021-01-30 00:00:00.000000000 Z
11
+ cert_chain: []
12
+ date: 2022-11-04 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: addressable
@@ -26,6 +25,20 @@ dependencies:
26
25
  - - ">="
27
26
  - !ruby/object:Gem::Version
28
27
  version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: matrix
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
29
42
  - !ruby/object:Gem::Dependency
30
43
  name: mini_mime
31
44
  requirement: !ruby/object:Gem::Requirement
@@ -372,16 +385,22 @@ dependencies:
372
385
  name: selenium-webdriver
373
386
  requirement: !ruby/object:Gem::Requirement
374
387
  requirements:
375
- - - "~>"
388
+ - - ">="
389
+ - !ruby/object:Gem::Version
390
+ version: 3.142.7
391
+ - - "<"
376
392
  - !ruby/object:Gem::Version
377
- version: '3.5'
393
+ version: '5.0'
378
394
  type: :development
379
395
  prerelease: false
380
396
  version_requirements: !ruby/object:Gem::Requirement
381
397
  requirements:
382
- - - "~>"
398
+ - - ">="
399
+ - !ruby/object:Gem::Version
400
+ version: 3.142.7
401
+ - - "<"
383
402
  - !ruby/object:Gem::Version
384
- version: '3.5'
403
+ version: '5.0'
385
404
  - !ruby/object:Gem::Dependency
386
405
  name: sinatra
387
406
  requirement: !ruby/object:Gem::Requirement
@@ -468,6 +487,7 @@ files:
468
487
  - lib/capybara/node/finders.rb
469
488
  - lib/capybara/node/matchers.rb
470
489
  - lib/capybara/node/simple.rb
490
+ - lib/capybara/queries/active_element_query.rb
471
491
  - lib/capybara/queries/ancestor_query.rb
472
492
  - lib/capybara/queries/base_query.rb
473
493
  - lib/capybara/queries/current_path_query.rb
@@ -587,6 +607,7 @@ files:
587
607
  - lib/capybara/spec/session/accept_alert_spec.rb
588
608
  - lib/capybara/spec/session/accept_confirm_spec.rb
589
609
  - lib/capybara/spec/session/accept_prompt_spec.rb
610
+ - lib/capybara/spec/session/active_element_spec.rb
590
611
  - lib/capybara/spec/session/all_spec.rb
591
612
  - lib/capybara/spec/session/ancestor_spec.rb
592
613
  - lib/capybara/spec/session/assert_all_of_selectors_spec.rb
@@ -686,6 +707,7 @@ files:
686
707
  - lib/capybara/spec/views/header_links.erb
687
708
  - lib/capybara/spec/views/host_links.erb
688
709
  - lib/capybara/spec/views/initial_alert.erb
710
+ - lib/capybara/spec/views/layout.erb
689
711
  - lib/capybara/spec/views/obscured.erb
690
712
  - lib/capybara/spec/views/offset.erb
691
713
  - lib/capybara/spec/views/path.erb
@@ -712,10 +734,10 @@ files:
712
734
  - lib/capybara/spec/views/with_namespace.erb
713
735
  - lib/capybara/spec/views/with_scope.erb
714
736
  - lib/capybara/spec/views/with_scope_other.erb
737
+ - lib/capybara/spec/views/with_shadow.erb
715
738
  - lib/capybara/spec/views/with_simple_html.erb
716
739
  - lib/capybara/spec/views/with_slow_unload.erb
717
740
  - lib/capybara/spec/views/with_sortable_js.erb
718
- - lib/capybara/spec/views/with_title.erb
719
741
  - lib/capybara/spec/views/with_unload_alert.erb
720
742
  - lib/capybara/spec/views/with_windows.erb
721
743
  - lib/capybara/spec/views/within_frames.erb
@@ -723,6 +745,7 @@ files:
723
745
  - lib/capybara/window.rb
724
746
  - spec/basic_node_spec.rb
725
747
  - spec/capybara_spec.rb
748
+ - spec/counter_spec.rb
726
749
  - spec/css_builder_spec.rb
727
750
  - spec/css_splitter_spec.rb
728
751
  - spec/dsl_spec.rb
@@ -765,7 +788,8 @@ licenses:
765
788
  metadata:
766
789
  changelog_uri: https://github.com/teamcapybara/capybara/blob/master/History.md
767
790
  source_code_uri: https://github.com/teamcapybara/capybara
768
- post_install_message:
791
+ rubygems_mfa_required: 'true'
792
+ post_install_message:
769
793
  rdoc_options: []
770
794
  require_paths:
771
795
  - lib
@@ -773,15 +797,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
773
797
  requirements:
774
798
  - - ">="
775
799
  - !ruby/object:Gem::Version
776
- version: 2.5.0
800
+ version: 2.7.0
777
801
  required_rubygems_version: !ruby/object:Gem::Requirement
778
802
  requirements:
779
803
  - - ">="
780
804
  - !ruby/object:Gem::Version
781
805
  version: '0'
782
806
  requirements: []
783
- rubygems_version: 3.1.2
784
- signing_key:
807
+ rubygems_version: 3.3.7
808
+ signing_key:
785
809
  specification_version: 4
786
810
  summary: Capybara aims to simplify the process of integration testing Rack applications,
787
811
  such as Rails, Sinatra or Merb
@@ -1,5 +0,0 @@
1
-
2
- <title>Test Title</title>
3
- <body>
4
- <svg><title>abcdefg</title></svg>
5
- </body>