capybara 3.16.1 → 3.33.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +321 -0
  4. data/README.md +51 -60
  5. data/lib/capybara.rb +71 -114
  6. data/lib/capybara/config.rb +8 -5
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/node.rb +15 -3
  9. data/lib/capybara/dsl.rb +10 -2
  10. data/lib/capybara/helpers.rb +5 -3
  11. data/lib/capybara/minitest.rb +242 -141
  12. data/lib/capybara/minitest/spec.rb +159 -90
  13. data/lib/capybara/node/actions.rb +85 -74
  14. data/lib/capybara/node/base.rb +4 -4
  15. data/lib/capybara/node/document.rb +2 -2
  16. data/lib/capybara/node/document_matchers.rb +3 -3
  17. data/lib/capybara/node/element.rb +216 -117
  18. data/lib/capybara/node/finders.rb +65 -65
  19. data/lib/capybara/node/matchers.rb +228 -126
  20. data/lib/capybara/node/simple.rb +9 -4
  21. data/lib/capybara/queries/ancestor_query.rb +5 -7
  22. data/lib/capybara/queries/base_query.rb +2 -1
  23. data/lib/capybara/queries/current_path_query.rb +1 -1
  24. data/lib/capybara/queries/selector_query.rb +296 -30
  25. data/lib/capybara/queries/sibling_query.rb +5 -4
  26. data/lib/capybara/queries/style_query.rb +2 -2
  27. data/lib/capybara/queries/text_query.rb +13 -1
  28. data/lib/capybara/queries/title_query.rb +1 -1
  29. data/lib/capybara/rack_test/browser.rb +7 -2
  30. data/lib/capybara/rack_test/driver.rb +1 -1
  31. data/lib/capybara/rack_test/form.rb +1 -1
  32. data/lib/capybara/rack_test/node.rb +43 -7
  33. data/lib/capybara/registration_container.rb +44 -0
  34. data/lib/capybara/registrations/drivers.rb +36 -0
  35. data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
  36. data/lib/capybara/registrations/servers.rb +44 -0
  37. data/lib/capybara/result.rb +36 -8
  38. data/lib/capybara/rspec/matcher_proxies.rb +6 -4
  39. data/lib/capybara/rspec/matchers.rb +100 -63
  40. data/lib/capybara/rspec/matchers/base.rb +23 -10
  41. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  42. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  43. data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
  44. data/lib/capybara/rspec/matchers/have_selector.rb +16 -8
  45. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  46. data/lib/capybara/rspec/matchers/have_text.rb +4 -4
  47. data/lib/capybara/rspec/matchers/have_title.rb +2 -2
  48. data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
  49. data/lib/capybara/rspec/matchers/match_style.rb +2 -2
  50. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  51. data/lib/capybara/selector.rb +219 -588
  52. data/lib/capybara/selector/builders/css_builder.rb +10 -6
  53. data/lib/capybara/selector/builders/xpath_builder.rb +1 -1
  54. data/lib/capybara/selector/css.rb +4 -2
  55. data/lib/capybara/selector/definition.rb +277 -0
  56. data/lib/capybara/selector/definition/button.rb +52 -0
  57. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  58. data/lib/capybara/selector/definition/css.rb +10 -0
  59. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  60. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  61. data/lib/capybara/selector/definition/element.rb +27 -0
  62. data/lib/capybara/selector/definition/field.rb +40 -0
  63. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  64. data/lib/capybara/selector/definition/file_field.rb +13 -0
  65. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  66. data/lib/capybara/selector/definition/frame.rb +17 -0
  67. data/lib/capybara/selector/definition/id.rb +6 -0
  68. data/lib/capybara/selector/definition/label.rb +62 -0
  69. data/lib/capybara/selector/definition/link.rb +54 -0
  70. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  71. data/lib/capybara/selector/definition/option.rb +27 -0
  72. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  73. data/lib/capybara/selector/definition/select.rb +81 -0
  74. data/lib/capybara/selector/definition/table.rb +109 -0
  75. data/lib/capybara/selector/definition/table_row.rb +21 -0
  76. data/lib/capybara/selector/definition/xpath.rb +5 -0
  77. data/lib/capybara/selector/filter_set.rb +13 -9
  78. data/lib/capybara/selector/filters/base.rb +11 -2
  79. data/lib/capybara/selector/filters/locator_filter.rb +13 -3
  80. data/lib/capybara/selector/regexp_disassembler.rb +9 -2
  81. data/lib/capybara/selector/selector.rb +43 -448
  82. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  83. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  84. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  85. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  86. data/lib/capybara/selenium/driver.rb +125 -56
  87. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +73 -17
  88. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
  89. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +41 -2
  90. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +14 -1
  91. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +14 -5
  92. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  93. data/lib/capybara/selenium/extensions/find.rb +67 -45
  94. data/lib/capybara/selenium/extensions/html5_drag.rb +152 -36
  95. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  96. data/lib/capybara/selenium/logger_suppressor.rb +34 -0
  97. data/lib/capybara/selenium/node.rb +227 -56
  98. data/lib/capybara/selenium/nodes/chrome_node.rb +93 -8
  99. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  100. data/lib/capybara/selenium/nodes/firefox_node.rb +37 -59
  101. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  102. data/lib/capybara/selenium/nodes/safari_node.rb +27 -54
  103. data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
  104. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  105. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  106. data/lib/capybara/selenium/patches/logs.rb +45 -0
  107. data/lib/capybara/server.rb +19 -3
  108. data/lib/capybara/server/animation_disabler.rb +2 -2
  109. data/lib/capybara/server/checker.rb +6 -2
  110. data/lib/capybara/server/middleware.rb +23 -13
  111. data/lib/capybara/session.rb +124 -106
  112. data/lib/capybara/session/config.rb +12 -10
  113. data/lib/capybara/session/matchers.rb +6 -6
  114. data/lib/capybara/spec/public/offset.js +6 -0
  115. data/lib/capybara/spec/public/test.js +94 -5
  116. data/lib/capybara/spec/session/all_spec.rb +84 -6
  117. data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
  118. data/lib/capybara/spec/session/assert_current_path_spec.rb +5 -2
  119. data/lib/capybara/spec/session/assert_text_spec.rb +9 -5
  120. data/lib/capybara/spec/session/attach_file_spec.rb +14 -6
  121. data/lib/capybara/spec/session/check_spec.rb +10 -4
  122. data/lib/capybara/spec/session/choose_spec.rb +8 -2
  123. data/lib/capybara/spec/session/click_button_spec.rb +44 -1
  124. data/lib/capybara/spec/session/click_link_spec.rb +11 -0
  125. data/lib/capybara/spec/session/evaluate_script_spec.rb +12 -0
  126. data/lib/capybara/spec/session/fill_in_spec.rb +37 -2
  127. data/lib/capybara/spec/session/find_spec.rb +60 -6
  128. data/lib/capybara/spec/session/first_spec.rb +1 -1
  129. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +14 -1
  130. data/lib/capybara/spec/session/frame/within_frame_spec.rb +12 -1
  131. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  132. data/lib/capybara/spec/session/has_button_spec.rb +16 -0
  133. data/lib/capybara/spec/session/has_css_spec.rb +35 -6
  134. data/lib/capybara/spec/session/has_current_path_spec.rb +6 -4
  135. data/lib/capybara/spec/session/has_field_spec.rb +34 -0
  136. data/lib/capybara/spec/session/has_select_spec.rb +32 -4
  137. data/lib/capybara/spec/session/has_selector_spec.rb +4 -4
  138. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  139. data/lib/capybara/spec/session/has_table_spec.rb +51 -5
  140. data/lib/capybara/spec/session/has_text_spec.rb +47 -0
  141. data/lib/capybara/spec/session/matches_style_spec.rb +2 -2
  142. data/lib/capybara/spec/session/node_spec.rb +574 -16
  143. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  144. data/lib/capybara/spec/session/save_screenshot_spec.rb +4 -4
  145. data/lib/capybara/spec/session/scroll_spec.rb +1 -1
  146. data/lib/capybara/spec/session/select_spec.rb +5 -10
  147. data/lib/capybara/spec/session/selectors_spec.rb +24 -3
  148. data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
  149. data/lib/capybara/spec/session/unselect_spec.rb +1 -1
  150. data/lib/capybara/spec/session/window/window_spec.rb +10 -9
  151. data/lib/capybara/spec/spec_helper.rb +7 -2
  152. data/lib/capybara/spec/test_app.rb +26 -21
  153. data/lib/capybara/spec/views/animated.erb +49 -0
  154. data/lib/capybara/spec/views/form.erb +25 -4
  155. data/lib/capybara/spec/views/frame_child.erb +2 -1
  156. data/lib/capybara/spec/views/frame_one.erb +1 -0
  157. data/lib/capybara/spec/views/obscured.erb +9 -9
  158. data/lib/capybara/spec/views/offset.erb +32 -0
  159. data/lib/capybara/spec/views/react.erb +45 -0
  160. data/lib/capybara/spec/views/spatial.erb +31 -0
  161. data/lib/capybara/spec/views/with_animation.erb +29 -1
  162. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  163. data/lib/capybara/spec/views/with_html.erb +28 -2
  164. data/lib/capybara/spec/views/with_js.erb +2 -1
  165. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  166. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  167. data/lib/capybara/version.rb +1 -1
  168. data/lib/capybara/window.rb +10 -10
  169. data/spec/basic_node_spec.rb +6 -6
  170. data/spec/capybara_spec.rb +28 -28
  171. data/spec/dsl_spec.rb +16 -3
  172. data/spec/filter_set_spec.rb +5 -5
  173. data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
  174. data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
  175. data/spec/minitest_spec.rb +12 -2
  176. data/spec/minitest_spec_spec.rb +56 -45
  177. data/spec/rack_test_spec.rb +25 -12
  178. data/spec/regexp_dissassembler_spec.rb +53 -39
  179. data/spec/result_spec.rb +50 -54
  180. data/spec/rspec/features_spec.rb +1 -0
  181. data/spec/rspec/shared_spec_matchers.rb +78 -62
  182. data/spec/rspec_spec.rb +5 -5
  183. data/spec/sauce_spec_chrome.rb +1 -0
  184. data/spec/selector_spec.rb +26 -16
  185. data/spec/selenium_spec_chrome.rb +84 -5
  186. data/spec/selenium_spec_chrome_remote.rb +23 -8
  187. data/spec/selenium_spec_edge.rb +23 -8
  188. data/spec/selenium_spec_firefox.rb +16 -21
  189. data/spec/selenium_spec_firefox_remote.rb +4 -13
  190. data/spec/selenium_spec_ie.rb +23 -15
  191. data/spec/selenium_spec_safari.rb +17 -17
  192. data/spec/server_spec.rb +87 -42
  193. data/spec/session_spec.rb +11 -4
  194. data/spec/shared_selenium_node.rb +83 -0
  195. data/spec/shared_selenium_session.rb +62 -72
  196. data/spec/spec_helper.rb +43 -5
  197. metadata +114 -16
