capybara 2.15.0 → 3.0.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 (177) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +137 -2
  3. data/README.md +36 -25
  4. data/lib/capybara/config.rb +11 -57
  5. data/lib/capybara/cucumber.rb +2 -3
  6. data/lib/capybara/driver/base.rb +19 -16
  7. data/lib/capybara/driver/node.rb +5 -4
  8. data/lib/capybara/dsl.rb +1 -0
  9. data/lib/capybara/helpers.rb +19 -29
  10. data/lib/capybara/minitest/spec.rb +16 -13
  11. data/lib/capybara/minitest.rb +140 -137
  12. data/lib/capybara/node/actions.rb +68 -89
  13. data/lib/capybara/node/base.rb +11 -18
  14. data/lib/capybara/node/document.rb +2 -2
  15. data/lib/capybara/node/document_matchers.rb +8 -8
  16. data/lib/capybara/node/element.rb +32 -42
  17. data/lib/capybara/node/finders.rb +64 -71
  18. data/lib/capybara/node/matchers.rb +50 -71
  19. data/lib/capybara/node/simple.rb +11 -17
  20. data/lib/capybara/queries/ancestor_query.rb +12 -8
  21. data/lib/capybara/queries/base_query.rb +22 -18
  22. data/lib/capybara/queries/current_path_query.rb +12 -25
  23. data/lib/capybara/queries/match_query.rb +3 -7
  24. data/lib/capybara/queries/selector_query.rb +100 -96
  25. data/lib/capybara/queries/sibling_query.rb +5 -5
  26. data/lib/capybara/queries/text_query.rb +35 -35
  27. data/lib/capybara/queries/title_query.rb +8 -11
  28. data/lib/capybara/rack_test/browser.rb +15 -18
  29. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  30. data/lib/capybara/rack_test/driver.rb +6 -10
  31. data/lib/capybara/rack_test/form.rb +52 -39
  32. data/lib/capybara/rack_test/node.rb +93 -63
  33. data/lib/capybara/rails.rb +2 -6
  34. data/lib/capybara/result.rb +22 -22
  35. data/lib/capybara/rspec/compound.rb +5 -10
  36. data/lib/capybara/rspec/features.rb +17 -48
  37. data/lib/capybara/rspec/matcher_proxies.rb +31 -15
  38. data/lib/capybara/rspec/matchers.rb +116 -58
  39. data/lib/capybara/rspec.rb +5 -10
  40. data/lib/capybara/selector/css.rb +6 -11
  41. data/lib/capybara/selector/filter.rb +1 -17
  42. data/lib/capybara/selector/filter_set.rb +18 -15
  43. data/lib/capybara/selector/filters/base.rb +7 -6
  44. data/lib/capybara/selector/filters/expression_filter.rb +6 -23
  45. data/lib/capybara/selector/filters/node_filter.rb +2 -12
  46. data/lib/capybara/selector/selector.rb +28 -34
  47. data/lib/capybara/selector.rb +129 -117
  48. data/lib/capybara/selenium/driver.rb +172 -163
  49. data/lib/capybara/selenium/node.rb +218 -104
  50. data/lib/capybara/server.rb +3 -2
  51. data/lib/capybara/session/config.rb +47 -59
  52. data/lib/capybara/session/matchers.rb +23 -14
  53. data/lib/capybara/session.rb +175 -229
  54. data/lib/capybara/spec/fixtures/no_extension +1 -0
  55. data/lib/capybara/spec/public/test.js +38 -6
  56. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
  57. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
  58. data/lib/capybara/spec/session/accept_prompt_spec.rb +30 -1
  59. data/lib/capybara/spec/session/all_spec.rb +31 -18
  60. data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
  61. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
  62. data/lib/capybara/spec/session/assert_current_path.rb +12 -11
  63. data/lib/capybara/spec/session/assert_selector.rb +1 -0
  64. data/lib/capybara/spec/session/assert_text.rb +31 -23
  65. data/lib/capybara/spec/session/assert_title.rb +13 -3
  66. data/lib/capybara/spec/session/attach_file_spec.rb +57 -29
  67. data/lib/capybara/spec/session/body_spec.rb +1 -0
  68. data/lib/capybara/spec/session/check_spec.rb +7 -6
  69. data/lib/capybara/spec/session/choose_spec.rb +5 -4
  70. data/lib/capybara/spec/session/click_button_spec.rb +24 -32
  71. data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
  72. data/lib/capybara/spec/session/click_link_spec.rb +8 -7
  73. data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
  74. data/lib/capybara/spec/session/current_url_spec.rb +19 -8
  75. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
  76. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
  77. data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
  78. data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
  79. data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
  80. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  81. data/lib/capybara/spec/session/evaluate_script_spec.rb +5 -4
  82. data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
  83. data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
  84. data/lib/capybara/spec/session/find_button_spec.rb +4 -3
  85. data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
  86. data/lib/capybara/spec/session/find_field_spec.rb +9 -15
  87. data/lib/capybara/spec/session/find_link_spec.rb +6 -5
  88. data/lib/capybara/spec/session/find_spec.rb +37 -31
  89. data/lib/capybara/spec/session/first_spec.rb +60 -33
  90. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  91. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  92. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
  93. data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
  94. data/lib/capybara/spec/session/go_back_spec.rb +1 -0
  95. data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
  96. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  97. data/lib/capybara/spec/session/has_button_spec.rb +2 -1
  98. data/lib/capybara/spec/session/has_css_spec.rb +3 -2
  99. data/lib/capybara/spec/session/has_current_path_spec.rb +49 -22
  100. data/lib/capybara/spec/session/has_field_spec.rb +4 -3
  101. data/lib/capybara/spec/session/has_link_spec.rb +5 -4
  102. data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
  103. data/lib/capybara/spec/session/has_select_spec.rb +32 -31
  104. data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
  105. data/lib/capybara/spec/session/has_table_spec.rb +2 -1
  106. data/lib/capybara/spec/session/has_text_spec.rb +9 -13
  107. data/lib/capybara/spec/session/has_title_spec.rb +1 -0
  108. data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
  109. data/lib/capybara/spec/session/headers.rb +2 -1
  110. data/lib/capybara/spec/session/html_spec.rb +1 -0
  111. data/lib/capybara/spec/session/node_spec.rb +107 -58
  112. data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
  113. data/lib/capybara/spec/session/refresh_spec.rb +6 -2
  114. data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
  115. data/lib/capybara/spec/session/response_code.rb +1 -0
  116. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  117. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
  118. data/lib/capybara/spec/session/save_page_spec.rb +1 -17
  119. data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
  120. data/lib/capybara/spec/session/select_spec.rb +21 -20
  121. data/lib/capybara/spec/session/selectors_spec.rb +2 -2
  122. data/lib/capybara/spec/session/sibling_spec.rb +1 -1
  123. data/lib/capybara/spec/session/text_spec.rb +17 -3
  124. data/lib/capybara/spec/session/title_spec.rb +11 -1
  125. data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
  126. data/lib/capybara/spec/session/unselect_spec.rb +7 -6
  127. data/lib/capybara/spec/session/visit_spec.rb +64 -3
  128. data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
  129. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  130. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  131. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
  132. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
  133. data/lib/capybara/spec/session/window/window_spec.rb +12 -12
  134. data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
  135. data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
  136. data/lib/capybara/spec/session/within_spec.rb +1 -0
  137. data/lib/capybara/spec/spec_helper.rb +36 -18
  138. data/lib/capybara/spec/test_app.rb +17 -9
  139. data/lib/capybara/spec/views/form.erb +7 -0
  140. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  141. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  142. data/lib/capybara/spec/views/with_hover.erb +5 -0
  143. data/lib/capybara/spec/views/with_html.erb +27 -1
  144. data/lib/capybara/spec/views/with_js.erb +11 -0
  145. data/lib/capybara/spec/views/within_frames.erb +4 -1
  146. data/lib/capybara/version.rb +2 -1
  147. data/lib/capybara/window.rb +6 -10
  148. data/lib/capybara.rb +29 -26
  149. data/spec/basic_node_spec.rb +1 -0
  150. data/spec/capybara_spec.rb +16 -69
  151. data/spec/dsl_spec.rb +5 -13
  152. data/spec/filter_set_spec.rb +5 -4
  153. data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
  154. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
  155. data/spec/minitest_spec.rb +13 -4
  156. data/spec/minitest_spec_spec.rb +12 -3
  157. data/spec/per_session_config_spec.rb +9 -8
  158. data/spec/rack_test_spec.rb +21 -20
  159. data/spec/result_spec.rb +17 -16
  160. data/spec/rspec/features_spec.rb +17 -14
  161. data/spec/rspec/scenarios_spec.rb +5 -7
  162. data/spec/rspec/shared_spec_matchers.rb +96 -99
  163. data/spec/rspec/views_spec.rb +2 -1
  164. data/spec/rspec_matchers_spec.rb +18 -2
  165. data/spec/rspec_spec.rb +11 -15
  166. data/spec/selector_spec.rb +5 -6
  167. data/spec/selenium_spec_chrome.rb +20 -11
  168. data/spec/selenium_spec_edge.rb +27 -0
  169. data/spec/selenium_spec_ie.rb +31 -0
  170. data/spec/selenium_spec_marionette.rb +38 -12
  171. data/spec/server_spec.rb +33 -33
  172. data/spec/session_spec.rb +2 -1
  173. data/spec/shared_selenium_session.rb +82 -22
  174. data/spec/spec_helper.rb +3 -6
  175. metadata +76 -81
  176. data/lib/capybara/query.rb +0 -7
  177. data/spec/selenium_spec_firefox.rb +0 -68
