capybara 3.39.2 → 3.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +22 -0
  3. data/README.md +173 -29
  4. data/lib/capybara/helpers.rb +1 -1
  5. data/lib/capybara/minitest/spec.rb +16 -4
  6. data/lib/capybara/minitest.rb +14 -1
  7. data/lib/capybara/node/matchers.rb +25 -0
  8. data/lib/capybara/node/whitespace_normalizer.rb +5 -5
  9. data/lib/capybara/queries/selector_query.rb +2 -1
  10. data/lib/capybara/rack_test/browser.rb +3 -2
  11. data/lib/capybara/rack_test/node.rb +5 -12
  12. data/lib/capybara/registration_container.rb +2 -2
  13. data/lib/capybara/registrations/drivers.rb +1 -1
  14. data/lib/capybara/registrations/servers.rb +8 -7
  15. data/lib/capybara/result.rb +2 -2
  16. data/lib/capybara/rspec/matchers/have_selector.rb +4 -12
  17. data/lib/capybara/rspec/matchers.rb +7 -2
  18. data/lib/capybara/selector/css.rb +5 -5
  19. data/lib/capybara/selector/definition/table.rb +1 -1
  20. data/lib/capybara/selector/definition/table_row.rb +2 -2
  21. data/lib/capybara/selector.rb +251 -0
  22. data/lib/capybara/selenium/driver.rb +11 -51
  23. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +1 -6
  24. data/lib/capybara/selenium/node.rb +4 -31
  25. data/lib/capybara/selenium/nodes/chrome_node.rb +3 -19
  26. data/lib/capybara/selenium/nodes/edge_node.rb +0 -16
  27. data/lib/capybara/server/animation_disabler.rb +1 -1
  28. data/lib/capybara/server.rb +1 -1
  29. data/lib/capybara/session.rb +3 -2
  30. data/lib/capybara/spec/session/all_spec.rb +1 -1
  31. data/lib/capybara/spec/session/click_link_spec.rb +1 -1
  32. data/lib/capybara/spec/session/find_spec.rb +8 -0
  33. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  34. data/lib/capybara/spec/session/has_table_spec.rb +13 -2
  35. data/lib/capybara/spec/session/node_spec.rb +6 -0
  36. data/lib/capybara/spec/session/node_wrapper_spec.rb +1 -1
  37. data/lib/capybara/spec/session/uncheck_spec.rb +1 -1
  38. data/lib/capybara/spec/spec_helper.rb +2 -2
  39. data/lib/capybara/spec/test_app.rb +1 -1
  40. data/lib/capybara/spec/views/form.erb +5 -0
  41. data/lib/capybara/spec/views/with_html.erb +2 -0
  42. data/lib/capybara/version.rb +1 -1
  43. data/lib/capybara.rb +7 -6
  44. data/spec/minitest_spec.rb +8 -1
  45. data/spec/result_spec.rb +9 -0
  46. data/spec/rspec/shared_spec_matchers.rb +26 -2
  47. data/spec/rspec_spec.rb +1 -1
  48. data/spec/sauce_spec_chrome.rb +1 -1
  49. data/spec/selector_spec.rb +1 -1
  50. data/spec/selenium_spec_chrome.rb +7 -5
  51. data/spec/selenium_spec_chrome_remote.rb +0 -5
  52. data/spec/selenium_spec_edge.rb +11 -4
  53. data/spec/selenium_spec_firefox.rb +4 -3
  54. data/spec/selenium_spec_firefox_remote.rb +2 -3
  55. data/spec/server_spec.rb +12 -0
  56. data/spec/shared_selenium_session.rb +0 -2
  57. data/spec/spec_helper.rb +2 -2
  58. metadata +25 -32
  59. data/lib/capybara/selenium/logger_suppressor.rb +0 -44
  60. data/lib/capybara/selenium/patches/action_pauser.rb +0 -26
@@ -24,12 +24,6 @@ class Capybara::Selenium::ChromeNode < Capybara::Selenium::Node
24
24
  JS
25
25
  end
26
26
  super
27
- rescue *file_errors => e
28
- if e.message.match?(/File not found : .+\n.+/m)
29
- raise ArgumentError, "Selenium < 3.14 with remote Chrome doesn't support multiple file upload"
30
- end
31
-
32
- raise
33
27
  end