@@ -3,16 +3,16 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  RSpec.describe Capybara::Session do
6
- context '#new' do
6
+ describe '#new' do
7
7
  it 'should raise an error if passed non-existent driver' do
8
8
  expect do
9
- Capybara::Session.new(:quox, TestApp).driver
9
+ described_class.new(:quox, TestApp).driver
10
10
  end.to raise_error(Capybara::DriverNotFoundError)
11
11
  end
12
12
 
13
13
  it 'verifies a passed app is a rack app' do
14
14
  expect do
15
- Capybara::Session.new(:unknown, random: 'hash')
15
+ described_class.new(:unknown, random: 'hash')
16
16
  end.to raise_error TypeError, 'The second parameter to Session::new should be a rack app if passed.'
17
17
  end
18
18
  end
@@ -75,10 +75,17 @@ RSpec.describe Capybara::Session do
75
75
 
76
76
  context 'quit' do
77
77
  it 'will reset the driver' do
78
- session = Capybara::Session.new(:rack_test, TestApp)
78
+ session = described_class.new(:rack_test, TestApp)
79
79
  driver = session.driver
80
80
  session.quit
81
81
  expect(session.driver).not_to eql driver
82
82
  end
83
+
84
+ it 'resets the document' do
85
+ session = described_class.new(:rack_test, TestApp)
86
+ document = session.document
87
+ session.quit
88
+ expect(session.document.base).not_to eql document.base
89
+ end
83
90
  end
