capybara 3.16.2 → 3.17.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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +13 -0
  3. data/README.md +1 -1
  4. data/lib/capybara.rb +2 -71
  5. data/lib/capybara/config.rb +1 -2
  6. data/lib/capybara/node/actions.rb +5 -5
  7. data/lib/capybara/node/base.rb +4 -4
  8. data/lib/capybara/node/element.rb +5 -5
  9. data/lib/capybara/node/finders.rb +6 -4
  10. data/lib/capybara/node/simple.rb +3 -2
  11. data/lib/capybara/queries/selector_query.rb +5 -5
  12. data/lib/capybara/queries/style_query.rb +1 -1
  13. data/lib/capybara/rack_test/form.rb +1 -1
  14. data/lib/capybara/registrations/drivers.rb +36 -0
  15. data/lib/capybara/registrations/servers.rb +38 -0
  16. data/lib/capybara/result.rb +2 -2
  17. data/lib/capybara/rspec/matcher_proxies.rb +2 -2
  18. data/lib/capybara/rspec/matchers/base.rb +2 -2
  19. data/lib/capybara/selector.rb +55 -32
  20. data/lib/capybara/selector/css.rb +1 -1
  21. data/lib/capybara/selector/filters/base.rb +1 -1
  22. data/lib/capybara/selector/selector.rb +1 -0
  23. data/lib/capybara/selenium/driver.rb +84 -43
  24. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +16 -4
  25. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +23 -0
  26. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +5 -0
  27. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +14 -1
  28. data/lib/capybara/selenium/extensions/find.rb +48 -37
  29. data/lib/capybara/selenium/logger_suppressor.rb +29 -0
  30. data/lib/capybara/selenium/node.rb +22 -8
  31. data/lib/capybara/selenium/nodes/chrome_node.rb +8 -2
  32. data/lib/capybara/server/animation_disabler.rb +1 -1
  33. data/lib/capybara/server/checker.rb +1 -1
  34. data/lib/capybara/server/middleware.rb +3 -3
  35. data/lib/capybara/session/config.rb +2 -8
  36. data/lib/capybara/spec/session/attach_file_spec.rb +1 -1
  37. data/lib/capybara/spec/session/check_spec.rb +4 -4
  38. data/lib/capybara/spec/session/choose_spec.rb +2 -2
  39. data/lib/capybara/spec/session/click_button_spec.rb +28 -1
  40. data/lib/capybara/spec/session/fill_in_spec.rb +2 -2
  41. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +14 -1
  42. data/lib/capybara/spec/session/frame/within_frame_spec.rb +12 -1
  43. data/lib/capybara/spec/session/node_spec.rb +18 -6
  44. data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
  45. data/lib/capybara/spec/session/unselect_spec.rb +1 -1
  46. data/lib/capybara/spec/views/frame_child.erb +2 -1
  47. data/lib/capybara/spec/views/react.erb +45 -0
  48. data/lib/capybara/version.rb +1 -1
  49. data/lib/capybara/window.rb +1 -1
  50. data/spec/minitest_spec_spec.rb +1 -1
  51. data/spec/result_spec.rb +10 -6
  52. data/spec/rspec/shared_spec_matchers.rb +8 -4
  53. data/spec/selector_spec.rb +4 -0
  54. data/spec/selenium_spec_safari.rb +2 -3
  55. data/spec/session_spec.rb +7 -0
  56. data/spec/shared_selenium_session.rb +14 -11
  57. data/spec/spec_helper.rb +2 -1
  58. metadata +6 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa0bcbd72a77a11e283e73309ffe3050b4cb4c16b9b1254c964be5d67727bd12
4
- data.tar.gz: bcccddc77138eb9ed18069efa54c62971205ad68590126b00d52b806c03185fa
3
+ metadata.gz: e077e28912ed7973882a0394db7eb44c493b0546175f81ef6f15c8ad1ee564c1
4
+ data.tar.gz: 6efae1078877ffe1578dc28d83f6d8df338dc01a162214c5b3aa3bd625c6a426
5
5
  SHA512:
6
- metadata.gz: f2ebb38591d662ca0533dc0b719fc513fb4a8c1222be0dce21e2d6d39088cde97a9f7af495bb8a729e01236860c46a91d46b2dc7545f18b20bdbb51c7494601a
7
- data.tar.gz: d4dbdb2431e33d59858b7c83102355efc9c610d1ca6515f8cbb001039ba10a196fbf79f6ad86a60d68e6b912a312b9ab920e3eaf2bb0538f3d0a74d2a9006707
6
+ metadata.gz: 48d7420e5621c0dafbff830bfa56aba6ccf1d171d9efd0081f30f95f0cc538fa655d6fd5bef5525d13da573f51993f443f89b20af9b2241e4b9194b6ca3d2ae1
7
+ data.tar.gz: e7470806d56a47cbb6a2b12690816cc0cb569d26032ccae32ad2d832f356d59235f156651a8422ba70259021f9e47a81ad43f4d3e97612891e7e98c6eb1c857e
data/History.md CHANGED
@@ -1,3 +1,16 @@
1
+ # Version 3.17.0
2
+ Release date: 2019-04-18
3
+
4
+ ### Added
5
+
6
+ * Initial support for selenium-webdriver 4.0.0.alpha1
7
+ * :button selector will now also match on `name` attribute
8
+
9
+ ### Fixed
10
+
11
+ * Suppress warnings generated by using selenium-webdriver 3.141.5926
12
+ * Mask Appium issue with finder visibility optimizations (non-optimal)
13
+
1
14
  # Version 3.16.2
2
15
  Release date: 2019-04-10
3
16
 
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![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)
7
7
  [![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)
8
8
 
9
- **Note** You are viewing the README for the 3.16.x version of Capybara.
9
+ **Note** You are viewing the README for the 3.17.x version of Capybara.
10
10
 
11
11
 
12
12
  Capybara helps you test web applications by simulating how a real user would
@@ -466,42 +466,8 @@ module Capybara
466
466
  require 'capybara/selenium/driver'
467
467
  end
468
468
 
469
- Capybara.register_server :default do |app, port, _host|
470
- Capybara.run_default_server(app, port)
471
- end
472
-
473
- Capybara.register_server :webrick do |app, port, host, **options|
474
- require 'rack/handler/webrick'
475
- options = { Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log.new(nil, 0) }.merge(options)
476
- Rack::Handler::WEBrick.run(app, options)
477
- end
478
-
479
- Capybara.register_server :puma do |app, port, host, **options|
480
- begin
481
- require 'rack/handler/puma'
482
- rescue LoadError
483
- raise LoadError, 'Capybara is unable to load `puma` for its server, please add `puma` to your project or specify a different server via something like `Capybara.server = :webrick`.'
484
- else
485
- unless Rack::Handler::Puma.respond_to?(:config)
486
- raise LoadError, 'Capybara requires `puma` version 3.8.0 or higher, please upgrade `puma` or register and specify your own server block'
487
- end
488
- end
489
- # If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
490
- # Therefore construct and run the Server instance ourselves.
491
- # Rack::Handler::Puma.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
492
- options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false }.merge(options)
493
- conf = Rack::Handler::Puma.config(app, options)
494
- events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
495
-
496
- events.log 'Capybara starting Puma...'
497
- events.log "* Version #{Puma::Const::PUMA_VERSION} , codename: #{Puma::Const::CODE_NAME}"
498
- events.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
499
-
500
- Puma::Server.new(conf.app, events, conf.options).tap do |s|
501
- s.binder.parse conf.options[:binds], s.events
502
- s.min_threads, s.max_threads = conf.options[:min_threads], conf.options[:max_threads]
503
- end.run.join
504
- end
469
+ require 'capybara/registrations/servers'
470
+ require 'capybara/registrations/drivers'
505
471
 
506
472
  Capybara.configure do |config|