34
28
 
35
29
  def drop(*args)
@@ -94,7 +88,7 @@ class Capybara::Selenium::ChromeNode < Capybara::Selenium::Node
94
88
  private
95
89
 
96
90
  def perform_legacy_drag(element, drop_modifiers)
97
- return super if chromedriver_fixed_actions_key_state? || !w3c? || element.obscured?
91
+ return super if chromedriver_fixed_actions_key_state? || element.obscured?
98
92
 
99
93
  raise ArgumentError, 'Modifier keys are not supported while dragging in this version of Chrome.' unless drop_modifiers.empty?
100
94
 
@@ -104,19 +98,9 @@ private
104
98
  browser_action.click_and_hold(native).move_to(element.native).release.perform
105
99
  end
106
100
 
107
- def file_errors
108
- @file_errors = ::Selenium::WebDriver.logger.suppress_deprecations do
109
- if defined? ::Selenium::WebDriver::Error::ExpectedError # Selenium < 4
110
- [::Selenium::WebDriver::Error::ExpectedError]
111
- else
112
- []
113
- end
114
- end
115
- end
116
-
117
101
  def browser_version(to_float: true)
118
102
  caps = capabilities
119
- ver = (caps[:browser_version] || caps[:version])
103
+ ver = caps[:browser_version] || caps[:version]
120
104
  ver = ver.to_f if to_float
121
105
  ver
122
106
  end
@@ -135,7 +119,7 @@ private
135
119
 
136
120
  def native_displayed?
137
121
  (driver.options[:native_displayed] != false) &&
138
- (w3c? && chromedriver_supports_displayed_endpoint?) &&
122
+ chromedriver_supports_displayed_endpoint? &&
139
123
  (!ENV['DISABLE_CAPYBARA_SELENIUM_OPTIMIZATIONS'])
140
124
  end
141
125
  end
@@ -24,12 +24,6 @@ class Capybara::Selenium::EdgeNode < Capybara::Selenium::Node
24
24
  JS
25
25
  end
26
26
  super
27
- rescue *file_errors => e
28
- if e.message.match?(/File not found : .+\n.+/m)
29
- raise ArgumentError, "Selenium < 3.14 with remote Chrome doesn't support multiple file upload"
30
- end
31
-
32
- raise
33
27
  end
34
28
 
35
29
  def drop(*args)
@@ -97,16 +91,6 @@ class Capybara::Selenium::EdgeNode < Capybara::Selenium::Node
97
91
 
98
92
  private
99
93
 
100
- def file_errors
101
- @file_errors = ::Selenium::WebDriver.logger.suppress_deprecations do
102
- if defined? ::Selenium::WebDriver::Error::ExpectedError # Selenium < 4
103
- [::Selenium::WebDriver::Error::ExpectedError]
104
- else
105
- []
106
- end
107
- end
108
- end
109
-
110
94
  def browser_version
111
95
  @browser_version ||= begin
112
96
  caps = driver.browser.capabilities
@@ -50,7 +50,7 @@ module Capybara
50
50
  def directive_nonces(headers)
51
51
  headers.fetch('Content-Security-Policy', '')
52
52
  .split(';')
53
- .map(&:split)
53
+ .map(&:split) # rubocop:disable Style/MapToHash
54
54
  .to_h do |s|