data/lib/capybara.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'timeout'
3
4
  require 'nokogiri'
4
5
  require 'xpath'
@@ -21,7 +22,6 @@ module Capybara
21
22
  class WindowError < CapybaraError; end
22
23
  class ReadOnlyElementError < CapybaraError; end
23
24
 
24
-
25
25
  class << self
26
26
  extend Forwardable
27
27
 
@@ -51,8 +51,6 @@ module Capybara
51
51
  # See {Capybara.configure}
52
52
  # @!method always_include_port
53
53
  # See {Capybara.configure}
54
- # @!method wait_on_first_by_default
55
- # See {Capybara.configure}
56
54
  SessionConfig::OPTIONS.each do |method|
57
55
  def_delegators :config, method, "#{method}="
58
56
  end
@@ -69,7 +67,7 @@ module Capybara
69
67
  # === Configurable options
70
68
  #
71
69
  # [app_host = String/nil] The default host to use when giving a relative URL to visit, must be a valid URL e.g. http://www.example.com
72
- # [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL (Default: false)
70
+ # [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL unless another port is explicitly specified (Default: false)
73
71
  # [asset_host = String] Where dynamic assets are hosted - will be prepended to relative asset locations if present (Default: nil)
74
72
  # [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
75
73
  # [raise_server_errors = Boolean] Should errors raised in the server be raised in the tests? (Default: true)