507
473
  config.always_include_port = false
@@ -527,38 +493,3 @@ Capybara.configure do |config|
527
493
  config.default_normalize_ws = false
528
494
  config.allow_gumbo = false
529
495
  end
530
-
531
- Capybara.register_driver :rack_test do |app|
532
- Capybara::RackTest::Driver.new(app)
533
- end
534
-
535
- Capybara.register_driver :selenium do |app|
536
- Capybara::Selenium::Driver.new(app)
537
- end
538
-
539
- Capybara.register_driver :selenium_headless do |app|
540
- Capybara::Selenium::Driver.load_selenium
541
- browser_options = ::Selenium::WebDriver::Firefox::Options.new
542
- browser_options.args << '-headless'
543
- Capybara::Selenium::Driver.new(app, browser: :firefox, options: browser_options)
544
- end
545
-
546
- Capybara.register_driver :selenium_chrome do |app|
547
- Capybara::Selenium::Driver.load_selenium
548
- browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
549
- # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
550
- opts.args << '--disable-site-isolation-trials'
551
- end
552
- Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
553
- end
554
-
555
- Capybara.register_driver :selenium_chrome_headless do |app|
556
- Capybara::Selenium::Driver.load_selenium
557
- browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
558
- opts.args << '--headless'
559
- opts.args << '--disable-gpu' if Gem.win_platform?
560
- # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
561
- opts.args << '--disable-site-isolation-trials'
562
- end
563
- Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
564
- end
@@ -7,8 +7,7 @@ module Capybara
7
7
  class Config
8
8
  extend Forwardable
9
9
 
10
- OPTIONS = %i[app reuse_server threadsafe default_wait_time server
11
- default_driver javascript_driver allow_gumbo].freeze
10
+ OPTIONS = %i[app reuse_server threadsafe server default_driver javascript_driver allow_gumbo].freeze
12
11
 
13
12
  attr_accessor :app
14
13
  attr_reader :reuse_server, :threadsafe
@@ -45,7 +45,7 @@ module Capybara
45
45
  #
46
46
  # Finds a button on the page and clicks it.
47
47
  # This can be any \<input> element of type submit, reset, image, button or it can be a
48
- # \<button> element. All buttons can be found by their id, Capybara.test_id attribute, value, or title. \<button> elements can also be found
48
+ # \<button> element. All buttons can be found by their id, name, Capybara.test_id attribute, value, or title. \<button> elements can also be found
49
49
  # by their text content, and image \<input> elements by their alt attribute
50
50
  #
51
51
  # @overload click_button([locator], **options)
@@ -300,7 +300,7 @@ module Capybara
300
300
  synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
301
301
  begin
302
302
  find(:select, from, options)
303
- rescue Capybara::ElementNotFound => select_error
303
+ rescue Capybara::ElementNotFound => select_error # rubocop:disable Naming/RescuedExceptionsVariableName
304
304
  raise if %i[selected with_selected multiple].any? { |option| options.key?(option) }
305
305
 
306
306
  begin
@@ -356,14 +356,14 @@ module Capybara
356
356
  begin
357
357
  el = find(selector, locator, options)
358
358
  el.set(checked)
359
- rescue StandardError => err
360
- raise unless allow_label_click && catch_error?(err)
359
+ rescue StandardError => e
360
+ raise unless allow_label_click && catch_error?(e)
361
361
 
362
362
  begin
363
363
  el ||= find(selector, locator, options.merge(visible: :all))
364
364
  el.session.find(:label, for: el, visible: true).click unless el.checked? == checked
365
365
  rescue StandardError # swallow extra errors - raise original
366
- raise err
366
+ raise e
367
367
  end
368
368
  end
369
369
  end
@@ -81,19 +81,19 @@ module Capybara
81
81
  timer = Capybara::Helpers.timer(expire_in: seconds)
82
82
  begin
83
83
  yield
84
- rescue StandardError => err
84
+ rescue StandardError => e
85
85
  session.raise_server_error!