55
55
  [
56
56
  s[0], s[1..].filter_map do |value|
@@ -55,7 +55,7 @@ module Capybara
55
55
 
56
56
  res = @checker.request { |http| http.get('/__identify__') }
57
57
 
58
- return res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
58
+ res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
59
59
  rescue SystemCallError, Net::ReadTimeout, OpenSSL::SSL::SSLError
60
60
  false
61
61
  end
@@ -45,6 +45,7 @@ module Capybara
45
45
  fill_in find find_all find_button find_by_id find_field find_link
46
46
  has_content? has_text? has_css? has_no_content? has_no_text?
47
47
  has_no_css? has_no_xpath? has_xpath? select uncheck
48
+ has_element? has_no_element?
48
49
  has_link? has_no_link? has_button? has_no_button? has_field?
49
50
  has_no_field? has_checked_field? has_unchecked_field?
50
51
  has_no_table? has_table? unselect has_select? has_no_select?
@@ -309,8 +310,8 @@ module Capybara
309
310
  # @!method send_keys
310
311
  # @see Capybara::Node::Element#send_keys
311
312
  #
312
- def send_keys(*args, **kw_args)
313
- driver.send_keys(*args, **kw_args)
313
+ def send_keys(...)
314
+ driver.send_keys(...)
314
315
  end
315
316
 
316
317
  ##
@@ -129,7 +129,7 @@ Capybara::SpecHelper.spec '#all' do
129
129
  end
130
130
 
131
131
  context 'with per session config', requires: [:psc] do
132
- it 'should use the sessions ignore_hidden_elements', psc: true do
132
+ it 'should use the sessions ignore_hidden_elements', :psc do
133
133
  Capybara.ignore_hidden_elements = true
134
134
  @session.config.ignore_hidden_elements = false
135
135
  expect(Capybara.ignore_hidden_elements).to be(true)
@@ -105,7 +105,7 @@ Capybara::SpecHelper.spec '#click_link' do
105
105
 
106
106
  it "should raise an error if no link's href matched the pattern" do
107
107
  expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound, %r{with href matching /invalid_pattern/})
108
- expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound, /#{Regexp.quote "with href matching /.+d+/"}/)
108
+ expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound, /#{Regexp.quote 'with href matching /.+d+/'}/)
109
109
  end
110
110
 
111
111
  context 'href: nil' do
@@ -233,6 +233,14 @@ Capybara::SpecHelper.spec '#find' do
233
233
  end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]"')
234
234
  end
235
235
 
236
+ context 'without locator' do
237
+ it 'should not output `nil` in the ElementNotFound message if nothing was found' do
238
+ expect do
239
+ @session.find(:label, text: 'no such thing').to be_nil
240
+ end.to raise_error(Capybara::ElementNotFound, 'Unable to find label')
241
+ end
242
+ end
243
+
236
244
  it 'should accept an XPath instance' do
237
245
  @session.visit('/form')
238
246
  @xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#has_element?' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be true if the given element is on the page' do
9
+ expect(@session).to have_element('a', id: 'foo')
10
+ expect(@session).to have_element('a', text: 'A link', href: '/with_simple_html')
11
+ expect(@session).to have_element('a', text: :'A link', href: :'/with_simple_html')
12
+ expect(@session).to have_element('a', text: 'A link', href: %r{/with_simple_html})
13
+ expect(@session).to have_element('a', text: 'labore', target: '_self')
14
+ end
15
+
16
+ it 'should be false if the given element is not on the page' do
17
+ expect(@session).not_to have_element('a', text: 'monkey')
18
+ expect(@session).not_to have_element('a', text: 'A link', href: '/nonexistent-href')
19
+ expect(@session).not_to have_element('a', text: 'A link', href: /nonexistent/)
20
+ expect(@session).not_to have_element('a', text: 'labore', target: '_blank')
21
+ end
22
+
23
+ it 'should notify if an invalid locator is specified' do
24
+ allow(Capybara::Helpers).to receive(:warn).and_return(nil)
25
+ @session.has_element?(@session)
26
+ expect(Capybara::Helpers).to have_received(:warn).with(/Called from: .+/)
27
+ end
28
+ end
29
+
30
+ Capybara::SpecHelper.spec '#has_no_element?' do
31
+ before do
32
+ @session.visit('/with_html')
33
+ end
34
+
35
+ it 'should be false if the given element is on the page' do
36
+ expect(@session).not_to have_no_element('a', id: 'foo')
37
+ expect(@session).not_to have_no_element('a', text: 'A link', href: '/with_simple_html')
38
+ expect(@session).not_to have_no_element('a', text: 'labore', target: '_self')
39
+ end
40
+
41
+ it 'should be true if the given element is not on the page' do
42
+ expect(@session).to have_no_element('a', text: 'monkey')
43
+ expect(@session).to have_no_element('a', text: 'A link', href: '/nonexistent-href')
44
+ expect(@session).to have_no_element('a', text: 'A link', href: %r{/nonexistent-href})
45
+ expect(@session).to have_no_element('a', text: 'labore', target: '_blank')
46
+ end
47
+ end
@@ -19,12 +19,17 @@ Capybara::SpecHelper.spec '#has_table?' do
19
19
  ])
