capybara 3.27.0 → 3.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d2fb2005b8e78a2ee5cd0cf72bdfe2143988cce46abf19422f00bc78ac6336fa
4
- data.tar.gz: 17f7b3eba5799d74ba90bddd6bacec90f1318e3c731097a4cb362f211272652b
3
+ metadata.gz: 59f170c7004d4936ffb0d136a4dd0755a9c1ec5870f6bf1114d693b99a8fed51
4
+ data.tar.gz: 955e163359d522952afdc7d776458667f97aa053e6eb704320733eae8340544a
5
5
  SHA512:
6
- metadata.gz: 28e92147279b5b2ee953853fd93071e143719ec099fb68187ea4fa666fbe3593606876968861c9104967e7b7bbd2033b2105ce9720bb00b4de94cd98c8473553
7
- data.tar.gz: 25aee95fc26cc88c27e5229f73665a1cf6b2a8658ece2b8503809a520a45afe5622b28825206cff599ad7a2e749dbc168941dcc298995bc43fd61545b6a306a1
6
+ metadata.gz: 13d33c4977455c5d2e9a5aa7532ffed98573795a1528685ded75574dfabd58512f5d3e71d3582d8155fe4325209ba3bbde3246a29b4436de573c5b492dffe1cc
7
+ data.tar.gz: 52b33d646ec5c86b61a04b7f2c354a1d1e77d1c363b0ba8d19e7ad1b48679a53078766c8f018f1d7f223b730d9b4d951f005a689a3f143999fdeead4c522242c
data/History.md CHANGED
@@ -1,3 +1,14 @@
1
+ # Version 3.28.0
2
+ Release date: 2019-08-03
3
+
4
+ ### Added
5
+
6
+ * Allow forcing HTML5 or legacy dragging via the `:html5` option to `drag_to` when using Selenium with Chrome or Firefox
7
+ * Autodetection of drag type interprets not seeing the mousedown event as legacy.
8
+ * HTML5 form validation `:valid` node filter added to `:field` and `:fillable_field` selectors
9
+ * When using Capybara registered :puma server - patches Puma 4.0.x to fix SSL connection behavior. Removes
10
+ default `queue_requests` setting - Issue #2227
11
+
1
12
  # Version 3.27.0
2
13
  Release date: 2019-07-28
3
14
 
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
8
8
  [![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=capybara&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
9
9
 
10
- **Note** You are viewing the README for the 3.27.x version of Capybara
10
+ **Note** You are viewing the README for the 3.28.x version of Capybara.
11
11
 
12
12
  Capybara helps you test web applications by simulating how a real user would
13
13
  interact with your app. It is agnostic about the driver running your tests and
@@ -396,8 +396,13 @@ module Capybara
396
396
  #
397
397
  # @param [Capybara::Node::Element] node The element to drag to
398
398
  # @param [Hash] options Driver specific options for dragging. May not be supported by all drivers.
399
+ # @option options [Numeric] :delay (0.05) When using Chrome/Firefox with Selenium and HTML5 dragging this is the number
400
+ # of seconds between each stage of the drag.
401
+ # @option options [Boolean] :html5 When using Chrome/Firefox with Selenium enables to force the use of HTML5
402
+ # (true) or legacy (false) dragging. If not specified the driver will attempt to
403
+ # detect the correct method to use.
399
404
  #
400
- # @return [Capybara::Node::Element] The element
405
+ # @return [Capybara::Node::Element] The dragged element
401
406
  def drag_to(node, **options)
402
407
  synchronize { base.drag_to(node.base, **options) }
403
408
  self
@@ -510,6 +515,28 @@ module Capybara
510
515
  JS
511
516
  end
512
517
 
518
+ ##
519
+ #
520
+ # Toggle the elements background color between white and black for a period of time.
521
+ #
522
+ # @return [Capybara::Node::Element] The element
523
+ def flash
524
+ execute_script(<<~JS, 100)
525
+ async function flash(el, delay){
526
+ var old_bg = el.style.backgroundColor;
527
+ var colors = ["black", "white"];
528
+ for(var i=0; i<20; i++){
529
+ el.style.backgroundColor = colors[i % colors.length];
530
+ await new Promise(resolve => setTimeout(resolve, delay));
531
+ }
532
+ el.style.backgroundColor = old_bg;
533
+ }
534
+ flash(this, arguments[0]);
535
+ JS
536
+
537
+ self
538
+ end
539
+
513
540
  # @api private
514
541
  def reload
515
542
  if @allow_reload
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Puma
4
+ module MiniSSL
5
+ class Socket
6
+ def read_nonblock(size, *_)
7
+ loop do
8
+ output = engine_read_all
9
+ return output if output
10
+
11
+ data = @socket.read_nonblock(size, exception: false)
12
+ raise IO::EAGAINWaitReadable if %i[wait_readable wait_writable].include? data
13
+ return nil if data.nil?
14
+
15
+ @engine.inject(data)
16
+ output = engine_read_all
17
+
18
+ return output if output
19
+
20
+ while (neg_data = @engine.extract)
21
+ @socket.write neg_data
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -20,16 +20,19 @@ Capybara.register_server :puma do |app, port, host, **options|
20
20
  raise LoadError, 'Capybara requires `puma` version 3.8.0 or higher, please upgrade `puma` or register and specify your own server block'
21
21
  end
22
22
  end
23
+
23
24
  # If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
24
25
  # Therefore construct and run the Server instance ourselves.
25
26
  # Rack::Handler::Puma.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
26
- default_options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false, queue_requests: false }
27
- default_options[:queue_requests] = false if options[:Host]&.start_with?('ssl://')
27
+ default_options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false }
28
28
  options = default_options.merge(options)