@@ -79,7 +77,6 @@ module Capybara
79
77
  # [ignore_hidden_elements = Boolean] Whether to ignore hidden elements on the page (Default: true)
80
78
  # [automatic_reload = Boolean] Whether to automatically reload elements as Capybara is waiting (Default: true)
81
79
  # [save_path = String] Where to put pages saved through save_(page|screenshot), save_and_open_(page|screenshot) (Default: Dir.pwd)
82
- # [wait_on_first_by_default = Boolean] Whether Node#first defaults to Capybara waiting behavior for at least 1 element to match (Default: false)
83
80
  # [automatic_label_click = Boolean] Whether Node#choose, Node#check, Node#uncheck will attempt to click the associated label element if the checkbox/radio button are non-visible (Default: false)
84
81
  # [enable_aria_label = Boolean] Whether fields, links, and buttons will match against aria-label attribute (Default: false)
85
82
  # [reuse_server = Boolean] Reuse the server thread between multiple sessions using the same app object (Default: true)
@@ -94,7 +91,7 @@ module Capybara
94
91
  # [javascript_driver = Symbol] The name of a driver to use for JavaScript enabled tests. (Default: :selenium)
95
92
  #
96
93
  def configure
97
- yield ConfigureDeprecator.new(config)
94
+ yield config
98
95
  end
99
96
 
100
97
  ##
@@ -128,7 +125,6 @@ module Capybara
128
125
  # @yieldparam [<Rack>] app The rack application that this server will contain.
129
126
  # @yieldparam port The port number the server should listen on
130
127
  # @yieldparam host The host/ip to bind to
131
- # @yieldreturn [Capybara::Driver::Base] A Capybara driver instance
132
128
  #
133
129
  def register_server(name, &block)
134
130
  servers[name.to_sym] = block
@@ -192,8 +188,6 @@ module Capybara
192
188
  @servers ||= {}
193
189
  end
194
190
 
195
- ##
196
- #
197
191
  # Wraps the given string, which should contain an HTML document or fragment
198
192
  # in a {Capybara::Node::Simple} which exposes all {Capybara::Node::Matchers},
199
193
  # {Capybara::Node::Finders} and {Capybara::Node::DocumentMatchers}. This allows you to query
@@ -238,7 +232,7 @@ module Capybara
238
232
  # @param [Integer] port The port to run the application on
239
233
  #
240
234
  def run_default_server(app, port)
241
- servers[:webrick].call(app, port, server_host)
235
+ servers[:puma].call(app, port, server_host)
242
236
  end
243
237
 
244
238
  ##
@@ -310,7 +304,7 @@ module Capybara
310
304
  # as cookies.