20
20
  end
21
21
 
22
- it 'should accept rows with partial column header hashses' do
22
+ it 'should accept rows with partial column header hashes' do
23
23
  expect(@session).to have_table('Horizontal Headers', with_rows:
24
24
  [
25
25
  { 'First Name' => 'Thomas' },
26
26
  { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
27
27
  ])
28
+
29
+ expect(@session).not_to have_table('Horizontal Headers', with_rows:
30
+ [
31
+ { 'Unmatched Header' => 'Thomas' }
32
+ ])
28
33
  end
29
34
 
30
35
  it 'should accept rows with array of cell values' do
@@ -103,6 +108,11 @@ Capybara::SpecHelper.spec '#has_table?' do
103
108
  { 'First Name' => 'Danilo', 'Last Name' => 'Walpole', 'City' => 'Johnsonville' },
104
109
  { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
105
110
  ])
111
+
112
+ expect(@session).not_to have_table('Vertical Headers', with_cols:
113
+ [
114
+ { 'Unmatched Header' => 'Thomas' }
115
+ ])
106
116
  end
107
117
 
108
118
  it 'should be false if the table is not on the page' do
@@ -113,10 +123,11 @@ Capybara::SpecHelper.spec '#has_table?' do
113
123
  expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, 'First Name' => 'Thomas', 'Last Name' => 'Walpole')
114
124
  expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, 'Last Name' => 'Walpole')
115
125
  expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, 'First Name' => 'Walpole')
126
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, 'Unmatched Header' => 'Thomas')
116
127
  end
117
128
 
118
129
  it 'should find row by cell values' do
119
- expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, %w[Thomas Walpole])
130
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, %w[Thomas Walpole Oceanside])
120
131
  expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, %w[Walpole Thomas])
121
132
  expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, %w[Other])
122
133
  end
@@ -163,6 +163,12 @@ Capybara::SpecHelper.spec 'node' do
163
163
  @session.find(:css, '#single_input').set("my entry\n")
164
164
  expect(extract_results(@session)['single_input']).to eq('my entry')
165
165
  end
166
+
167
+ it 'should not submit single text input forms if ended with \n and has multiple values' do
168
+ @session.visit('/form')
169
+ @session.find(:css, '#two_input_1').set("my entry\n")
170
+ expect(@session.find(:css, '#two_input_1').value).to eq("my entry\n").or(eq 'my entry')
171
+ end
166
172
  end
167
173
 
168
174
  describe '#tag_name' do