86
- raise err unless catch_error?(err, errors)
86
+ raise e unless catch_error?(e, errors)
87
87
 
88
88
  if driver.wait?
89
- raise err if timer.expired?
89
+ raise e if timer.expired?
90
90
 
91
91
  sleep(0.01)
92
92
  reload if session_options.automatic_reload
93
93
  else
94
94
  old_base = @base
95
95
  reload if session_options.automatic_reload
96
- raise err if old_base == @base
96
+ raise e if old_base == @base
97
97
  end
98
98
  retry
99
99
  ensure
@@ -87,11 +87,11 @@ module Capybara
87
87
 
88
88
  begin
89
89
  synchronize { base.style(styles) }
90
- rescue NotImplementedError => err
90
+ rescue NotImplementedError => e
91
91
  begin
92
92
  evaluate_script(STYLE_SCRIPT, *styles)
93
93
  rescue Capybara::NotSupportedByDriverError
94
- raise err
94
+ raise e
95
95
  end
96
96
  end
97
97
  end
@@ -113,7 +113,7 @@ module Capybara
113
113
  #
114
114
  # @return [Capybara::Node::Element] The element
115
115
  def set(value, **options)
116
- raise Capybara::ReadOnlyElementError, "Attempt to set readonly element with value: #{value}" if readonly?
116
+ raise Capybara::ReadOnlyElementError, "Attempt to set readonly element with value: #{value}" if ENV['CAPYBARA_THOROUGH'] && readonly?
117
117
 
118
118
  options = session_options.default_set_options.to_h.merge(options)
119
119
  synchronize { base.set(value, options) }
@@ -469,8 +469,8 @@ module Capybara
469
469
  begin
470
470
  reloaded = query_scope.reload.first(@query.name, @query.locator, @query.options)
471
471
  @base = reloaded.base if reloaded
472
- rescue StandardError => err
473
- raise err unless catch_error?(err)
472
+ rescue StandardError => e
473
+ raise e unless catch_error?(e)
474
474
  end
475
475
  end
476
476
  self
@@ -154,11 +154,11 @@ module Capybara
154
154
  #
155
155
  # Find a button on the page.
156
156
  # This can be any \<input> element of type submit, reset, image, button or it can be a
157
- # \<button> element. All buttons can be found by their id, Capbyara.test_id attribute, value, or title. \<button> elements can also be found
157
+ # \<button> element. All buttons can be found by their id, name, Capbyara.test_id attribute, value, or title. \<button> elements can also be found
158
158
  # by their text content, and image \<input> elements by their alt attribute
159
159
  #
160
160
  # @overload find_button([locator], **options)
161
- # @param [String] locator id, Capybara.test_id attribute, value, title, text content, alt of image
161
+ # @param [String] locator id, name, Capybara.test_id attribute, value, title, text content, alt of image
162
162
  #
163
163
  # @overload find_button(**options)
164
164
  #
@@ -169,8 +169,9 @@ module Capybara
169
169
  # * false - only finds an enabled button
170
170
  # * :all - finds either an enabled or disabled button
171
171
  # @option options [String, Regexp] id Match buttons with the id provided
172
- # @option options [String] title Match buttons with the title provided
173
- # @option options [String] value Match buttons with the value provided
172
+ # @option options [String] name Match buttons with the name provided
173
+ # @option options [String] title Match buttons with the title provided
174
+ # @option options [String] value Match buttons with the value provided
174
175
  # @option options [String, Array<String>, Regexp] class Match buttons that match the class(es) provided
175
176
  # @return [Capybara::Node::Element] The found element
176
177
  #
@@ -241,6 +242,7 @@ module Capybara
241
242
  # @option options [Integer] maximum Maximum number of matches that are expected to be found
242
243
  # @option options [Integer] minimum Minimum number of matches that are expected to be found
243
244
  # @option options [Range] between Number of matches found must be within the given range