29
29
 
30
30
  conf = Rack::Handler::Puma.config(app, options)
31
31
  events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
32
32
 
33
+ puma_ver = Gem::Version.new(Puma::Const::PUMA_VERSION)
34
+ require_relative 'patches/puma_ssl' if (Gem::Version.new('4.0.0')...Gem::Version.new('4.1.0')).cover? puma_ver
35
+
33
36
  events.log 'Capybara starting Puma...'
34
37
  events.log "* Version #{Puma::Const::PUMA_VERSION} , codename: #{Puma::Const::CODE_NAME}"
35
38
  events.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
@@ -34,6 +34,7 @@ require 'capybara/selector/definition'
34
34
  # * :unchecked (Boolean) - Match unchecked fields?
35
35
  # * :disabled (Boolean, :all) - Match disabled field? (Default: false)
36
36
  # * :multiple (Boolean) - Match fields that accept multiple values
37
+ # * :valid (Boolean) - Match fields that are valid/invalid according to HTML5 form validation
37
38
  #
38
39
  # * **:fieldset** - Select fieldset elements
39
40
  # * Locator: Matches id, {Capybara.configure test_id}, or contents of wrapped legend
@@ -72,6 +73,7 @@ require 'capybara/selector/definition'
72
73
  # * :type (String) - Matches the type attribute of the field or element type for 'textarea'
73
74
  # * :disabled (Boolean, :all) - Match disabled field? (Default: false)
74
75
  # * :multiple (Boolean) - Match fields that accept multiple values
76
+ # * :valid (Boolean) - Match fields that are valid/invalid according to HTML5 form validation
75
77
  #
76
78
  # * **:radio_button** - Find radio buttons
77
79
  # * Locator: Match id, {Capybara.configure test_id} attribute, name, or associated label text
@@ -166,6 +168,7 @@ Capybara::Selector::FilterSet.add(:_field) do
166
168
  node_filter(:checked, :boolean) { |node, value| !(value ^ node.checked?) }
167
169
  node_filter(:unchecked, :boolean) { |node, value| (value ^ node.checked?) }
168
170
  node_filter(:disabled, :boolean, default: false, skip_if: :all) { |node, value| !(value ^ node.disabled?) }
171
+ node_filter(:valid, :boolean) { |node, value| node.evaluate_script('this.validity.valid') == value }
169
172
 
170
173
  expression_filter(:name) { |xpath, val| xpath[XPath.attr(:name) == val] }