311
305
  #
312
306
  def reset_sessions!
313
- #reset in reverse so sessions that started servers are reset last
307
+ # reset in reverse so sessions that started servers are reset last
314
308
  session_pool.reverse_each { |_mode, session| session.reset! }
315
309
  end
316
310
  alias_method :reset!, :reset_sessions!
@@ -364,10 +358,10 @@ module Capybara
364
358
  # @param [String] html The raw html
365
359
  # @return [Nokogiri::HTML::Document] HTML document
366
360
  #
367
- def HTML(html)
361
+ def HTML(html) # rubocop:disable Naming/MethodName
368
362
  Nokogiri::HTML(html).tap do |document|
369
363
  document.xpath('//textarea').each do |textarea|
370
- textarea['_capybara_raw_value'] = textarea.content.sub(/\A\n/,'')
364
+ textarea['_capybara_raw_value'] = textarea.content.sub(/\A\n/, '')
371
365
  end
372
366
  end
373
367
  end
@@ -376,12 +370,8 @@ module Capybara
376
370
  config.session_options
377
371
  end
378
372
 
379
- def included(base)
380
- base.send(:include, Capybara::DSL)
381
- warn "`include Capybara` is deprecated. Please use `include Capybara::DSL` instead."
382
- end
383
-
384
373
  private
374
+
385
375
  def config
386
376
  @config ||= Capybara::Config.new
387
377
  end
@@ -415,7 +405,6 @@ module Capybara
415
405
  require 'capybara/queries/match_query'
416
406
  require 'capybara/queries/ancestor_query'
417
407
  require 'capybara/queries/sibling_query'
418
- require 'capybara/query'
419
408
 
420
409
  require 'capybara/node/finders'
421
410
  require 'capybara/node/matchers'
@@ -443,14 +432,29 @@ Capybara.register_server :default do |app, port, _host|
443
432
  Capybara.run_default_server(app, port)
444
433
  end
445
434
 
446
- Capybara.register_server :webrick do |app, port, host, options={}|
435
+ Capybara.register_server :webrick do |app, port, host, **options|
447
436
  require 'rack/handler/webrick'
448
- Rack::Handler::WEBrick.run(app, {Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log::new(nil, 0)}.merge(options))
437
+ Rack::Handler::WEBrick.run(app, { Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log.new(nil, 0) }.merge(options))
449
438
  end
450
439
 
451
- Capybara.register_server :puma do |app, port, host, options={}|
440
+ Capybara.register_server :puma do |app, port, host, **options|
452
441
  require 'rack/handler/puma'