245
+ # @option options [false, true, Numeric] wait (Capybara.default_max_wait_time) Maximum time to wait for matching element to appear.
244
246
  # @overload all([kind = Capybara.default_selector], locator = nil, **options)
245
247
  # @overload all([kind = Capybara.default_selector], locator = nil, **options, &filter_block)
246
248
  # @yieldparam element [Capybara::Node::Element] The element being considered for inclusion in the results
@@ -107,7 +107,7 @@ module Capybara
107
107
  !find_xpath(VISIBILITY_XPATH)
108
108
  else
109
109
  # No need for an xpath if only checking the current element
110
- !(native.key?('hidden') || (native[:style] =~ /display:\s?none/) || %w[script head].include?(tag_name))
110
+ !(native.key?('hidden') || (/display:\s?none/.match? native[:style]) || %w[script head].include?(tag_name))
111
111
  end
112
112
  end
113
113
 
@@ -127,7 +127,8 @@ module Capybara
127
127
  #
128
128
  # @return [Boolean] Whether the element is disabled
129
129
  def disabled?
130
- native.has_attribute?('disabled')
130
+ native.has_attribute?('disabled') &&
131
+ %w[button input select textarea optgroup option menuitem fieldset].include?(tag_name)
131
132
  end
132
133
 
133
134
  ##
@@ -83,7 +83,7 @@ module Capybara
83
83
  matches_system_filters?(node) &&
84
84
  matches_node_filters?(node, node_filter_errors) &&
85
85
  matches_filter_block?(node)
86
- rescue *(node.respond_to?(:session) ? node.session.driver.invalid_element_errors : [])
86
+ rescue *(node.respond_to?(:session) ? node.session.driver.invalid_element_errors : []) # rubocop:disable Naming/RescuedExceptionsVariableName
87
87
  false
88
88
  end
89
89
 
@@ -368,13 +368,13 @@ module Capybara
368
368
  def matches_id_filter?(node)
369
369
  return true unless use_default_id_filter? && options[:id].is_a?(Regexp)
370
370
 
371
- node[:id] =~ options[:id]
371
+ options[:id].match? node[:id]
372
372
  end
373
373
 
374
374
  def matches_class_filter?(node)
375
375
  return true unless use_default_class_filter? && options[:class].is_a?(Regexp)
376
376
 
377
- node[:class] =~ options[:class]
377
+ options[:class].match? node[:class]
378
378
  end
379
379
 
380
380
  def matches_style_filter?(node)
@@ -382,7 +382,7 @@ module Capybara
382
382
  when String, nil
383
383
  true
384
384
  when Regexp
385
- node[:style] =~ options[:style]
385
+ options[:style].match? node[:style]
386
386
  when Hash
387
387
  matches_style?(node, options[:style])
388
388
  end
@@ -392,7 +392,7 @@ module Capybara
392
392
  @actual_styles = node.initial_cache[:style] || node.style(*styles.keys)
393
393
  styles.all? do |style, value|
394
394
  if value.is_a? Regexp
395
- @actual_styles[style.to_s] =~ value
395
+ value.match? @actual_styles[style.to_s]
396
396
  else
397
397
  @actual_styles[style.to_s] == value
398
398
  end
@@ -19,7 +19,7 @@ module Capybara
19
19
  @actual_styles = node.style(*@expected_styles.keys)
20
20
  @expected_styles.all? do |style, value|
21
21
  if value.is_a? Regexp
22
- @actual_styles[style] =~ value
22
+ value.match? @actual_styles[style]
23
23
  else
24
24
  @actual_styles[style] == value
25
25
  end
@@ -56,7 +56,7 @@ private
56
56
  end
57
57
 
58
58
  def request_method
59
- self[:method].to_s.match?(/post/i) ? :post : :get
59
+ /post/i.match?(self[:method]) ? :post : :get
60
60
  end
61
61
 