84
91
  end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'selenium-webdriver'
5
+
6
+ RSpec.shared_examples 'Capybara::Node' do |session, _mode|
7
+ let(:session) { session }
8
+
9
+ describe '#content_editable?' do
10
+ it 'returns true when the element is content editable' do
11
+ session.visit('/with_js')
12
+ expect(session.find(:css, '#existing_content_editable').base.content_editable?).to be true
13
+ expect(session.find(:css, '#existing_content_editable_child').base.content_editable?).to be true
14
+ end
15
+
16
+ it 'returns false when the element is not content editable' do
17
+ session.visit('/with_js')
18
+ expect(session.find(:css, '#drag').base.content_editable?).to be false
19
+ end
20
+ end
21
+
22
+ describe '#send_keys' do
23
+ it 'should process space' do
24
+ session.visit('/form')
25
+ session.find(:css, '#address1_city').send_keys('ocean', [:shift, :space, 'side'])
26
+ expect(session.find(:css, '#address1_city').value).to eq 'ocean SIDE'
27
+ end
28
+ end
29
+
30
+ describe '#[]' do
31
+ it 'should work for spellcheck' do
32
+ session.visit('/with_html')
33
+ expect(session.find('//input[@spellcheck="TRUE"]')[:spellcheck]).to eq('true')
34
+ expect(session.find('//input[@spellcheck="FALSE"]')[:spellcheck]).to eq('false')
35
+ end
36
+ end
37
+
38
+ describe '#set' do
39
+ it 'respects maxlength when using rapid set' do
40
+ session.visit('/form')
41
+ inp = session.find(:css, '#long_length')
42
+ value = (0...50).map { |i| ((i % 26) + 65).chr }.join
43
+ inp.set(value, rapid: true)
44
+ expect(inp.value).to eq value[0...35]
45
+ end
46
+ end
47
+
48
+ describe '#visible?' do
49
+ let(:bridge) do
50
+ session.driver.browser.send(:bridge)
51
+ end
52
+
53
+ around do |example|
54
+ native_displayed = session.driver.options[:native_displayed]
55
+ example.run
56
+ session.driver.options[:native_displayed] = native_displayed
57
+ end
58
+
59
+ before do
60
+ allow(bridge).to receive(:execute_atom).and_call_original
61
+ end
62
+
63
+ it 'will use native displayed if told to' do
64
+ pending "Chromedriver < 76.0.3809.25 doesn't support native displayed in W3C mode" if chrome_lt?(76, session) && (ENV['W3C'] != 'false')
65
+
66
+ session.driver.options[:native_displayed] = true
67
+ session.visit('/form')
68
+ session.find(:css, '#address1_city', visible: true)
69
+
70
+ expect(bridge).not_to have_received(:execute_atom)
71
+ end
72
+
73
+ it "won't use native displayed if told not to" do
74
+ skip 'Non-W3C uses native' if chrome?(session) && (ENV['W3C'] == 'false')
75
+
76
+ session.driver.options[:native_displayed] = false
77
+ session.visit('/form')
78
+ session.find(:css, '#address1_city', visible: true)
79
+
80
+ expect(bridge).to have_received(:execute_atom).with(:isDisplayed, any_args)
81
+ end
82
+ end
83
+ end
@@ -41,6 +41,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
41
41
 
42
42
  it 'should have return code 1 when running selenium_driver_rspec_failure.rb' do
43
43
  skip 'only setup for local non-headless' if headless_or_remote?
44
+ skip 'Not setup for edge' if edge?(session)
44
45
 
45
46
  system(env, 'rspec spec/fixtures/selenium_driver_rspec_failure.rb', out: File::NULL, err: File::NULL)
46
47
  expect($CHILD_STATUS.exitstatus).to eq(1)
@@ -48,6 +49,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
48
49
 
49
50
  it 'should have return code 0 when running selenium_driver_rspec_success.rb' do
50
51
  skip 'only setup for local non-headless' if headless_or_remote?
52
+ skip 'Not setup for edge' if edge?(session)
51
53
 
52
54
  system(env, 'rspec spec/fixtures/selenium_driver_rspec_success.rb', out: File::NULL, err: File::NULL)
53
55
  expect($CHILD_STATUS.exitstatus).to eq(0)
@@ -70,7 +72,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
70
72
  end
71
73
  end
72
74
 
73
- context '#fill_in_with empty string and no options' do
75
+ describe '#fill_in_with empty string and no options' do
74
76
  it 'should trigger change when clearing a field' do
75
77
  pending "safaridriver doesn't trigger change for clear" if safari?(session)
76
78
  session.visit('/with_js')
@@ -81,7 +83,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
81
83
  end
82
84
  end
83
85
 
84
- context '#fill_in with { :clear => :backspace } fill_option', requires: [:js] do
86
+ describe '#fill_in with { :clear => :backspace } fill_option', requires: [:js] do
85
87
  before do
86
88
  # Firefox has an issue with change events if the main window doesn't think it's focused
87
89
  session.execute_script('window.focus()')
@@ -148,7 +150,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
148
150
  end