453
- Rack::Handler::Puma.run(app, {Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false}.merge(options))
442
+ # If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
443
+ # Therefore construct and run the Server instance ourselves.
444
+ # Rack::Handler::Puma.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
445
+
446
+ conf = Rack::Handler::Puma.config(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
447
+ events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
448
+
449
+ events.log "Capybara starting Puma..."
450
+ events.log "* Version #{Puma::Const::PUMA_VERSION} , codename: #{Puma::Const::CODE_NAME}"
451
+ events.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
452
+
453
+ Puma::Server.new(conf.app, events, conf.options).tap do |s|
454
+ s.binder.parse conf.options[:binds], s.events
455
+ s.min_threads = conf.options[:min_threads]
456
+ s.max_threads = conf.options[:max_threads]
457
+ end.run.join
454
458
  end
455
459
 
456
460
  Capybara.configure do |config|
@@ -468,7 +472,6 @@ Capybara.configure do |config|
468
472
  config.raise_server_errors = true
469
473
  config.server_errors = [StandardError]
470
474
  config.visible_text_only = false
471
- config.wait_on_first_by_default = false
472
475
  config.automatic_label_click = false
473
476
  config.enable_aria_label = false
474
477
  config.reuse_server = true
@@ -483,11 +486,11 @@ Capybara.register_driver :selenium do |app|
483
486
  end
484
487
 
485
488
  Capybara.register_driver :selenium_chrome do |app|
486
- Capybara::Selenium::Driver.new(app, :browser => :chrome)
489
+ Capybara::Selenium::Driver.new(app, browser: :chrome)
487
490
  end
488
491
 
489
492
  Capybara.register_driver :selenium_chrome_headless do |app|
490
- browser_options = ::Selenium::WebDriver::Chrome::Options.new()
493
+ browser_options = ::Selenium::WebDriver::Chrome::Options.new
491
494
  browser_options.args << '--headless'
492
495
  browser_options.args << '--disable-gpu'
493
496
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara do
@@ -12,15 +13,6 @@ RSpec.describe Capybara do
12
13
  Capybara.default_max_wait_time = 5
13
14
  expect(Capybara.default_max_wait_time).to eq(5)
14
15
  end
15
-
16
- it "should be accesible as the deprecated default_wait_time" do
17
- expect(Capybara.send(:config)).to receive(:warn).ordered.with('DEPRECATED: #default_wait_time= is deprecated, please use #default_max_wait_time= instead')
18
- expect(Capybara.send(:config)).to receive(:warn).ordered.with('DEPRECATED: #default_wait_time is deprecated, please use #default_max_wait_time instead')
19
- @previous_default_time = Capybara.default_max_wait_time
20
- Capybara.default_wait_time = 5
21
- expect(Capybara.default_wait_time).to eq(5)
22
- expect(Capybara.default_max_wait_time).to eq(5)
23
- end
24
16
  end
25
17
 
26
18
  describe '.register_driver' do
@@ -35,37 +27,19 @@ RSpec.describe Capybara do
35
27
  end
36
28
 
37
29
  describe '.register_server' do
38
- before do
39
- Capybara.reuse_server = false
40
- @old_server = Capybara.server
41
- end
42
-
43
- after do
44
- Capybara.server(&@old_server)
45
- Capybara.reuse_server = true
46
- end
47
-
48
30
  it "should add a new server" do
49
- skip "JRuby fails this because of path issues to geckodriver I think. Its tested in other runs - not worth figuring out at this time" if RUBY_PLATFORM == 'java'
50
-
51
- require 'rack/handler/webrick'
52
- Capybara.register_server :blob do |app, port, host|
53
- Rack::Handler::WEBrick.run(app, Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log::new(nil, 0))
31
+ handler = double("handler")
32
+ Capybara.register_server :blob do |_app, _port, _host|
33
+ handler.run
54
34
  end
55
- Capybara.server = :blob
56
- session = Capybara::Session.new(:selenium, TestApp.new)
57
- session.visit('/')
58
- expect(session.body).to include("Hello world!")
35
+
36
+ expect(Capybara.servers).to have_key(:blob)
59
37
  end
60
38
  end
61
39
 
62
40
  describe ".server" do
63
- before do
64
- @old_server = Capybara.server
65
- end
66
-
67
41
  after do
68
- Capybara.server(&@old_server)
42
+ Capybara.server = :default
69
43
  end
70
44
 
71
45
  it "should default to a proc that calls run_default_server" do
@@ -75,33 +49,18 @@ RSpec.describe Capybara do
75
49
  end
76
50
 
77
51
  it "should return a custom server proc" do
78
- server = lambda {|app, port|}
79
- Capybara.server(&server)
52
+ server = ->(_app, _port) {}
53
+ Capybara.register_server :custom, &server
54
+ Capybara.server = :custom
80
55
  expect(Capybara.server).to eq(server)
81
56
  end
82
57
 
83
58
  it "should have :webrick registered" do
84
- require 'rack/handler/webrick'
85
- mock_app = double('app')
86
- Capybara.server = :webrick
87
- expect(Rack::Handler::WEBrick).to receive(:run)
88
- Capybara.server.call(mock_app, 8000)
59
+ expect(Capybara.servers[:webrick]).not_to be_nil
89
60
  end
90
61
 
91
62
  it "should have :puma registered" do
92
- require 'rack/handler/puma'
93
- mock_app = double('app')
94
- Capybara.server = :puma
95
- expect(Rack::Handler::Puma).to receive(:run).with(mock_app, hash_including(Host: nil, Port: 8000))
96
- Capybara.server.call(mock_app, 8000)
97
- end
98
-
99
- it "should pass options to server" do
100
- require 'rack/handler/puma'
101
- mock_app = double('app')
102
- Capybara.server = :puma, { Silent: true }
103
- expect(Rack::Handler::Puma).to receive(:run).with(mock_app, hash_including(Host: nil, Port: 9000, Silent: true))
104
- Capybara.server.call(mock_app, 9000)
63
+ expect(Capybara.servers[:puma]).not_to be_nil
105
64
  end
106
65
  end
107
66
 
@@ -130,7 +89,7 @@ RSpec.describe Capybara do
130
89
  Capybara.default_host = old_default
131
90
  end
132
91
 
133
- it "should warn if not a valid URL" do
92
+ it "should raise if not a valid URL" do
134
93
  expect { Capybara.default_host = "www.example.com" }.to raise_error(ArgumentError, /Capybara\.default_host should be set to a url/)
135
94
  end
136
95
 
@@ -138,26 +97,14 @@ RSpec.describe Capybara do
138
97
  expect { Capybara.default_host = "http://www.example.com" }.not_to raise_error
139
98
  end
140
99
  end
141
-
142
- describe "configure" do
143
- it 'deprecates calling non configuration option methods in configure' do
144
- expect_any_instance_of(Kernel).to receive(:warn).
145
- with('Calling register_driver from Capybara.configure is deprecated - please call it on Capybara directly ( Capybara.register_driver(...) )')
146
- Capybara.configure do |config|
147
- config.register_driver(:random_name) do
148
- #just a random block
149
- end
150
- end
151
- end
152
- end
153
100
  end
154
101
 
155
102
  RSpec.describe Capybara::Session do
156
- context 'with non-existant driver' do
103
+ context 'with nonexistent driver' do
157
104
  it "should raise an error" do
158
- expect {
105
+ expect do
159
106
  Capybara::Session.new(:quox, TestApp).driver
160
- }.to raise_error(Capybara::DriverNotFoundError)
107
+ end.to raise_error(Capybara::DriverNotFoundError)
161
108
  end
162
109
  end
163
110
  end
data/spec/dsl_spec.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/dsl'
4
5
 
@@ -6,17 +7,8 @@ class TestClass
6
7
  include Capybara::DSL
7
8
  end
8
9
 
9
- Capybara::SpecHelper.run_specs TestClass.new, "DSL", capybara_skip: [
10
- :js,
11
- :modals,
12
- :screenshot,
13
- :frames,
14
- :windows,
15
- :send_keys,
16
- :server,
17
- :hover,
18
- :about_scheme,
19
- :psc
10
+ Capybara::SpecHelper.run_specs TestClass.new, "DSL", capybara_skip: %i[
11
+ js modals screenshot frames windows send_keys server hover about_scheme psc
20
12
  ]
21
13
 
22
14
  RSpec.describe Capybara::DSL do
@@ -93,7 +85,7 @@ RSpec.describe Capybara::DSL do
93
85
  driver_before_block = Capybara.current_driver
94
86
  begin
95
87
  Capybara.using_driver(:selenium) { raise "ohnoes!" }
96
- rescue Exception
88
+ rescue Exception # rubocop:disable Lint/RescueException
97
89
  end
98
90
  expect(Capybara.current_driver).to eq(driver_before_block)
99
91
  end
@@ -211,7 +203,7 @@ RSpec.describe Capybara::DSL do
211
203
  Capybara.using_session(:raise) do
212
204
  raise
213
205
  end
214
- rescue Exception
206
+ rescue Exception # rubocop:disable Lint/RescueException
215
207
  end
216
208
  expect(Capybara.session_name).to eq(:default)
217
209
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara::Selector::FilterSet do
@@ -8,8 +9,8 @@ RSpec.describe Capybara::Selector::FilterSet do
8
9
 
9
10
  it "allows node filters" do
10
11
  fs = Capybara::Selector::FilterSet.add(:test) do
11
- filter(:node_test, :boolean) { |node, value| true }
12
- expression_filter(:expression_test, :boolean) { |expr, value| true }
12
+ filter(:node_test, :boolean) { |_node, _value| true }
13
+ expression_filter(:expression_test, :boolean) { |_expr, _value| true }
13
14
  end
14
15
 
15
16
  expect(fs.node_filters.keys).to include(:node_test)
@@ -18,8 +19,8 @@ RSpec.describe Capybara::Selector::FilterSet do
18
19
 
19
20
  it "allows expression filters" do
20
21
  fs = Capybara::Selector::FilterSet.add(:test) do
21
- filter(:node_test, :boolean) { |node, value| true }
22
- expression_filter(:expression_test, :boolean) { |expr, value| true }
22
+ filter(:node_test, :boolean) { |_node, _value| true }
23
+ expression_filter(:expression_test, :boolean) { |_expr, _value| true }
23
24
  end
24
25
 
25
26
  expect(fs.expression_filters.keys).to include(:expression_test)
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'selenium-webdriver'
4
5
 
5
6
  RSpec.describe Capybara::Selenium::Driver do
6
7
  it "should exit with a non-zero exit status" do
7
8
  options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
8
- options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false) if ENV['LEGACY_FIREFOX']
9
9
  browser = Capybara::Selenium::Driver.new(TestApp, options).browser
10
+ expect(browser).to be
10
11
  expect(true).to eq(false)
11
12
  end
12
13
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'selenium-webdriver'
4
5
 
5
6
  RSpec.describe Capybara::Selenium::Driver do
6
7
  it "should exit with a zero exit status" do
7
8
  options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
8
- options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false) if ENV['LEGACY_FIREFOX']
9
- browser = Capybara::Selenium::Driver.new(TestApp, options ).browser
9
+ browser = Capybara::Selenium::Driver.new(TestApp, options).browser
10
+ expect(browser).to be
10
11
  expect(true).to eq(true)