62
62
  def merge_param!(params, key, value)
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara.register_driver :rack_test do |app|
4
+ Capybara::RackTest::Driver.new(app)
5
+ end
6
+
7
+ Capybara.register_driver :selenium do |app|
8
+ Capybara::Selenium::Driver.new(app)
9
+ end
10
+
11
+ Capybara.register_driver :selenium_headless do |app|
12
+ Capybara::Selenium::Driver.load_selenium
13
+ browser_options = ::Selenium::WebDriver::Firefox::Options.new
14
+ browser_options.args << '-headless'
15
+ Capybara::Selenium::Driver.new(app, browser: :firefox, options: browser_options)
16
+ end
17
+
18
+ Capybara.register_driver :selenium_chrome do |app|
19
+ Capybara::Selenium::Driver.load_selenium
20
+ browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
21
+ # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
22
+ opts.args << '--disable-site-isolation-trials'
23
+ end
24
+ Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
25
+ end
26
+
27
+ Capybara.register_driver :selenium_chrome_headless do |app|
28
+ Capybara::Selenium::Driver.load_selenium
29
+ browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
30
+ opts.args << '--headless'
31
+ opts.args << '--disable-gpu' if Gem.win_platform?
32
+ # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
33
+ opts.args << '--disable-site-isolation-trials'
34
+ end
35
+ Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
36
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara.register_server :default do |app, port, _host|
4
+ Capybara.run_default_server(app, port)
5
+ end
6
+
7
+ Capybara.register_server :webrick do |app, port, host, **options|
8
+ require 'rack/handler/webrick'
9
+ options = { Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log.new(nil, 0) }.merge(options)
10
+ Rack::Handler::WEBrick.run(app, options)
11
+ end
12
+
13
+ Capybara.register_server :puma do |app, port, host, **options|
14
+ begin
15
+ require 'rack/handler/puma'
16
+ rescue LoadError
17
+ raise LoadError, 'Capybara is unable to load `puma` for its server, please add `puma` to your project or specify a different server via something like `Capybara.server = :webrick`.'
18
+ else
19
+ unless Rack::Handler::Puma.respond_to?(:config)
20
+ raise LoadError, 'Capybara requires `puma` version 3.8.0 or higher, please upgrade `puma` or register and specify your own server block'
21
+ end
22
+ end
23
+ # If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
24
+ # Therefore construct and run the Server instance ourselves.
25
+ # Rack::Handler::Puma.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
26
+ options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false }.merge(options)
27
+ conf = Rack::Handler::Puma.config(app, options)
28
+ events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
29
+
30
+ events.log 'Capybara starting Puma...'
31
+ events.log "* Version #{Puma::Const::PUMA_VERSION} , codename: #{Puma::Const::CODE_NAME}"
32
+ events.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
33
+
34
+ Puma::Server.new(conf.app, events, conf.options).tap do |s|
35
+ s.binder.parse conf.options[:binds], s.events
36
+ s.min_threads, s.max_threads = conf.options[:min_threads], conf.options[:max_threads]
37
+ end.run.join
38
+ end
@@ -149,10 +149,10 @@ module Capybara
149
149
  end
150
150
 
151
151
  def lazy_select_elements(&block)
152
- # JRuby has an issue with lazy enumerators which
152
+ # JRuby < 9.2.8.0 has an issue with lazy enumerators which
153
153
  # causes a concurrency issue with network requests here
154
154
  # https://github.com/jruby/jruby/issues/4212
155
- if RUBY_PLATFORM == 'java'
155
+ if (RUBY_PLATFORM == 'java') && (Gem::Version.new(JRUBY_VERSION) < Gem::Version.new('9.2.8.0'))
156
156
  @elements.select(&block).to_enum # non-lazy evaluation
157
157
  else
158
158
  @elements.lazy.select(&block)
@@ -10,9 +10,9 @@ module Capybara
10
10
  end
11
11
  end
12
12
 
13
- def within(*args)
13
+ def within(*args, &block)
14
14
  if block_given?
15
- within_element(*args, &Proc.new)
15
+ within_element(*args, &block)
16
16
  else
17
17
  be_within(*args)
18
18
  end