149
151
  end
150
152
 
151
- context '#fill_in with { clear: :none } fill_options' do
153
+ describe '#fill_in with { clear: :none } fill_options' do
152
154
  it 'should append to content in a field' do
153
155
  pending 'Safari overwrites by default - need to figure out a workaround' if safari?(session)
154
156
 
@@ -158,9 +160,18 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
158
160
  fill_options: { clear: :none })
159
161
  expect(session.find(:fillable_field, 'form_first_name').value).to eq('JohnHarry')
160
162
  end
163
+
164
+ it 'works with rapid fill' do
165
+ pending 'Safari overwrites by default - need to figure out a workaround' if safari?(session)
166
+
167
+ long_string = (0...60).map { |i| ((i % 26) + 65).chr }.join
168
+ session.visit('/form')
169
+ session.fill_in('form_first_name', with: long_string, fill_options: { clear: :none })
170
+ expect(session.find(:fillable_field, 'form_first_name').value).to eq('John' + long_string)
171
+ end
161
172
  end
162
173
 
163
- context '#fill_in with Date' do
174
+ describe '#fill_in with Date' do
164
175
  before do
165
176
  session.visit('/form')
166
177
  session.find(:css, '#form_date').execute_script <<-JS
@@ -192,7 +203,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
192
203
  end
193
204
  end
194
205
 
195
- context '#fill_in with { clear: Array } fill_options' do
206
+ describe '#fill_in with { clear: Array } fill_options' do
196
207
  it 'should pass the array through to the element' do
197
208
  # this is mainly for use with [[:control, 'a'], :backspace] - however since that is platform dependant I'm testing with something less useful
198
209
  session.visit('/form')
@@ -297,71 +308,22 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
297
308
  describe 'Element#click' do
298
309
  it 'should handle fixed headers/footers' do
299
310
  session.visit('/with_fixed_header_footer')
300
- # session.click_link('Go to root')
301
- session.find(:link, 'Go to root').click
311
+ session.using_wait_time(2) do
312
+ session.find(:link, 'Go to root').click
313
+ end
302
314
  expect(session).to have_current_path('/')
303
315
  end
304
316
  end
305
317
 
306
- describe 'Element#drag_to' do
307
- before do
308
- skip "Firefox < 62 doesn't support a DataTransfer constuctor" if firefox_lt?(62.0, session)
309
- skip "IE doesn't support a DataTransfer constuctor" if ie?(session)
310
- skip "Safari doesn't support" if safari?(session)
311
- end
312
-
313
- it 'should HTML5 drag and drop an object' do
314
- session.visit('/with_js')
315
- element = session.find('//div[@id="drag_html5"]')
316
- target = session.find('//div[@id="drop_html5"]')
317
- element.drag_to(target)
318
- expect(session).to have_xpath('//div[contains(., "HTML5 Dropped drag_html5")]')
319
- end
320
-
321
- it 'should set clientX/Y in dragover events' do
322
- session.visit('/with_js')
323
- element = session.find('//div[@id="drag_html5"]')
324
- target = session.find('//div[@id="drop_html5"]')
325
- element.drag_to(target)
326
- session.all(:css, 'div.log').each { |el| puts el.text }
327
- expect(session).to have_css('div.log', text: /DragOver with client position: [1-9]\d*,[1-9]\d*/, count: 2)
328
- end
329
-
330
- it 'should not HTML5 drag and drop on a non HTML5 drop element' do
331
- session.visit('/with_js')
332
- element = session.find('//div[@id="drag_html5"]')
333
- target = session.find('//div[@id="drop_html5"]')
334
- target.execute_script("$(this).removeClass('drop');")
335
- element.drag_to(target)
336
- sleep 1
337
- expect(session).not_to have_xpath('//div[contains(., "HTML5 Dropped drag_html5")]')
338
- end
339
-
340
- it 'should HTML5 drag and drop when scrolling needed' do
341
- session.visit('/with_js')
342
- element = session.find('//div[@id="drag_html5_scroll"]')
343
- target = session.find('//div[@id="drop_html5_scroll"]')
344
- element.drag_to(target)
345
- expect(session).to have_xpath('//div[contains(., "HTML5 Dropped drag_html5_scroll")]')
346
- end
347
-
348
- it 'should drag HTML5 default draggable elements' do
349
- session.visit('/with_js')
350
- link = session.find_link('drag_link_html5')
351
- target = session.find(:id, 'drop_html5')
352
- link.drag_to target
353
- expect(session).to have_xpath('//div[contains(., "HTML5 Dropped")]')
354
- end
355
- end
356
-
357
318
  describe 'Capybara#Node#attach_file' do
358
319
  it 'can attach a directory' do
359
320
  pending "Geckodriver doesn't support uploading a directory" if firefox?(session)
360
321
  pending "Selenium remote doesn't support transferring a directory" if remote?(session)
361
322
  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']
362
323
  pending "IE doesn't support uploading a directory" if ie?(session)
363
- pending 'Chrome/chromedriver 73 breaks this' unless chrome_lt?(73, session)
324
+ pending 'Chrome/chromedriver 73 breaks this' if chrome?(session) && chrome_gte?(73, session) && chrome_lt?(75, session)
364
325
  pending "Safari doesn't support uploading a directory" if safari?(session)
326
+ # pending "Edge/msedgedriver doesn't support directory upload" if edge?(session) && edge_gte?(75, session)
365
327
 
366
328
  session.visit('/form')
367
329
  test_file_dir = File.expand_path('./fixtures', File.dirname(__FILE__))
@@ -369,6 +331,15 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
369
331
  session.click_button('Upload Multiple')
370
332
  expect(session.body).to include('5 | ') # number of files
371
333
  end