171
174
  expression_filter(:placeholder) { |xpath, val| xpath[XPath.attr(:placeholder) == val] }
@@ -182,12 +185,14 @@ Capybara::Selector::FilterSet.add(:_field) do
182
185
  desc
183
186
  end
184
187
 
185
- describe(:node_filters) do |checked: nil, unchecked: nil, disabled: nil, **|
188
+ describe(:node_filters) do |checked: nil, unchecked: nil, disabled: nil, valid: nil, **|
186
189
  desc, states = +'', []
187
190
  states << 'checked' if checked || (unchecked == false)
188
191
  states << 'not checked' if unchecked || (checked == false)
189
192
  states << 'disabled' if disabled == true
190
193
  desc << " that is #{states.join(' and ')}" unless states.empty?
194
+ desc << ' that is valid' if valid == true
195
+ desc << ' that is invalid' if valid == false
191
196
  desc
192
197
  end
193
198
  end
@@ -18,7 +18,7 @@ Capybara.add_selector(:fillable_field, locator_type: [String, Symbol]) do
18
18
  end
19
19
  end
20
20
 
21
- filter_set(:_field, %i[disabled multiple name placeholder])
21
+ filter_set(:_field, %i[disabled multiple name placeholder valid])
22
22
 
23
23
  node_filter(:with) do |node, with|
24
24
  val = node.value
@@ -430,6 +430,10 @@ private
430
430
  ::Capybara::Selenium::Node.new(self, native_node, initial_cache)
431
431
  end
432
432
 
433
+ def bridge
434
+ browser.send(:bridge)
435
+ end
436
+
433
437
  def specialize_driver
434
438
  browser_type = browser.browser
435
439
  Capybara::Selenium::Driver.specializations.select { |k, _v| k === browser_type }.each_value do |specialization| # rubocop:disable Style/CaseEquality
@@ -108,10 +108,6 @@ private
108
108
  ::Capybara::Selenium::ChromeNode.new(self, native_node, initial_cache)
109
109
  end
110
110
 
111
- def bridge
112
- browser.send(:bridge)
113
- end
114
-
115
111
  def chromedriver_version
116
112
  @chromedriver_version ||= begin
117
113
  caps = browser.capabilities
@@ -3,6 +3,12 @@
3
3
  require 'capybara/selenium/nodes/edge_node'
4
4
 
5
5
  module Capybara::Selenium::Driver::EdgeDriver
6
+ def self.extended(base)
7
+ bridge = base.send(:bridge)
8
+ bridge.extend Capybara::Selenium::IsDisplayed unless bridge.commands(:is_element_displayed)
9
+ base.options[:native_displayed] = false if base.options[:native_displayed].nil?
10
+ end
11
+
6
12
  def fullscreen_window(handle)
7
13
  return super if edgedriver_version < 75
8
14
 
@@ -108,10 +114,6 @@ private
108
114
  ::Capybara::Selenium::EdgeNode.new(self, native_node, initial_cache)
109
115
  end
110
116
 
111
- def bridge
112
- browser.send(:bridge)
113
- end
114
-
115
117
  def edgedriver_version
116
118
  @edgedriver_version ||= begin
117
119
  caps = browser.capabilities
@@ -13,12 +13,6 @@ module Capybara::Selenium::Driver::FirefoxDriver
13
13
  (defined?(Selenium::WebDriver::VERSION) && (Selenium::WebDriver::VERSION.to_f >= 4)) ||
14
14
  driver.browser.capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities)
15
15
  end
16
-
17
- private
18
-
19
- def bridge
20
- browser.send(:bridge)
21
- end
22
16
  end
23
17
 
24
18
  module Capybara::Selenium::Driver::W3CFirefoxDriver
@@ -18,10 +18,6 @@ private
18
18
  def build_node(native_node, initial_cache = {})
19
19
  ::Capybara::Selenium::SafariNode.new(self, native_node, initial_cache)
20
20
  end
21
-
22
- def bridge
23
- browser.send(:bridge)
24
- end
25
21
  end