11
12
  end
12
13
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/minitest'
4
5
 
@@ -37,7 +38,7 @@ class MinitestTest < Minitest::Test
37
38
  assert_xpath('.//select[@id="form_title"]')
38
39
  assert_xpath('.//select', count: 1) { |el| el[:id] == "form_title" }
39
40
  assert_no_xpath('.//select[@id="not_form_title"]')
40
- assert_no_xpath('.//select') { |el| el[:id] == "not_form_title"}
41
+ assert_no_xpath('.//select') { |el| el[:id] == "not_form_title" }
41
42
  refute_xpath('.//select[@id="not_form_title"]')
42
43
  end
43
44
 
@@ -49,13 +50,13 @@ class MinitestTest < Minitest::Test
49
50
  def test_assert_link
50
51
  visit('/with_html')
51
52
  assert_link('A link')
52
- assert_link(count: 1){ |el| el.text == 'A link'}
53
+ assert_link(count: 1) { |el| el.text == 'A link' }
53
54
  assert_no_link('Not on page')
54
55
  end
55
56
 
56
57
  def test_assert_button
57
58
  assert_button('fresh_btn')
58
- assert_button(count: 1){ |el| el[:id] == 'fresh_btn' }
59
+ assert_button(count: 1) { |el| el[:id] == 'fresh_btn' }
59
60
  assert_no_button('not_btn')
