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.
- checksums.yaml +5 -5
- data/History.md +137 -2
- data/README.md +36 -25
- data/lib/capybara/config.rb +11 -57
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +19 -16
- data/lib/capybara/driver/node.rb +5 -4
- data/lib/capybara/dsl.rb +1 -0
- data/lib/capybara/helpers.rb +19 -29
- data/lib/capybara/minitest/spec.rb +16 -13
- data/lib/capybara/minitest.rb +140 -137
- data/lib/capybara/node/actions.rb +68 -89
- data/lib/capybara/node/base.rb +11 -18
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +8 -8
- data/lib/capybara/node/element.rb +32 -42
- data/lib/capybara/node/finders.rb +64 -71
- data/lib/capybara/node/matchers.rb +50 -71
- data/lib/capybara/node/simple.rb +11 -17
- data/lib/capybara/queries/ancestor_query.rb +12 -8
- data/lib/capybara/queries/base_query.rb +22 -18
- data/lib/capybara/queries/current_path_query.rb +12 -25
- data/lib/capybara/queries/match_query.rb +3 -7
- data/lib/capybara/queries/selector_query.rb +100 -96
- data/lib/capybara/queries/sibling_query.rb +5 -5
- data/lib/capybara/queries/text_query.rb +35 -35
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +15 -18
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +6 -10
- data/lib/capybara/rack_test/form.rb +52 -39
- data/lib/capybara/rack_test/node.rb +93 -63
- data/lib/capybara/rails.rb +2 -6
- data/lib/capybara/result.rb +22 -22
- data/lib/capybara/rspec/compound.rb +5 -10
- data/lib/capybara/rspec/features.rb +17 -48
- data/lib/capybara/rspec/matcher_proxies.rb +31 -15
- data/lib/capybara/rspec/matchers.rb +116 -58
- data/lib/capybara/rspec.rb +5 -10
- data/lib/capybara/selector/css.rb +6 -11
- data/lib/capybara/selector/filter.rb +1 -17
- data/lib/capybara/selector/filter_set.rb +18 -15
- data/lib/capybara/selector/filters/base.rb +7 -6
- data/lib/capybara/selector/filters/expression_filter.rb +6 -23
- data/lib/capybara/selector/filters/node_filter.rb +2 -12
- data/lib/capybara/selector/selector.rb +28 -34
- data/lib/capybara/selector.rb +129 -117
- data/lib/capybara/selenium/driver.rb +172 -163
- data/lib/capybara/selenium/node.rb +218 -104
- data/lib/capybara/server.rb +3 -2
- data/lib/capybara/session/config.rb +47 -59
- data/lib/capybara/session/matchers.rb +23 -14
- data/lib/capybara/session.rb +175 -229
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/public/test.js +38 -6
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
- data/lib/capybara/spec/session/accept_prompt_spec.rb +30 -1
- data/lib/capybara/spec/session/all_spec.rb +31 -18
- data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
- data/lib/capybara/spec/session/assert_current_path.rb +12 -11
- data/lib/capybara/spec/session/assert_selector.rb +1 -0
- data/lib/capybara/spec/session/assert_text.rb +31 -23
- data/lib/capybara/spec/session/assert_title.rb +13 -3
- data/lib/capybara/spec/session/attach_file_spec.rb +57 -29
- data/lib/capybara/spec/session/body_spec.rb +1 -0
- data/lib/capybara/spec/session/check_spec.rb +7 -6
- data/lib/capybara/spec/session/choose_spec.rb +5 -4
- data/lib/capybara/spec/session/click_button_spec.rb +24 -32
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
- data/lib/capybara/spec/session/click_link_spec.rb +8 -7
- data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
- data/lib/capybara/spec/session/current_url_spec.rb +19 -8
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +5 -4
- data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
- data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
- data/lib/capybara/spec/session/find_button_spec.rb +4 -3
- data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
- data/lib/capybara/spec/session/find_field_spec.rb +9 -15
- data/lib/capybara/spec/session/find_link_spec.rb +6 -5
- data/lib/capybara/spec/session/find_spec.rb +37 -31
- data/lib/capybara/spec/session/first_spec.rb +60 -33
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
- data/lib/capybara/spec/session/go_back_spec.rb +1 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_button_spec.rb +2 -1
- data/lib/capybara/spec/session/has_css_spec.rb +3 -2
- data/lib/capybara/spec/session/has_current_path_spec.rb +49 -22
- data/lib/capybara/spec/session/has_field_spec.rb +4 -3
- data/lib/capybara/spec/session/has_link_spec.rb +5 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
- data/lib/capybara/spec/session/has_select_spec.rb +32 -31
- data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
- data/lib/capybara/spec/session/has_table_spec.rb +2 -1
- data/lib/capybara/spec/session/has_text_spec.rb +9 -13
- data/lib/capybara/spec/session/has_title_spec.rb +1 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
- data/lib/capybara/spec/session/headers.rb +2 -1
- data/lib/capybara/spec/session/html_spec.rb +1 -0
- data/lib/capybara/spec/session/node_spec.rb +107 -58
- data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
- data/lib/capybara/spec/session/refresh_spec.rb +6 -2
- data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
- data/lib/capybara/spec/session/response_code.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
- data/lib/capybara/spec/session/save_page_spec.rb +1 -17
- data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +21 -20
- data/lib/capybara/spec/session/selectors_spec.rb +2 -2
- data/lib/capybara/spec/session/sibling_spec.rb +1 -1
- data/lib/capybara/spec/session/text_spec.rb +17 -3
- data/lib/capybara/spec/session/title_spec.rb +11 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
- data/lib/capybara/spec/session/unselect_spec.rb +7 -6
- data/lib/capybara/spec/session/visit_spec.rb +64 -3
- data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_spec.rb +12 -12
- data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
- data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
- data/lib/capybara/spec/session/within_spec.rb +1 -0
- data/lib/capybara/spec/spec_helper.rb +36 -18
- data/lib/capybara/spec/test_app.rb +17 -9
- data/lib/capybara/spec/views/form.erb +7 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +5 -0
- data/lib/capybara/spec/views/with_html.erb +27 -1
- data/lib/capybara/spec/views/with_js.erb +11 -0
- data/lib/capybara/spec/views/within_frames.erb +4 -1
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +6 -10
- data/lib/capybara.rb +29 -26
- data/spec/basic_node_spec.rb +1 -0
- data/spec/capybara_spec.rb +16 -69
- data/spec/dsl_spec.rb +5 -13
- data/spec/filter_set_spec.rb +5 -4
- data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
- data/spec/minitest_spec.rb +13 -4
- data/spec/minitest_spec_spec.rb +12 -3
- data/spec/per_session_config_spec.rb +9 -8
- data/spec/rack_test_spec.rb +21 -20
- data/spec/result_spec.rb +17 -16
- data/spec/rspec/features_spec.rb +17 -14
- data/spec/rspec/scenarios_spec.rb +5 -7
- data/spec/rspec/shared_spec_matchers.rb +96 -99
- data/spec/rspec/views_spec.rb +2 -1
- data/spec/rspec_matchers_spec.rb +18 -2
- data/spec/rspec_spec.rb +11 -15
- data/spec/selector_spec.rb +5 -6
- data/spec/selenium_spec_chrome.rb +20 -11
- data/spec/selenium_spec_edge.rb +27 -0
- data/spec/selenium_spec_ie.rb +31 -0
- data/spec/selenium_spec_marionette.rb +38 -12
- data/spec/server_spec.rb +33 -33
- data/spec/session_spec.rb +2 -1
- data/spec/shared_selenium_session.rb +82 -22
- data/spec/spec_helper.rb +3 -6
- metadata +76 -81
- data/lib/capybara/query.rb +0 -7
- 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
|
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[:
|
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
|
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
|
-
|
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, :
|
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)
|
data/spec/basic_node_spec.rb
CHANGED
data/spec/capybara_spec.rb
CHANGED
@@ -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
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
56
|
-
|
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
|
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 =
|
79
|
-
Capybara.
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
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
|
-
|
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
|
data/spec/filter_set_spec.rb
CHANGED
@@ -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) { |
|
12
|
-
expression_filter(:expression_test, :boolean) { |
|
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) { |
|
22
|
-
expression_filter(:expression_test, :boolean) { |
|
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
|
-
|
9
|
-
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
|
data/spec/minitest_spec.rb
CHANGED
@@ -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("
|
129
|
+
expect(output.string).to include("17 runs, 44 assertions, 0 failures, 0 errors, 0 skips")
|
121
130
|
end
|
122
131
|
end
|
data/spec/minitest_spec_spec.rb
CHANGED
@@ -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("
|
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
|
-
[
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
data/spec/rack_test_spec.rb
CHANGED
@@ -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
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
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
|
68
|
-
.with("Options passed to
|
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: '
|
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
|
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
|
-
|