334
+
335
+ it 'can attach a relative file' do
336
+ pending 'Geckdoriver on windows requires alternate file separator which path expansion replaces' if Gem.win_platform? && firefox?(session)
337
+
338
+ session.visit('/form')
339
+ session.attach_file('Single Document', 'spec/fixtures/capybara.csv')
340
+ session.click_button('Upload Single')
341
+ expect(session.body).to include('Content-type: text/csv')
342
+ end
372
343
  end
373
344
 
374
345
  context 'Windows' do
@@ -396,11 +367,17 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
396
367
  expect(@animation_session).to have_no_link('transition me away', wait: 0.5)
397
368
  end
398
369
 
399
- it 'should disable CSS animations' do
370
+ it 'should disable CSS animations (set to 0s)' do
400
371
  @animation_session.visit('with_animation')
401
372
  @animation_session.click_link('animate me away')
402
373
  expect(@animation_session).to have_no_link('animate me away', wait: 0.5)
403
374
  end
375
+
376
+ it 'should disable CSS animations on pseudo elements (set to 0s)' do
377
+ @animation_session.visit('with_animation')
378
+ @animation_session.find_link('animate me away').right_click
379
+ expect(@animation_session).to have_content('Animation Ended', wait: 0.1)
380
+ end
404
381
  end
405
382
 
406
383
  context 'if we pass in css that matches elements' do
@@ -457,7 +434,7 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
457
434
  it 'can find html5 svg elements' do
458
435
  session.visit('with_html5_svg')
459
436
  expect(session).to have_selector(:element, :svg)
460
- expect(session).to have_selector(:element, :rect, visible: true)
437
+ expect(session).to have_selector(:element, :rect, visible: :visible)
461
438
  expect(session).to have_selector(:element, :circle)
462
439
  expect(session).to have_selector(:element, :linearGradient, visible: :all)
463
440
  end
@@ -472,17 +449,30 @@ RSpec.shared_examples 'Capybara::Session' do |session, mode|
472
449
  describe 'with react' do
473
450
  context 'controlled components' do
474
451
  it 'can set and clear a text field' do
475
- session.visit 'https://reactjs.org/docs/forms.html'
476
- session.all(:css, 'h2#controlled-components ~ p a', text: 'Try it on CodePen')[0].click
477
- session.within_frame(:css, 'iframe.result-iframe[src^="https://s.codepen.io"]', wait: 10) do
478
- session.fill_in('Name:', with: 'abc')
479
- session.accept_prompt 'A name was submitted: abc' do
480
- session.click_button('Submit')
481
- end
482
- session.fill_in('Name:', with: '')
483
- session.accept_prompt(/A name was submitted: $/) do
484
- session.click_button('Submit')
485
- end
452
+ skip "This test doesn't support older browsers" if ie?(session)
453
+
454
+ session.visit 'react'
455
+
456
+ session.fill_in('Name:', with: 'abc')
457
+ session.accept_prompt 'A name was submitted: abc' do
458
+ session.click_button('Submit')
459
+ end
460
+
461
+ session.fill_in('Name:', with: '')
462
+ session.accept_prompt(/A name was submitted: $/) do
463
+ session.click_button('Submit')
464
+ end
465
+ end
466
+
467
+ it 'works with rapid fill' do
468
+ skip "This test doesn't support older browsers" if ie?(session)
469
+
470
+ session.visit 'react'
471
+ long_string = (0...60).map { |i| ((i % 26) + 65).chr }.join
472
+
473
+ session.fill_in('Name:', with: long_string)
474
+ session.accept_prompt "A name was submitted: #{long_string}" do
475
+ session.click_button('Submit')
486
476
  end
487
477
  end
488
478
  end
@@ -1,15 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rspec/expectations'
4
- require 'capybara/spec/spec_helper'
5
- require 'webdrivers' if ENV['CI']
4
+ require 'webdrivers' if ENV['CI'] || ENV['WEBDRIVERS']
6
5
  require 'selenium_statistics'
6
+ if ENV['TRAVIS']
7
+ require 'coveralls'
8
+ Coveralls.wear! do
9
+ add_filter '/lib/capybara/driver/'
10
+ add_filter '/lib/capybara/registrations/'
11
+ end
12
+ end
13
+ require 'capybara/spec/spec_helper'
7
14
 
8
15
  module Capybara
9
16
  module SpecHelper
10
17
  def firefox?(session)
11
18
  browser_name(session) == :firefox &&
12
- session.driver.browser.capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities)
19
+ ((defined?(::Selenium::WebDriver::VERSION) && (::Selenium::WebDriver::VERSION.to_f >= 4)) ||
20
+ session.driver.browser.capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities))
13
21
  end
14
22
 
15
23
  def firefox_lt?(version, session)
@@ -24,18 +32,35 @@ module Capybara
24
32
  browser_name(session) == :chrome
25
33
  end
26
34
 
35
+ def chrome_version(session)
36
+ (session.driver.browser.capabilities[:browser_version] ||
37
+ session.driver.browser.capabilities[:version]).to_f
38
+ end
39
+
27
40
  def chrome_lt?(version, session)
28
- chrome?(session) && (session.driver.browser.capabilities[:version].to_f < version)
41
+ chrome?(session) && (chrome_version(session) < version)
29
42
  end
30
43
 
31
44
  def chrome_gte?(version, session)
32
- chrome?(session) && (session.driver.browser.capabilities[:version].to_f >= version)
45
+ chrome?(session) && (chrome_version(session) >= version)
33
46
  end
34
47
 
35
48
  def edge?(session)
49
+ browser_name(session).to_s.start_with?('edge')
50
+ end
51
+
52
+ def legacy_edge?(session)
36
53
  browser_name(session) == :edge
37
54
  end
38
55
 
56
+ def edge_lt?(version, session)
57
+ edge?(session) && (chrome_version(session) < version)
58
+ end
59
+
60
+ def edge_gte?(version, session)
61
+ edge?(session) && (chrome_version(session) >= version)
62
+ end
63
+
39
64
  def ie?(session)
