diff --git a/lib/capybara/selenium/patches/logs.rb b/lib/capybara/selenium/patches/logs.rb index 6eb86bc2..eba7dce5 100644 --- a/lib/capybara/selenium/patches/logs.rb +++ b/lib/capybara/selenium/patches/logs.rb @@ -4,28 +4,33 @@ module Capybara module Selenium module ChromeLogs LOG_MSG = <<~MSG - Chromedriver 75+ defaults to W3C mode. The W3C webdriver spec does not define a method for accessing log types. \ - If you need to access the available log types, in the short term, you can configure you driver to not use the W3C mode. \ - This functionality will be returning in Chromedriver 76 or 77 in a W3C compatible way. + Chromedriver 75+ defaults to W3C mode. Please upgrade to chromedriver >= \ + 75.0.3770.90 if you need to access logs while in W3C compliant mode. MSG - def method_missing(meth, *) # rubocop:disable Style/MissingRespondToMissing - raise NotImplementedError, LOG_MSG if meth == :available_log_types - - super - end - COMMANDS = { - # get_available_log_types: [:get, 'session/:session_id/log/types'], - get_log: [:post, 'session/:session_id/log'] + get_available_log_types: [:get, 'session/:session_id/se/log/types'], + get_log: [:post, 'session/:session_id/se/log'], + get_log_legacy: [:post, 'session/:session_id/log'] }.freeze def commands(command) COMMANDS[command] || super end + def available_log_types + types = execute :get_available_log_types + Array(types).map(&:to_sym) + rescue ::Selenium::WebDriver::Error::UnknownCommandError + raise NotImplementedError, LOG_MSG + end + def log(type) - data = execute :get_log, {}, type: type.to_s + data = begin + execute :get_log, {}, type: type.to_s + rescue ::Selenium::WebDriver::Error::UnknownCommandError + execute :get_log_legacy, {}, type: type.to_s + end Array(data).map do |l| begin @@ -34,6 +39,8 @@ module Capybara next end end + rescue ::Selenium::WebDriver::Error::UnknownCommandError + raise NotImplementedError, LOG_MSG end end end diff --git a/spec/selenium_spec_chrome.rb b/spec/selenium_spec_chrome.rb index 97e367dd..d3389fbb 100644 --- a/spec/selenium_spec_chrome.rb +++ b/spec/selenium_spec_chrome.rb @@ -125,10 +125,11 @@ RSpec.describe 'Capybara::Session with chrome' do describe 'log access' do before { skip 'Only makes sense in W3C mode' if ENV['W3C'] == 'false' } - it 'errors when getting log types' do + it 'does not error getting log types' do + skip if Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0]) < Gem::Version.new('75.0.3770.90') expect do session.driver.browser.manage.logs.available_types - end.to raise_error(NotImplementedError, /Chromedriver 75\+ defaults to W3C mode/) + end.not_to raise_error end it 'does not error when getting logs' do diff --git a/spec/selenium_spec_chrome_remote.rb b/spec/selenium_spec_chrome_remote.rb index 3268239c..79e5f940 100644 --- a/spec/selenium_spec_chrome_remote.rb +++ b/spec/selenium_spec_chrome_remote.rb @@ -84,10 +84,11 @@ RSpec.describe 'Capybara::Session with remote Chrome' do describe 'log access' do before { skip 'Only makes sense in W3C mode' if ENV['W3C'] == 'false' } - it 'errors when getting log types' do + it 'does not error when getting log types' do + skip if Gem::Version.new(session.driver.browser.capabilities['chrome']['chromedriverVersion'].split[0]) < Gem::Version.new('75.0.3770.90') expect do session.driver.browser.manage.logs.available_types - end.to raise_error(NotImplementedError, /Chromedriver 75\+ defaults to W3C mode/) + end.not_to raise_error end it 'does not error when getting logs' do