diff --git a/lib/capybara.rb b/lib/capybara.rb index 0da5706e..cd73eceb 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -5,6 +5,7 @@ require 'nokogiri' require 'xpath' require 'forwardable' require 'capybara/config' +require 'capybara/registration_container' module Capybara class CapybaraError < StandardError; end @@ -126,7 +127,7 @@ module Capybara # @yieldreturn [Capybara::Driver::Base] A Capybara driver instance # def register_driver(name, &block) - drivers[name] = block + drivers.send(:register, name, block) end ## @@ -145,7 +146,7 @@ module Capybara # @yieldparam host The host/ip to bind to # def register_server(name, &block) - servers[name.to_sym] = block + servers.send(:register, name.to_sym, block) end ## @@ -199,11 +200,11 @@ module Capybara end def drivers - @drivers ||= {} + @drivers ||= RegistrationContainer.new end def servers - @servers ||= {} + @servers ||= RegistrationContainer.new end # Wraps the given string, which should contain an HTML document or fragment diff --git a/lib/capybara/cucumber.rb b/lib/capybara/cucumber.rb index fcfb073e..71cbadaa 100644 --- a/lib/capybara/cucumber.rb +++ b/lib/capybara/cucumber.rb @@ -22,6 +22,6 @@ end Before do |scenario| scenario.source_tag_names.each do |tag| driver_name = tag.sub(/^@/, '').to_sym - Capybara.current_driver = driver_name if Capybara.drivers.key?(driver_name) + Capybara.current_driver = driver_name if Capybara.drivers[driver_name] end end diff --git a/lib/capybara/registration_container.rb b/lib/capybara/registration_container.rb new file mode 100644 index 00000000..e1189408 --- /dev/null +++ b/lib/capybara/registration_container.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module Capybara + # @api private + class RegistrationContainer + def names + @registered.keys + end + + def [](name) + @registered[name] + end + + def []=(name, value) + warn 'DEPRECATED: Directly setting drivers/servers is deprecated, please use Capybara.register_driver/register_server instead' + @registered[name] = value + end + + def method_missing(method_name, *args, **options, &block) + if @registered.respond_to?(method_name) + warn "DEPRECATED: Calling '#{method_name}' on the drivers/servers container is deprecated without replacement" + # RUBY 2.6 will send an empty hash rather than nothing with **options so fix that + return @registered.public_send(method_name, *args, &block) if options.empty? + + return @registered.public_send(method_name, *args, **options, &block) + end + super + end + + def respond_to_missing?(method_name, include_private = false) + @registered.respond_to?(method_name) || super + end + + private + + def initialize + @registered = {} + end + + def register(name, block) + @registered[name] = block + end + end +end diff --git a/lib/capybara/selenium/driver.rb b/lib/capybara/selenium/driver.rb index 2cb10d3a..710f54c1 100644 --- a/lib/capybara/selenium/driver.rb +++ b/lib/capybara/selenium/driver.rb @@ -86,9 +86,7 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base def html browser.page_source rescue Selenium::WebDriver::Error::JavascriptError => e - return '' if e.match?(/documentElement is null/) - - raise + raise unless e.message.match?(/documentElement is null/) end def title diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index a66263ff..0691dc5c 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -97,8 +97,8 @@ module Capybara def driver @driver ||= begin - unless Capybara.drivers.key?(mode) - other_drivers = Capybara.drivers.keys.map(&:inspect) + unless Capybara.drivers[mode] + other_drivers = Capybara.drivers.names.map(&:inspect) raise Capybara::DriverNotFoundError, "no driver called #{mode.inspect} was found, available drivers: #{other_drivers.join(', ')}" end driver = Capybara.drivers[mode].call(app) @@ -192,7 +192,7 @@ module Capybara # @return [String] A snapshot of the DOM of the current document, as it looks right now (potentially modified by JavaScript). # def html - driver.html + driver.html || '' end alias_method :body, :html alias_method :source, :html diff --git a/spec/capybara_spec.rb b/spec/capybara_spec.rb index e0f32dbe..8d53ae5e 100644 --- a/spec/capybara_spec.rb +++ b/spec/capybara_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Capybara do # do nothing end - expect(described_class.servers).to have_key(:blob) + expect(described_class.servers[:blob]).to be_truthy end end