60
61
  end
61
62
 
@@ -88,6 +89,14 @@ class MinitestTest < Minitest::Test
88
89
  refute_table('not_on_form')
89
90
  end
90
91
 
92
+ def test_assert_all_of_selectors
93
+ assert_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
94
+ end
95
+
96
+ def test_assert_none_of_selectors
97
+ assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
98
+ end
99
+
91
100
  def test_assert_matches_selector
92
101
  assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
93
102
  assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
@@ -117,6 +126,6 @@ RSpec.describe 'capybara/minitest' do
117
126
  reporter.start
118
127
  MinitestTest.run reporter, {}
119
128
  reporter.report
120
- expect(output.string).to include("15 runs, 42 assertions, 0 failures, 0 errors, 0 skips")
129
+ expect(output.string).to include("17 runs, 44 assertions, 0 failures, 0 errors, 0 skips")
121
130
  end
122
131
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/minitest'
4
5
  require 'capybara/minitest/spec'
@@ -39,7 +40,7 @@ class MinitestSpecTest < Minitest::Spec
39
40
  page.wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == "not_customer_email" }
40
41
  select = find(:select, 'form_title')
41
42
  select.must_have_xpath('.//option[@class="title"]')
42
- select.must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled?}
43
+ select.must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled? }
43
44
  select.wont_have_xpath('.//input[@id="customer_email"]')
44
45
  end
45
46
 
@@ -88,6 +89,14 @@ class MinitestSpecTest < Minitest::Spec
88
89
  page.wont_have_table('not_on_form')
89
90
  end
90
91
 
92
+ it "supports all_of_selectors expectations" do
93
+ page.must_have_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
94
+ end
95
+
96
+ it "supports none_of_selectors expectations" do
97
+ page.must_have_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
98
+ end
99
+
91
100
  it "supports match_selector expectations" do
92
101
  find(:field, 'customer_email').must_match_selector(:field, 'customer_email')
93
102
  find(:select, 'form_title').wont_match_selector(:field, 'customer_email')
@@ -120,8 +129,8 @@ RSpec.describe 'capybara/minitest/spec' do
120
129
  reporter.start
121
130
  MinitestSpecTest.run reporter, {}
122
131
  reporter.report
123
- expect(output.string).to include("16 runs, 39 assertions, 1 failures, 0 errors, 0 skips")
124
- #Make sure error messages are displayed
132
+ expect(output.string).to include("18 runs, 41 assertions, 1 failures, 0 errors, 0 skips")
133
+ # Make sure error messages are displayed
125
134
  expect(output.string).to include('expected to find visible select box "non_existing_form_title" that is not disabled but there were no matches')
126
135
  end
127
136
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
  require 'capybara/dsl'
4
5
 
@@ -7,13 +8,13 @@ RSpec.describe Capybara::SessionConfig do
7
8
  it "defaults to global session options" do
8
9
  Capybara.threadsafe = true
