Skip to content

Commit

Permalink
Patch back in log access for selenium driver with chromedriver 75 in …
Browse files Browse the repository at this point in the history
…w3c mode
  • Loading branch information
twalpole committed Jun 12, 2019
1 parent 135dcb7 commit 5bdc9d5
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
module Capybara::Selenium::Driver::ChromeDriver
def self.extended(base)
bridge = base.send(:bridge)
bridge.extend Capybara::Selenium::ChromeLogs unless bridge.respond_to?(:available_log_types)
bridge.extend Capybara::Selenium::ChromeLogs unless bridge.respond_to?(:log)
end

def fullscreen_window(handle)
Expand Down
30 changes: 25 additions & 5 deletions lib/capybara/selenium/patches/logs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,37 @@ module Capybara
module Selenium
module ChromeLogs
LOG_MSG = <<~MSG
Chromedriver 75+ defaults to W3C mode. The W3C webdriver spec does not define methods for accessing \
logs or log types. If you need to access the logs, in the short term, you can configure you driver to not use the W3C mode. \
It is unknown how long non-W3C mode will be supported by chromedriver (it won't be supported by selenium-webdriver 4+) \
so you may need to consider other solutions in the near future.
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.
MSG

def method_missing(meth, *) # rubocop:disable Style/MissingRespondToMissing
raise NotImplementedError, LOG_MSG if %i[available_log_types log].include? meth
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']
}.freeze

def commands(command)
COMMANDS[command] || super
end

def log(type)
data = execute :get_log, {}, type: type.to_s

Array(data).map do |l|
begin
::Selenium::WebDriver::LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
rescue KeyError
next
end
end
end
end
end
end
4 changes: 2 additions & 2 deletions spec/selenium_spec_chrome.rb
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,10 @@ module TestSessions
end.to raise_error(NotImplementedError, /Chromedriver 75\+ defaults to W3C mode/)
end

it 'errors when getting logs' do
it 'does not error when getting logs' do
expect do
session.driver.browser.manage.logs.get(:browser)
end.to raise_error(NotImplementedError, /Chromedriver 75\+ defaults to W3C mode/)
end.not_to raise_error
end
end
end
16 changes: 16 additions & 0 deletions spec/selenium_spec_chrome_remote.rb
Original file line number Diff line number Diff line change
Expand Up @@ -80,4 +80,20 @@ module TestSessions
it 'is considered to be chrome' do
expect(session.driver.browser.browser).to eq :chrome
end

describe 'log access' do
before { skip 'Only makes sense in W3C mode' if ENV['W3C'] == 'false' }

it 'errors when getting log types' do
expect do
session.driver.browser.manage.logs.available_types
end.to raise_error(NotImplementedError, /Chromedriver 75\+ defaults to W3C mode/)
end

it 'does not error when getting logs' do
expect do
session.driver.browser.manage.logs.get(:browser)
end.not_to raise_error
end
end
end

0 comments on commit 5bdc9d5

Please sign in to comment.