40
65
  %i[internet_explorer ie].include?(browser_name(session))
41
66
  end
@@ -51,11 +76,24 @@ module Capybara
51
76
  def remote?(session)
52
77
  session.driver.browser.is_a? ::Selenium::WebDriver::Remote::Driver
53
78
  end
79
+
80
+ def self.log_selenium_driver_version(mod)
81
+ mod = mod::Service if ::Selenium::WebDriver::Service.respond_to? :driver_path
82
+ path = mod.driver_path
83
+ path = path.call if path.respond_to? :call
84
+ $stdout.puts `#{path.gsub(' ', '\ ')} --version`
85
+ end
54
86
  end
55
87
  end
56
88
 
57
89
  RSpec.configure do |config|
58
90
  Capybara::SpecHelper.configure(config)
91
+ config.expect_with :rspec do |expectations|
92
+ expectations.syntax = :expect
93
+ end
94
+ config.mock_with :rspec do |mocks|
95
+ mocks.verify_partial_doubles = true
96
+ end
59
97
  config.filter_run_including focus_: true unless ENV['CI']
60
98
  config.run_all_when_everything_filtered = true
61
99
  config.after(:suite) { SeleniumStatistics.print_results }
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.16.1
4
+ version: 3.33.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Walpole
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
12
  - gem-public_cert.pem
13
- date: 2019-03-30 00:00:00.000000000 Z
13
+ date: 2020-06-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: addressable
@@ -88,14 +88,14 @@ dependencies:
88
88
  requirements:
89
89
  - - "~>"
90
90
  - !ruby/object:Gem::Version
91
- version: '1.2'
91
+ version: '1.5'
92
92
  type: :runtime
93
93
  prerelease: false
94
94
  version_requirements: !ruby/object:Gem::Requirement
95
95
  requirements:
96
96
  - - "~>"
97
97
  - !ruby/object:Gem::Version
98
- version: '1.2'
98
+ version: '1.5'
99
99
  - !ruby/object:Gem::Dependency
100
100
  name: xpath
101
101
  requirement: !ruby/object:Gem::Requirement
@@ -125,47 +125,47 @@ dependencies:
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0'
127
127
  - !ruby/object:Gem::Dependency
128
- name: cucumber
128
+ name: coveralls
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  requirements:
131
131
  - - ">="
132
132
  - !ruby/object:Gem::Version
133
- version: 2.3.0
133
+ version: '0'
134
134
  type: :development
135
135
  prerelease: false
136
136
  version_requirements: !ruby/object:Gem::Requirement
137
137
  requirements:
138
138
  - - ">="
139
139
  - !ruby/object:Gem::Version
140
- version: 2.3.0
140
+ version: '0'
141
141
  - !ruby/object:Gem::Dependency
142
- name: erubi
142
+ name: cucumber
143
143
  requirement: !ruby/object:Gem::Requirement
144
144
  requirements:
145
145
  - - ">="
146
146
  - !ruby/object:Gem::Version
147
- version: '0'
147
+ version: 2.3.0
148
148
  type: :development
149
149
  prerelease: false
150
150
  version_requirements: !ruby/object:Gem::Requirement
151
151
  requirements:
152
152
  - - ">="
153
153
  - !ruby/object:Gem::Version
154
- version: '0'
154
+ version: 2.3.0
155
155
  - !ruby/object:Gem::Dependency
156
- name: fuubar
156
+ name: erubi
157
157
  requirement: !ruby/object:Gem::Requirement
158
158
  requirements:
159
159
  - - ">="
160
160
  - !ruby/object:Gem::Version
161
- version: 1.0.0
161
+ version: '0'
162
162
  type: :development
163
163
  prerelease: false
164
164
  version_requirements: !ruby/object:Gem::Requirement
165
165
  requirements:
166
166
  - - ">="
167
167
  - !ruby/object:Gem::Version
168
- version: 1.0.0
168
+ version: '0'
169
169
  - !ruby/object:Gem::Dependency
170
170
  name: irb
171
171
  requirement: !ruby/object:Gem::Requirement
@@ -251,7 +251,7 @@ dependencies:
251
251
  - !ruby/object:Gem::Version
252
252
  version: 3.5.0
253
253
  - !ruby/object:Gem::Dependency
254
- name: rubocop
254
+ name: rspec-instafail
255
255
  requirement: !ruby/object:Gem::Requirement
256
256
  requirements:
257
257
  - - ">="
@@ -264,6 +264,20 @@ dependencies:
264
264
  - - ">="
265
265
  - !ruby/object:Gem::Version
266
266
  version: '0'
267
+ - !ruby/object:Gem::Dependency
268
+ name: rubocop
269
+ requirement: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - "~>"
272
+ - !ruby/object:Gem::Version
273
+ version: '0.72'
274
+ type: :development
275
+ prerelease: false
276
+ version_requirements: !ruby/object:Gem::Requirement
277
+ requirements:
278
+ - - "~>"
279
+ - !ruby/object:Gem::Version
280
+ version: '0.72'
267
281
  - !ruby/object:Gem::Dependency
268
282
  name: rubocop-performance
269
283
  requirement: !ruby/object:Gem::Requirement
@@ -348,6 +362,34 @@ dependencies:
348
362
  - - ">="
349
363
  - !ruby/object:Gem::Version
350
364
  version: 1.4.0
365
+ - !ruby/object:Gem::Dependency
366
+ name: uglifier
367
+ requirement: !ruby/object:Gem::Requirement
368
+ requirements:
369
+ - - ">="
370
+ - !ruby/object:Gem::Version
371
+ version: '0'
372
+ type: :development
373
+ prerelease: false
374
+ version_requirements: !ruby/object:Gem::Requirement
375
+ requirements:
376
+ - - ">="
377
+ - !ruby/object:Gem::Version
378
+ version: '0'
379
+ - !ruby/object:Gem::Dependency
380
+ name: webdrivers
381
+ requirement: !ruby/object:Gem::Requirement
382
+ requirements:
383
+ - - ">="
384
+ - !ruby/object:Gem::Version
385
+ version: 3.6.0
386
+ type: :development
387
+ prerelease: false
388
+ version_requirements: !ruby/object:Gem::Requirement
389
+ requirements:
390
+ - - ">="
391
+ - !ruby/object:Gem::Version
392
+ version: 3.6.0
351
393
  - !ruby/object:Gem::Dependency