9
10
  session = Capybara::Session.new(:rack_test, TestApp)
10
- [:default_host, :app_host, :save_and_open_page_path,
11
- :always_include_port, :run_server, :default_selector, :default_max_wait_time, :ignore_hidden_elements,
12
- :automatic_reload, :match, :exact, :raise_server_errors, :visible_text_only, :wait_on_first_by_default,
13
- :automatic_label_click, :enable_aria_label,
14
- :save_path, :exact_options, :asset_host].each do |m|
15
- expect(session.config.public_send(m)).to eq Capybara.public_send(m)
16
- end
11
+ %i[default_host app_host always_include_port run_server
12
+ default_selector default_max_wait_time ignore_hidden_elements
13
+ automatic_reload match exact raise_server_errors visible_text_only
14
+ automatic_label_click enable_aria_label save_path
15
+ asset_host].each do |m|
16
+ expect(session.config.public_send(m)).to eq Capybara.public_send(m)
17
+ end
17
18
  end
18
19
 
19
20
  it "doesn't change global session when changed" do
@@ -64,4 +65,4 @@ RSpec.describe Capybara::SessionConfig do
64
65
  expect { Capybara.threadsafe = true }.to raise_error(/Threadsafe setting cannot be changed once a session is created/)
65
66
  end
66
67
  end
67
- end
68
+ end
@@ -1,20 +1,21 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  module TestSessions
5
6
  RackTest = Capybara::Session.new(:rack_test, TestApp)
6
7
  end
7
8
 
8
- Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", capybara_skip: [
9
- :js,
10
- :modals,
11
- :screenshot,
12
- :frames,
13
- :windows,
14
- :send_keys,
15
- :server,
16
- :hover,
17
- :about_scheme,
9
+ Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", capybara_skip: %i[
10
+ js
11
+ modals
12
+ screenshot
13
+ frames
14
+ windows
15
+ send_keys
16
+ server
17
+ hover
18
+ about_scheme
18
19
  ]
19
20
 
20
21
  RSpec.describe Capybara::Session do
@@ -64,10 +65,11 @@ RSpec.describe Capybara::Session do
64
65
 
65
66
  describe "#fill_in" do
66
67
  it "should warn that :fill_options are not supported" do
67
- expect_any_instance_of(Capybara::Node::Element).to receive(:warn)
68
- .with("Options passed to Capybara::Node#set but the driver doesn't support them")
68
+ expect_any_instance_of(Capybara::RackTest::Node).to receive(:warn)
69
+ .with("Options passed to Node#set but the RackTest driver doesn't support any - ignoring")
69
70
  @session.visit "/with_html"
70
- @session.fill_in 'test_field', with: 'not_moneky', fill_options: { random: true }
71
+ @session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true }
72
+ expect(@session).to have_field('test_field', with: 'not_monkey')
71
73
  end
72
74
  end
73
75
 
@@ -132,27 +134,27 @@ RSpec.describe Capybara::RackTest::Driver do
132
134
 
133
135
  describe ':headers option' do
134
136
  it 'should always set headers' do
135
- @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
137
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
136
138
  @driver.visit('/get_header')
137
139
  expect(@driver.html).to include('foobar')
138
140
  end
139
141
 
140
142
  it 'should keep headers on link clicks' do
141
- @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
143
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
142
144
  @driver.visit('/header_links')
143
145
  @driver.find_xpath('.//a').first.click
144
146
  expect(@driver.html).to include('foobar')
145
147
  end
146
148
 
147
149
  it 'should keep headers on form submit' do
148
- @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
150
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
149
151
  @driver.visit('/header_links')
150
152
  @driver.find_xpath('.//input').first.click
151
153
  expect(@driver.html).to include('foobar')
152
154
  end
153
155
 
154
156
  it 'should keep headers on redirects' do
155
- @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
157
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
156
158
  @driver.visit('/get_header_via_redirect')
157
159
  expect(@driver.html).to include('foobar')
158
160
  end
@@ -218,11 +220,10 @@ module CSSHandlerIncludeTester
218
220
  raise 'should never be called'
219
221
  end
220
222
  end
221
- include CSSHandlerIncludeTester
223
+ include CSSHandlerIncludeTester # rubocop:disable Style/MixinUsage
222
224
 
223
- RSpec.describe Capybara::RackTest::CSSHandlers do
225
+ RSpec.describe Capybara::RackTest::CSSHandlers do
224
226
  it "should not be extended by global includes" do
225
227
  expect(Capybara::RackTest::CSSHandlers.new).not_to respond_to(:dont_extend_css_handler)
226
228
  end
227
229
  end
228
-