26
22
 
27
23
  Capybara::Selenium::Driver.register_specialization(/^(safari|Safari_Technology_Preview)$/,
@@ -4,13 +4,14 @@ class Capybara::Selenium::Node
4
4
  module Html5Drag
5
5
  # Implement methods to emulate HTML5 drag and drop
6
6
 
7
- def drag_to(element, delay: 0.05)
7
+ def drag_to(element, html5: nil, delay: 0.05)
8
8
  driver.execute_script MOUSEDOWN_TRACKER
9
9
  scroll_if_needed { browser_action.click_and_hold(native).perform }
10
- if driver.evaluate_script(LEGACY_DRAG_CHECK, self)
11
- perform_legacy_drag(element)
12
- else
10
+ html5 = !driver.evaluate_script(LEGACY_DRAG_CHECK, self) if html5.nil?
11
+ if html5
13
12
  perform_html5_drag(element, delay)
13
+ else
14
+ perform_legacy_drag(element)
14
15
  end
15
16
  end
16
17
 
@@ -89,6 +90,7 @@ class Capybara::Selenium::Node
89
90
  JS
90
91
 
91
92
  MOUSEDOWN_TRACKER = <<~JS
93
+ window.capybara_mousedown_prevented = null;
92
94
  document.addEventListener('mousedown', ev => {
93
95
  window.capybara_mousedown_prevented = ev.defaultPrevented;
94
96
  }, { once: true, passive: true })
@@ -96,7 +98,10 @@ class Capybara::Selenium::Node
96
98
 
97
99
  LEGACY_DRAG_CHECK = <<~JS
98
100
  (function(el){
99
- if (window.capybara_mousedown_prevented) return true;
101
+ if ([true, null].indexOf(window.capybara_mousedown_prevented) >= 0){
102
+ return true;
103
+ }
104
+
100
105
  do {
101
106
  if (el.draggable) return false;
102
107
  } while (el = el.parentElement );
@@ -299,11 +299,31 @@ private
299
299
  end
300
300
 
301
301
  def set_file(value) # rubocop:disable Naming/AccessorMethodName
302
- path_names = value.to_s.empty? ? [] : value
303
- file_names = Array(path_names).map do |pn|
304
- Pathname.new(pn).absolute? ? pn : File.expand_path(pn)
305
- end.join("\n")
306
- native.send_keys(file_names)
302
+ with_file_detector do
303
+ path_names = value.to_s.empty? ? [] : value
304
+ file_names = Array(path_names).map do |pn|
305
+ Pathname.new(pn).absolute? ? pn : File.expand_path(pn)
306
+ end.join("\n")
307
+ native.send_keys(file_names)
308
+ end
309
+ end
310
+
311
+ def with_file_detector
312
+ if driver.options[:browser] == :remote &&
313
+ bridge.respond_to?(:file_detector) &&
314
+ bridge.file_detector.nil?
315
+ begin
316
+ bridge.file_detector = lambda do |(fn, *)|
317
+ str = fn.to_s
318
+ str if File.exist?(str)
319
+ end
320
+ yield
321
+ ensure
322
+ bridge.file_detector = nil
323
+ end
324
+ else
325
+ yield
326
+ end
307
327
  end
308
328
 
309
329
  def set_content_editable(value) # rubocop:disable Naming/AccessorMethodName
@@ -359,6 +379,10 @@ private
359
379
  driver.browser
360
380
  end
361
381
 
382
+ def bridge
383
+ browser.send(:bridge)
384
+ end
385
+
362
386
  def browser_action
363
387
  browser.action
364
388
  end
@@ -84,10 +84,6 @@ private
84
84
  end
85
85
  end
86
86
 
87
- def bridge
88
- driver.browser.send(:bridge)
89
- end
90
-
91
87
  def w3c?
92
88
  (defined?(Selenium::WebDriver::VERSION) && (Selenium::WebDriver::VERSION.to_f >= 4)) ||
93
89
  capabilities.is_a?(::Selenium::WebDriver::Remote::W3C::Capabilities)
@@ -36,14 +36,16 @@ class Capybara::Selenium::EdgeNode < Capybara::Selenium::Node
36
36
  html5_drop(*args)
37
37
  end
38
38
 
39
- # def click(*)
40
- # super
41
- # rescue ::Selenium::WebDriver::Error::WebDriverError => e
42
- # # chromedriver 74 (at least on mac) raises the wrong error for this
43
- # raise ::Selenium::WebDriver::Error::ElementClickInterceptedError, e.message if e.message.match?(/element click intercepted/)
44
- #
45
- # raise
46
- # end
39
+ def click(*)
40
+ super
41
+ rescue Selenium::WebDriver::Error::InvalidArgumentError => e
42
+ tag_name, type = attrs(:tagName, :type).map { |val| val&.downcase }
43
+ if tag_name == 'input' && type == 'file'
44
+ raise Selenium::WebDriver::Error::InvalidArgumentError, "EdgeChrome can't click on file inputs.\n#{e.message}"
45
+ end
46
+
47
+ raise
48
+ end
47
49
 
48
50
  def disabled?
49
51
  return super unless chrome_edge?
@@ -61,6 +63,18 @@ class Capybara::Selenium::EdgeNode < Capybara::Selenium::Node
61
63
  click unless selected_or_disabled
62
64
  end
63
65
 
66
+ def visible?
67
+ return super unless chrome_edge? && native_displayed?
68
+
69
+ begin
70
+ bridge.send(:execute, :is_element_displayed, id: native.ref)
71
+ rescue Selenium::WebDriver::Error::UnknownCommandError
72
+ # If the is_element_displayed command is unknown, no point in trying again
73
+ driver.options[:native_displayed] = false
74
+ super
75
+ end
76
+ end
77
+
64
78
  private
65
79
 
66
80
  def file_errors
@@ -69,10 +83,6 @@ private
69
83
  end
70
84
  end
71
85
 
72
- def bridge
73
- driver.browser.send(:bridge)
74
- end
75
-
76
86
  def browser_version
77
87
  @browser_version ||= begin
78
88
  caps = driver.browser.capabilities
@@ -83,4 +93,10 @@ private
83
93
  def chrome_edge?
84
94
  browser_version >= 75
85
95
  end
96
+
97
+ def native_displayed?
98
+ (driver.options[:native_displayed] != false) &&
99
+ # chromedriver_supports_displayed_endpoint? &&
100
+ (!ENV['DISABLE_CAPYBARA_SELENIUM_OPTIMIZATIONS'])
101
+ end
86
102
  end
@@ -115,10 +115,6 @@ private
115
115
  actions
116
116
  end
117
117
 
118
- def bridge
119
- driver.browser.send(:bridge)
120
- end
121
-
122
118
  def upload(local_file)
123
119
  return nil unless local_file
124
120
  raise ArgumentError, "You may only upload files: #{local_file.inspect}" unless File.file?(local_file)
@@ -90,10 +90,6 @@ class Capybara::Selenium::SafariNode < Capybara::Selenium::Node
90
90
 
91
91
  private
92
92
 
93
- def bridge
94
- driver.browser.send(:bridge)
95
- end
96
-
97
93
  def _send_keys(keys, actions = browser_action, down_keys = ModifierKeysStack.new)
98
94
  case keys
99
95
  when *MODIFIER_KEYS
@@ -93,6 +93,24 @@ Capybara::SpecHelper.spec '#has_field' do
93
93
  expect(@session).not_to have_field('Html5 Multiple Email', multiple: false)
94
94
  end
95
95
  end
96
+
97
+ context 'with valid', requires: [:js] do
98
+ it 'should be true if field is valid' do
99
+ @session.fill_in 'required', with: 'something'
100
+ @session.fill_in 'length', with: 'abcd'
101
+
102
+ expect(@session).to have_field('required', valid: true)
103
+ expect(@session).to have_field('length', valid: true)
104
+ end
105
+
106
+ it 'should be false if field is invalid' do
107
+ expect(@session).not_to have_field('required', valid: true)
108
+ expect(@session).to have_field('required', valid: false)
109
+
110
+ @session.fill_in 'length', with: 'abc'
111
+ expect(@session).not_to have_field('length', valid: true)
112
+ end
113
+ end
96
114
  end
97
115
 
98
116
  Capybara::SpecHelper.spec '#has_no_field' do
@@ -444,6 +444,20 @@ Capybara::SpecHelper.spec 'node' do
444
444
  end
445
445
  end
446
446
 
447
+ it 'should work with jsTree' do
448
+ @session.visit('/with_jstree')
449
+ @session.within(:css, '#container') do
450
+ @session.assert_text(/A.*B.*C/m)
451
+ source = @session.find(:css, '#j1_1_anchor')
452
+ target = @session.find(:css, '#j1_2_anchor')
453
+
454
+ source.drag_to(target)
455
+
456
+ @session.assert_no_text(/A.*B.*C/m)
457
+ @session.assert_text(/B.*C/m)
458
+ end
459
+ end
460
+
447
461
  context 'HTML5', requires: %i[js html5_drag] do
448
462
  it 'should HTML5 drag and drop an object' do
449
463
  @session.visit('/with_js')
@@ -1,7 +1,7 @@
1
1
 
2
2
  <h1>Form</h1>
3
3
 
4
- <form action="/form" method="post">
4
+ <form action="/form" method="post" novalidate>
5
5
 
6
6
  <p>
7
7
  <label for="form_title">Title</label>
@@ -460,6 +460,11 @@ New line after and before textarea tag
460
460
  <input id="readonly" name="form[readonly_test]" readonly/>
461
461
  <input id="not_readonly" name="form[readonly_test]" />
462
462
  </p>
463
+
464
+ <p>
465
+ <input id="required" name="form[required]" required />
466
+ <input id="length" name="form[length]" minlength="4" maxlength="4" />
467
+ </p>
463
468
  </form>
464
469
 
465
470
  <input type="text" name="form[outside_input]" value="outside_input" form="form1"/>
@@ -0,0 +1,26 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>with_jstree</title>
6
+ </head>
7
+ <body id="with_jstree">
8
+ <div id="container">
9
+ <ul>
10
+ <li>Child node A</li>
11
+ <li>Child node B</li>
12
+ <li>Child node C</li>
13
+ </ul>
14
+ </div>
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
16
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.8/jstree.min.js"></script>
17
+ <script>
18
+ $(function () {
19
+ $('#container').jstree({
20
+ "core" : { "check_callback" : true }, // so that operations work
21
+ "plugins" : ["dnd"]
22
+ });
23
+ });
24
+ </script>
25
+ </body>
26
+ </html>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Capybara
4
- VERSION = '3.27.0'
4
+ VERSION = '3.28.0'
5
5
  end
@@ -54,12 +54,6 @@ module TestSessions
54
54
  Chrome = Capybara::Session.new(CHROME_REMOTE_DRIVER, TestApp)
55
55
  end
56
56
 
57
- TestSessions::Chrome.driver.browser.file_detector = lambda do |args|
58
- # args => ["/path/to/file"]
59
- str = args.first.to_s
60
- str if File.exist?(str)
61
- end
62
-
63
57
  skipped_tests = %i[response_headers status_code trigger download]
64
58
 
65
59
  Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
@@ -6,16 +6,19 @@ require 'shared_selenium_session'
6
6
  require 'shared_selenium_node'
7
7
  require 'rspec/shared_spec_matchers'
8
8
 
9
- unless ENV['CI']
10
- Selenium::WebDriver::Edge::Service.driver_path = '/usr/local/bin/msedgedriver'
11
- Selenium::WebDriver::EdgeChrome.path = '/Applications/Microsoft Edge Canary.app/Contents/MacOS/Microsoft Edge Canary'
12
- end
9
+ # unless ENV['CI']
10
+ # Selenium::WebDriver::Edge::Service.driver_path = '/usr/local/bin/msedgedriver'
11
+ # end
13
12
 
14
- Webdrivers::Edgedriver.required_version = '76.0.168' if ENV['CI']
13
+ if ::Selenium::WebDriver::Platform.mac?
14
+ Selenium::WebDriver::EdgeChrome.path = '/Applications/Microsoft Edge Dev.app/Contents/MacOS/Microsoft Edge Dev'
15
+ end
15
16
 
16
17
  Capybara.register_driver :selenium_edge do |app|
17
18
  # ::Selenium::WebDriver.logger.level = "debug"
18
- Capybara::Selenium::Driver.new(app, browser: :edge_chrome).tap do |driver|
19
+ # If we don't create an options object the path set above won't be used
20
+ browser_options = ::Selenium::WebDriver::EdgeChrome::Options.new
21
+ Capybara::Selenium::Driver.new(app, browser: :edge_chrome, options: browser_options).tap do |driver|
19
22
  driver.browser
20
23
  driver.download_path = Capybara.save_path
21
24
  end
@@ -27,17 +30,13 @@ end
27
30
 
28
31
  skipped_tests = %i[response_headers status_code trigger]
29
32
 
30
- Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Edge) if ENV['CI']
33
+ Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::EdgeChrome) if ENV['CI']
31
34
 
32
35
  Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, 'selenium', capybara_skip: skipped_tests do |example|
33
- # case example.metadata[:description]
34
- # when /#refresh it reposts$/
35
- # skip 'Edge insists on prompting without providing a way to suppress'
36
- # when /should be able to open non-http url/
37
- # skip 'Crashes'
38
- # when /when Capybara.always_include_port is true/
39
- # skip 'Crashes'
40
- # end
36
+ case example.metadata[:full_description]
37
+ when 'Capybara::Session selenium #attach_file with a block can upload by clicking the file input'
38
+ pending "EdgeChrome doesn't allow clicking on file inputs"
39
+ end
41
40
  end
42
41
 
43
42
  RSpec.describe 'Capybara::Session with Edge', capybara_skip: skipped_tests do
@@ -50,12 +50,6 @@ module TestSessions
50
50
  RemoteFirefox = Capybara::Session.new(FIREFOX_REMOTE_DRIVER, TestApp)
51
51
  end
52
52
 
53
- TestSessions::RemoteFirefox.driver.browser.file_detector = lambda do |args|
54
- # args => ["/path/to/file"]
55
- str = args.first.to_s
56
- str if File.exist?(str)
57
- end
58
-
59
53
  skipped_tests = %i[response_headers status_code trigger download]
60
54
 
61
55
  Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
@@ -39,12 +39,7 @@ Capybara.register_driver :selenium_ie do |app|
39
39
  Capybara::Selenium::Driver.new(app,
40
40
  browser: :remote,
41
41
  options: options,
42
- url: url).tap do |driver|
43
- driver.browser.file_detector = lambda do |args|
44
- str = args.first.to_s
45
- str if File.exist?(str)
46
- end
47
- end
42
+ url: url)
48
43
  else
49
44
  Capybara::Selenium::Driver.new(
50
45
  app,
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.27.0
4
+ version: 3.28.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-07-28 00:00:00.000000000 Z
13
+ date: 2019-08-03 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: addressable
@@ -451,6 +451,7 @@ files:
451
451
  - lib/capybara/rack_test/node.rb
452
452
  - lib/capybara/rails.rb
453
453
  - lib/capybara/registrations/drivers.rb
454
+ - lib/capybara/registrations/patches/puma_ssl.rb
454
455
  - lib/capybara/registrations/servers.rb
455
456
  - lib/capybara/result.rb
456
457
  - lib/capybara/rspec.rb
@@ -668,6 +669,7 @@ files:
668
669
  - lib/capybara/spec/views/with_html5_svg.erb
669
670
  - lib/capybara/spec/views/with_html_entities.erb
670
671
  - lib/capybara/spec/views/with_js.erb
672
+ - lib/capybara/spec/views/with_jstree.erb
671
673
  - lib/capybara/spec/views/with_namespace.erb
672
674
  - lib/capybara/spec/views/with_scope.erb
673
675
  - lib/capybara/spec/views/with_scope_other.erb