352
394
  name: yard
353
395
  requirement: !ruby/object:Gem::Requirement
@@ -371,6 +413,7 @@ executables: []
371
413
  extensions: []
372
414
  extra_rdoc_files: []
373
415
  files:
416
+ - ".yardopts"
374
417
  - History.md
375
418
  - License.txt
376
419
  - README.md
@@ -407,6 +450,10 @@ files:
407
450
  - lib/capybara/rack_test/form.rb
408
451
  - lib/capybara/rack_test/node.rb
409
452
  - lib/capybara/rails.rb
453
+ - lib/capybara/registration_container.rb
454
+ - lib/capybara/registrations/drivers.rb
455
+ - lib/capybara/registrations/patches/puma_ssl.rb
456
+ - lib/capybara/registrations/servers.rb
410
457
  - lib/capybara/result.rb
411
458
  - lib/capybara/rspec.rb
412
459
  - lib/capybara/rspec/features.rb
@@ -415,16 +462,42 @@ files:
415
462
  - lib/capybara/rspec/matchers/base.rb
416
463
  - lib/capybara/rspec/matchers/become_closed.rb
417
464
  - lib/capybara/rspec/matchers/compound.rb
465
+ - lib/capybara/rspec/matchers/count_sugar.rb
466
+ - lib/capybara/rspec/matchers/have_ancestor.rb
418
467
  - lib/capybara/rspec/matchers/have_current_path.rb
419
468
  - lib/capybara/rspec/matchers/have_selector.rb
469
+ - lib/capybara/rspec/matchers/have_sibling.rb
420
470
  - lib/capybara/rspec/matchers/have_text.rb
421
471
  - lib/capybara/rspec/matchers/have_title.rb
422
472
  - lib/capybara/rspec/matchers/match_selector.rb
423
473
  - lib/capybara/rspec/matchers/match_style.rb
474
+ - lib/capybara/rspec/matchers/spatial_sugar.rb
424
475
  - lib/capybara/selector.rb
425
476
  - lib/capybara/selector/builders/css_builder.rb
426
477
  - lib/capybara/selector/builders/xpath_builder.rb
427
478
  - lib/capybara/selector/css.rb
479
+ - lib/capybara/selector/definition.rb
480
+ - lib/capybara/selector/definition/button.rb
481
+ - lib/capybara/selector/definition/checkbox.rb
482
+ - lib/capybara/selector/definition/css.rb
483
+ - lib/capybara/selector/definition/datalist_input.rb
484
+ - lib/capybara/selector/definition/datalist_option.rb
485
+ - lib/capybara/selector/definition/element.rb
486
+ - lib/capybara/selector/definition/field.rb
487
+ - lib/capybara/selector/definition/fieldset.rb
488
+ - lib/capybara/selector/definition/file_field.rb
489
+ - lib/capybara/selector/definition/fillable_field.rb
490
+ - lib/capybara/selector/definition/frame.rb
491
+ - lib/capybara/selector/definition/id.rb
492
+ - lib/capybara/selector/definition/label.rb
493
+ - lib/capybara/selector/definition/link.rb
494
+ - lib/capybara/selector/definition/link_or_button.rb
495
+ - lib/capybara/selector/definition/option.rb
496
+ - lib/capybara/selector/definition/radio_button.rb
497
+ - lib/capybara/selector/definition/select.rb
498
+ - lib/capybara/selector/definition/table.rb
499
+ - lib/capybara/selector/definition/table_row.rb
500
+ - lib/capybara/selector/definition/xpath.rb
428
501
  - lib/capybara/selector/filter.rb
429
502
  - lib/capybara/selector/filter_set.rb
430
503
  - lib/capybara/selector/filters/base.rb
@@ -434,18 +507,32 @@ files:
434
507
  - lib/capybara/selector/regexp_disassembler.rb
435
508
  - lib/capybara/selector/selector.rb
436
509
  - lib/capybara/selector/xpath_extensions.rb
510
+ - lib/capybara/selenium/atoms/getAttribute.min.js
511
+ - lib/capybara/selenium/atoms/isDisplayed.min.js
512
+ - lib/capybara/selenium/atoms/src/getAttribute.js
513
+ - lib/capybara/selenium/atoms/src/isDisplayed.js
437
514
  - lib/capybara/selenium/driver.rb
438
515
  - lib/capybara/selenium/driver_specializations/chrome_driver.rb
516
+ - lib/capybara/selenium/driver_specializations/edge_driver.rb
439
517
  - lib/capybara/selenium/driver_specializations/firefox_driver.rb
440
518
  - lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb
441
519
  - lib/capybara/selenium/driver_specializations/safari_driver.rb
520
+ - lib/capybara/selenium/extensions/file_input_click_emulation.rb
442
521
  - lib/capybara/selenium/extensions/find.rb
443
522
  - lib/capybara/selenium/extensions/html5_drag.rb
523
+ - lib/capybara/selenium/extensions/modifier_keys_stack.rb
444
524
  - lib/capybara/selenium/extensions/scroll.rb
525
+ - lib/capybara/selenium/logger_suppressor.rb
445
526
  - lib/capybara/selenium/node.rb
446
527
  - lib/capybara/selenium/nodes/chrome_node.rb
528
+ - lib/capybara/selenium/nodes/edge_node.rb
447
529
  - lib/capybara/selenium/nodes/firefox_node.rb