@@ -34,6 +34,6 @@ Capybara::SpecHelper.spec '#to_capybara_node' do
34
34
  end.to raise_error(/^expected to find css "#second" within #<Capybara::Node::Element/)
35
35
  expect do
36
36
  expect(para).to have_link(href: %r{/without_simple_html})
37
- end.to raise_error(%r{^expected to find link nil with href matching /\\/without_simple_html/ within #<Capybara::Node::Element})
37
+ end.to raise_error(%r{^expected to find link with href matching /\\/without_simple_html/ within #<Capybara::Node::Element})
38
38
  end
39
39
  end
@@ -50,7 +50,7 @@ Capybara::SpecHelper.spec '#uncheck' do
50
50
 
51
51
  it 'should not accept partial matches when true' do
52
52
  expect do
53
- @session.uncheck('Ham', exact: true)
53
+ @session.uncheck('Ham', exact: true)
54
54
  end.to raise_error(Capybara::ElementNotFound)
55
55
  end
56
56
  end
@@ -72,7 +72,7 @@ module Capybara
72
72
  session.reset_session!
73
73
  end
74
74
 
75
- before :each, psc: true do
75
+ before :each, :psc do
76
76
  SpecHelper.reset_threadsafe(bool: true, session: session)
77
77
  end
78
78
 
@@ -138,4 +138,4 @@ module Capybara
138
138
  end
139
139
  end
140
140
 
141
- Dir["#{File.dirname(__FILE__)}/session/**/*.rb"].sort.each { |file| require_relative file }
141
+ Dir["#{File.dirname(__FILE__)}/session/**/*.rb"].each { |file| require_relative file }
@@ -248,7 +248,7 @@ class TestApp < Sinatra::Base
248
248
  'Thomas, Walpole, was , here'
249
249
  end
250
250
 
251
- get '/apple-touch-icon-precomposed.png' do
251
+ get %r{/apple-touch-.*\.png/} do
252
252
  halt(404)
253
253
  end
254
254
 
@@ -699,6 +699,11 @@ New line after and before textarea tag
699
699
  <input type="text" name="form[single_input]" id="single_input"/>
700
700
  </form>
701
701
 
702
+ <form id="two_input_form" action="/form" method="post">
703
+ <input type="text" name="form[two_input_1]" id="two_input_1"/>
704
+ <input type="text" name="form[two_input_2]" id="two_input_2"/>
705
+ </form>
706
+
702
707
  <label>Confusion
703
708
  <input type="checkbox" id="confusion_checkbox" class="confusion-checkbox confusion"/>
704
709
  </label>
@@ -200,6 +200,8 @@ banana</textarea>
200
200
  </div>
201
201
  </details>
202
202
 
203
+ <div style='height: 1000px'>spacer</div>
204
+
203
205
  <template id="template">
204
206
  <input />
205
207
  </template>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Capybara
4
- VERSION = '3.39.2'
4
+ VERSION = '3.40.0'
5
5
  end
data/lib/capybara.rb CHANGED
@@ -260,7 +260,7 @@ module Capybara
260
260
  #
261
261
  def current_driver
262
262
  if threadsafe
263
- Thread.current['capybara_current_driver']
263
+ Thread.current.thread_variable_get :capybara_current_driver
264
264
  else
265
265
  @current_driver
266
266
  end || default_driver
@@ -269,7 +269,7 @@ module Capybara
269
269
 
270
270
  def current_driver=(name)
271
271
  if threadsafe
272
- Thread.current['capybara_current_driver'] = name
272
+ Thread.current.thread_variable_set :capybara_current_driver, name
273
273
  else
274
274
  @current_driver = name
275
275
  end
@@ -336,7 +336,8 @@ module Capybara
336
336
  #
337
337
  def session_name
338
338
  if threadsafe
339
- Thread.current['capybara_session_name'] ||= :default
339
+ Thread.current.thread_variable_get(:capybara_session_name) ||
340
+ Thread.current.thread_variable_set(:capybara_session_name, :default)
340
341
  else
341
342
  @session_name ||= :default
342
343
  end
@@ -344,7 +345,7 @@ module Capybara
344
345
 
345
346
  def session_name=(name)
346
347
  if threadsafe
347
- Thread.current['capybara_session_name'] = name
348
+ Thread.current.thread_variable_set :capybara_session_name, name
348
349
  else
349
350
  @session_name = name
350
351
  end
@@ -424,7 +425,7 @@ module Capybara
424
425
 
425
426
  def specified_session
426
427
  if threadsafe
427
- Thread.current['capybara_specified_session']
428
+ Thread.current.thread_variable_get :capybara_specified_session
428
429
  else
429
430
  @specified_session ||= nil
430
431
  end
@@ -432,7 +433,7 @@ module Capybara
432
433
 
433
434
  def specified_session=(session)
434
435
  if threadsafe
435
- Thread.current['capybara_specified_session'] = session
436
+ Thread.current.thread_variable_set :capybara_specified_session, session
436
437
  else
437
438
  @specified_session = session
438
439
  end
@@ -60,6 +60,13 @@ class MinitestTest < Minitest::Test
60
60
  refute_selector(:css, 'select#not_form_title')
61
61
  end
62
62
 
63
+ def test_assert_element
64
+ visit('/with_html')
65
+ assert_element('a', text: 'A link')
66
+ assert_element(count: 1) { |el| el.text == 'A link' }
67
+ assert_no_element(text: 'Not on page')
68
+ end
69
+
63
70
  def test_assert_link
64
71
  visit('/with_html')
65
72
  assert_link('A link')
@@ -163,6 +170,6 @@ RSpec.describe 'capybara/minitest' do
163
170
  reporter.start
164
171
  MinitestTest.run reporter, {}
165
172
  reporter.report
166
- expect(output.string).to include('22 runs, 53 assertions, 0 failures, 0 errors, 1 skips')
173
+ expect(output.string).to include('23 runs, 56 assertions, 0 failures, 0 errors, 1 skips')
167
174
  end
168
175
  end
data/spec/result_spec.rb CHANGED
@@ -30,6 +30,15 @@ RSpec.describe Capybara::Result do
30
30
  result.last.text == 'Delta'
31
31
  end
32
32
 
33
+ it 'splats into multiple assignment' do
34
+ first, *rest, last = result
35
+
36
+ expect(first).to have_text 'Alpha'
37
+ expect(rest.first).to have_text 'Beta'
38
+ expect(rest.last).to have_text 'Gamma'
39
+ expect(last).to have_text 'Delta'
40
+ end
41
+
33
42
  it 'can supports values_at method' do
34
43
  expect(result.values_at(0, 2).map(&:text)).to eq(%w[Alpha Gamma])
35
44
  end
@@ -503,6 +503,30 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
503
503
  end
504
504
  end
505
505
 
506
+ describe 'have_element matcher' do
507
+ let(:html) { '<img src="/img.jpg" alt="a JPEG"><img src="/img.png" alt="a PNG">' }
508
+
509
+ it 'gives proper description' do
510
+ expect(have_element('img').description).to eq('have visible element "img"')
511
+ end
512
+
513
+ it 'passes if there is such a element' do
514
+ expect(html).to have_element('img', src: '/img.jpg')
515
+ end
516
+
517
+ it 'fails if there is no such element' do
518
+ expect do
519
+ expect(html).to have_element('photo')
520
+ end.to raise_error(/expected to find element "photo"/)
521
+ end
522
+
523
+ it 'supports compounding' do
524
+ expect(html).to have_element('img', alt: 'a JPEG').and have_element('img', src: '/img.png')
525
+ expect(html).to have_element('photo').or have_element('img', src: '/img.jpg')
526
+ expect(html).to have_no_element('photo').and have_element('img', alt: 'a PNG')
527
+ end
528
+ end
529
+
506
530
  describe 'have_link matcher' do
507
531
  let(:html) { '<a href="#">Just a link</a><a href="#">Another link</a>' }
508
532
 
@@ -840,10 +864,10 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
840
864
  end
841
865
 
842
866
  it 'gives proper description when :visible option passed' do
843
- expect(have_table('Lovely table', visible: true).description).to eq('have visible table "Lovely table"') # rubocop:disable RSpec/Capybara/VisibilityMatcher
867
+ expect(have_table('Lovely table', visible: true).description).to eq('have visible table "Lovely table"') # rubocop:disable Capybara/VisibilityMatcher
844
868
  expect(have_table('Lovely table', visible: :hidden).description).to eq('have non-visible table "Lovely table"')
845
869
  expect(have_table('Lovely table', visible: :all).description).to eq('have table "Lovely table"')
846
- expect(have_table('Lovely table', visible: false).description).to eq('have table "Lovely table"') # rubocop:disable RSpec/Capybara/VisibilityMatcher
870
+ expect(have_table('Lovely table', visible: false).description).to eq('have table "Lovely table"') # rubocop:disable Capybara/VisibilityMatcher
847
871
  end
848
872
 
849
873
  it 'passes if there is such a table' do
data/spec/rspec_spec.rb CHANGED
@@ -37,7 +37,7 @@ RSpec.describe 'capybara/rspec' do
37
37
  end
38
38
  end
39
39
 
40
- it 'switches to the javascript driver when giving it as metadata', js: true do
40
+ it 'switches to the javascript driver when giving it as metadata', :js do
41
41
  expect(Capybara.current_driver).to eq(Capybara.javascript_driver)
42
42
  end
43
43
 
@@ -10,7 +10,7 @@ require 'sauce_whisk'
10
10
 
11
11
  Capybara.register_driver :sauce_chrome do |app|
12
12
  options = {
13
- selenium_version: '3.141.59',
13
+ selenium_version: '4.8.0',
14
14
  platform: 'macOS 10.12',
15
15
  browser_name: 'chrome',
16
16
  version: '65.0',
@@ -117,7 +117,7 @@ RSpec.describe Capybara do
117
117
  css { |_sel| 'input[type="hidden"]' }
118
118
  end
119
119
 
120
- expect(string).to have_no_css('input[type="hidden"]') # rubocop:disable RSpec/Capybara/SpecificMatcher
120
+ expect(string).to have_no_css('input[type="hidden"]') # rubocop:disable Capybara/SpecificMatcher
121
121
  expect(string).to have_selector(:hidden_field)
122
122
  end
123
123
  end
@@ -10,8 +10,13 @@ CHROME_DRIVER = :selenium_chrome
10
10
 
11
11
  Selenium::WebDriver::Chrome.path = '/usr/bin/google-chrome-beta' if ENV.fetch('CI', nil) && ENV.fetch('CHROME_BETA', nil)
12
12
 
13
- browser_options = Selenium::WebDriver::Chrome::Options.new
14
- browser_options.add_argument('--headless') if ENV['HEADLESS']
13
+ Selenium::WebDriver.logger.ignore(:selenium_manager)
14
+
15
+ browser_options = if ENV['HEADLESS']
16
+ Selenium::WebDriver::Options.chrome(args: ['--headless=new'])
17
+ else
18
+ Selenium::WebDriver::Options.chrome
19
+ end
15
20
 
16
21
  # Chromedriver 77 requires setting this for headless mode on linux
17
22
  # Different versions of Chrome/selenium-webdriver require setting differently - jus set them all
@@ -83,12 +88,9 @@ Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_DRIVER.to_s, capybar
83
88
  case example.metadata[:full_description]
84
89
  when /#click_link can download a file$/
85
90
  skip 'Need to figure out testing of file downloading on windows platform' if Gem.win_platform?
86
- when /Capybara::Session selenium_chrome Capybara::Window#maximize/
87
- pending "Chrome headless doesn't support maximize" if ENV['HEADLESS']
88
91
  when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
89
92
  pending "Selenium doesn't currently support getting visible text for shadow root elements"
90
93
  when /Capybara::Session selenium_chrome node #shadow_root/
91
- skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
92
94
  skip 'Not supported with this chromedriver version' if chromedriver_lt?('96.0', @session)
93
95
  end
94
96
  end
@@ -57,14 +57,9 @@ skipped_tests = %i[response_headers status_code trigger download]
57
57
 
58
58
  Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
59
59
  case example.metadata[:full_description]
60
- when 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should not break when using HTML5 multiple file input uploading multiple files',
61
- 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once for each set of files uploaded',
62
- 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
63
- pending "Selenium with Remote Chrome doesn't support multiple file upload" unless selenium_gte?(3.14)
64
60
  when /Capybara::Session selenium_chrome_remote node #shadow_root should get visible text/
65
61
  pending "Selenium doesn't currently support getting visible text for shadow root elements"
66
62
  when /Capybara::Session selenium_chrome_remote node #shadow_root/
67
- skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
68
63
  skip 'Not supported with this chromedriver version' if chromedriver_lt?('96.0', @session)
69
64
  end
70
65
  end
@@ -10,6 +10,8 @@ require 'rspec/shared_spec_matchers'
10
10
  # Selenium::WebDriver::Edge::Service.driver_path = '/usr/local/bin/msedgedriver'
11
11
  # end
12
12
 
13
+ Selenium::WebDriver.logger.ignore(:selenium_manager)
14
+
13
15
  if Selenium::WebDriver::Platform.mac?
14
16
  Selenium::WebDriver::Edge.path = '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge'
15
17
  end
@@ -17,8 +19,15 @@ end
17
19
  Capybara.register_driver :selenium_edge do |app|
18
20
  # ::Selenium::WebDriver.logger.level = "debug"
19
21
  # If we don't create an options object the path set above won't be used
20
- browser_options = Selenium::WebDriver::Edge::Options.new
21
- browser_options.add_argument('--headless') if ENV['HEADLESS']
22
+
23
+ # browser_options = Selenium::WebDriver::Edge::Options.new
24
+ # browser_options.add_argument('--headless') if ENV['HEADLESS']
25
+
26
+ browser_options = if ENV['HEADLESS']
27
+ Selenium::WebDriver::Options.edge(args: ['--headless=new'])
28
+ else
29
+ Selenium::WebDriver::Options.edge
30
+ end
22
31
 
23
32
  Capybara::Selenium::Driver.new(app, browser: :edge, options: browser_options).tap do |driver|
24
33
  driver.browser
@@ -40,8 +49,6 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, 'selenium', capybara_
40
49
  pending "Edge doesn't allow clicking on file inputs"
41
50
  when /Capybara::Session selenium node #shadow_root should get visible text/
42
51
  pending "Selenium doesn't currently support getting visible text for shadow root elements"
43
- when /Capybara::Session selenium Capybara::Window#maximize/
44
- pending "Edge headless doesn't support maximize" if ENV['HEADLESS']
45
52
  end
46
53
  end
47
54
 
@@ -6,8 +6,10 @@ require 'shared_selenium_session'
6
6
  require 'shared_selenium_node'
7
7
  require 'rspec/shared_spec_matchers'
8
8
 
9
+ Selenium::WebDriver.logger.ignore(:selenium_manager)
10
+
9
11
  browser_options = Selenium::WebDriver::Firefox::Options.new
10
- browser_options.headless! if ENV['HEADLESS']
12
+ browser_options.add_argument '-headless' if ENV['HEADLESS']
11
13
  # browser_options.add_option("log", {"level": "trace"})
12
14
 
13
15
  browser_options.profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
@@ -78,13 +80,12 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capyba
78
80
  'Capybara::Session selenium node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
79
81
  'Capybara::Session selenium node #shadow_root should produce error messages when failing',
80
82
  'Capybara::Session with firefox with selenium driver #evaluate_script returns a shadow root'
81
- pending "Firefox doesn't yet have full W3C shadow root support"
83
+ pending "Firefox doesn't yet have full W3C shadow root support" if firefox_lt?(113, @session)
82
84
  when 'Capybara::Session selenium #fill_in should handle carriage returns with line feeds in a textarea correctly'
83
85
  pending 'Not sure what firefox is doing here'
84
86
  when /Capybara::Session selenium node #shadow_root should get visible text/
85
87
  pending "Selenium doesn't currently support getting visible text for shadow root elements"
86
88
  when /Capybara::Session selenium node #shadow_root/
87
- skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
88
89
  skip 'Not supported with this geckodriver version' if geckodriver_lt?('0.31.0', @session)
89
90
  when /Capybara::Session selenium node #set should submit single text input forms if ended with \\n/
90
91
  pending 'Firefox/geckodriver doesn\'t submit with values ending in \n'
@@ -71,14 +71,13 @@ Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVE
71
71
  'Capybara::Session selenium_firefox_remote node #shadow_root should click on elements',
72
72
  'Capybara::Session selenium_firefox_remote node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
73
73
  'Capybara::Session selenium_firefox_remote node #shadow_root should produce error messages when failing',
74
- 'Capybara::Session with firefox with selenium driver #evaluate_script returns a shadow root'
74
+ 'Capybara::Session with remote firefox with selenium driver #evaluate_script returns a shadow root'
75
75
  pending "Firefox doesn't yet have full W3C shadow root support"
76
76
  when /Capybara::Session selenium_firefox_remote node #shadow_root should get visible text/
77
77
  pending "Selenium doesn't currently support getting visible text for shadow root elements"
78
78
  when /Capybara::Session selenium_firefox_remote node #shadow_root/
79
- skip 'Not supported with this Selenium version' if selenium_lt?('4.1', @session)
80
79
  skip 'Not supported with this geckodriver version' if geckodriver_lt?('0.31.0', @session)
81
- when /Capybara::Session selenium_firefox_remote node #set should submit single text input forms if ended with \\n/
80
+ when /Capybara::Session selenium node #set should submit single text input forms if ended with \\n/
82
81
  pending 'Firefox/geckodriver doesn\'t submit with values ending in \n'
83
82
  end
84
83
  end