530
+ - lib/capybara/selenium/nodes/ie_node.rb
448
531
  - lib/capybara/selenium/nodes/safari_node.rb
532
+ - lib/capybara/selenium/patches/action_pauser.rb
533
+ - lib/capybara/selenium/patches/atoms.rb
534
+ - lib/capybara/selenium/patches/is_displayed.rb
535
+ - lib/capybara/selenium/patches/logs.rb
449
536
  - lib/capybara/selenium/patches/pause_duration_fix.rb
450
537
  - lib/capybara/selenium/patches/persistent_client.rb
451
538
  - lib/capybara/server.rb
@@ -461,6 +548,7 @@ files:
461
548
  - lib/capybara/spec/fixtures/test_file.txt
462
549
  - lib/capybara/spec/public/jquery-ui.js
463
550
  - lib/capybara/spec/public/jquery.js
551
+ - lib/capybara/spec/public/offset.js
464
552
  - lib/capybara/spec/public/test.js
465
553
  - lib/capybara/spec/session/accept_alert_spec.rb
466
554
  - lib/capybara/spec/session/accept_confirm_spec.rb
@@ -505,6 +593,7 @@ files:
505
593
  - lib/capybara/spec/session/go_back_spec.rb
506
594
  - lib/capybara/spec/session/go_forward_spec.rb
507
595
  - lib/capybara/spec/session/has_all_selectors_spec.rb
596
+ - lib/capybara/spec/session/has_ancestor_spec.rb
508
597
  - lib/capybara/spec/session/has_any_selectors_spec.rb
509
598
  - lib/capybara/spec/session/has_button_spec.rb
510
599
  - lib/capybara/spec/session/has_css_spec.rb
@@ -514,6 +603,7 @@ files:
514
603
  - lib/capybara/spec/session/has_none_selectors_spec.rb
515
604
  - lib/capybara/spec/session/has_select_spec.rb
516
605
  - lib/capybara/spec/session/has_selector_spec.rb
606
+ - lib/capybara/spec/session/has_sibling_spec.rb
517
607
  - lib/capybara/spec/session/has_table_spec.rb
518
608
  - lib/capybara/spec/session/has_text_spec.rb
519
609
  - lib/capybara/spec/session/has_title_spec.rb
@@ -552,6 +642,7 @@ files:
552
642
  - lib/capybara/spec/session/within_spec.rb
553
643
  - lib/capybara/spec/spec_helper.rb
554
644
  - lib/capybara/spec/test_app.rb
645
+ - lib/capybara/spec/views/animated.erb
555
646
  - lib/capybara/spec/views/buttons.erb
556
647
  - lib/capybara/spec/views/fieldsets.erb
557
648
  - lib/capybara/spec/views/form.erb
@@ -563,15 +654,19 @@ files:
563
654
  - lib/capybara/spec/views/host_links.erb
564
655
  - lib/capybara/spec/views/initial_alert.erb
565
656
  - lib/capybara/spec/views/obscured.erb
657
+ - lib/capybara/spec/views/offset.erb
566
658
  - lib/capybara/spec/views/path.erb
567
659
  - lib/capybara/spec/views/popup_one.erb
568
660
  - lib/capybara/spec/views/popup_two.erb
569
661
  - lib/capybara/spec/views/postback.erb
662
+ - lib/capybara/spec/views/react.erb
570
663
  - lib/capybara/spec/views/scroll.erb
664
+ - lib/capybara/spec/views/spatial.erb
571
665
  - lib/capybara/spec/views/tables.erb
572
666
  - lib/capybara/spec/views/with_animation.erb
573
667
  - lib/capybara/spec/views/with_base_tag.erb
574
668
  - lib/capybara/spec/views/with_count.erb
669
+ - lib/capybara/spec/views/with_dragula.erb
575
670
  - lib/capybara/spec/views/with_fixed_header_footer.erb
576
671
  - lib/capybara/spec/views/with_hover.erb
577
672
  - lib/capybara/spec/views/with_hover1.erb
@@ -579,11 +674,13 @@ files:
579
674
  - lib/capybara/spec/views/with_html5_svg.erb
580
675
  - lib/capybara/spec/views/with_html_entities.erb
581
676
  - lib/capybara/spec/views/with_js.erb
677
+ - lib/capybara/spec/views/with_jstree.erb
582
678
  - lib/capybara/spec/views/with_namespace.erb
583
679
  - lib/capybara/spec/views/with_scope.erb
584
680
  - lib/capybara/spec/views/with_scope_other.erb
585
681
  - lib/capybara/spec/views/with_simple_html.erb
586
682
  - lib/capybara/spec/views/with_slow_unload.erb
683
+ - lib/capybara/spec/views/with_sortable_js.erb
587
684
  - lib/capybara/spec/views/with_title.erb
588
685
  - lib/capybara/spec/views/with_unload_alert.erb
589
686
  - lib/capybara/spec/views/with_windows.erb
@@ -624,6 +721,7 @@ files:
624
721
  - spec/selenium_spec_safari.rb
625
722
  - spec/server_spec.rb
626
723
  - spec/session_spec.rb
724
+ - spec/shared_selenium_node.rb
627
725
  - spec/shared_selenium_session.rb
628
726
  - spec/spec_helper.rb
629
727
  - spec/xpath_builder_spec.rb
@@ -641,14 +739,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
641
739
  requirements:
642
740
  - - ">="
643
741
  - !ruby/object:Gem::Version
644
- version: 2.4.0
742
+ version: 2.5.0
645
743
  required_rubygems_version: !ruby/object:Gem::Requirement
646
744
  requirements:
647
745
  - - ">="
648
746
  - !ruby/object:Gem::Version
649
747
  version: '0'
650
748
  requirements: []
651
- rubygems_version: 3.0.3
749
+ rubygems_version: 3.1.2
652
750
  signing_key:
653
751
  specification_version: 4
654
752
  summary: Capybara aims to simplify the process of integration testing Rack applications,