Chromedriver `driver.manage.logs.get(:browser)` 在 chromedriver 75.0.3770.8 上失败
Cromedriver `driver.manage.logs.get(:browser)` fails on chromedriver 75.0.3770.8
在 chromedriver 75.0.3770.8 上访问 driver.manage.logs.get(:browser) 时 - 它导致错误
# (NoMethodError) 的未定义方法“日志”
在 74.0.3729.6 上工作正常
Chrome 75 默认为 W3C 模式,未指定获取日志访问的方式。
此问题的短期修复是通过 chromeOptions
禁用 w3c
。
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: { args: %w[headless window-size=1280,800], w3c: false },
)
Capybara::Selenium::Driver.new app,
browser: :chrome,
desired_capabilities: capabilities
end
根据 W3C 标准的要求,Chrome 驱动程序 75 的 release notes 中指定,功能 loggingPrefs
已重命名为 goog:loggingPrefs
。因此,应该调整设置功能的代码,至少由于日志捕获原因,没有必要退回到非 w3c 模式。
作为短期修复,您似乎可以 monkey-patch 恢复功能(使用 Selenium-WebDriver v3.142.3 测试):
您将需要 add/patch Chrome::Bridge 的方法:
require 'selenium-webdriver'
module Selenium
module WebDriver
module Chrome
module Bridge
COMMANDS = remove_const(:COMMANDS).dup
COMMANDS[:get_log] = [:post, 'session/:session_id/log']
COMMANDS.freeze
def log(type)
data = execute :get_log, {}, {type: type.to_s}
Array(data).map do |l|
begin
LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
rescue KeyError
next
end
end
end
end
end
end
end
根据您的能力,您需要切换到使用 "goog:loggingPrefs" 而不是 "loggingPrefs":
caps = Selenium::WebDriver::Remote::Capabilities.chrome('goog:loggingPrefs' => {browser: 'ALL'})
driver = Selenium::WebDriver.for(:chrome, desired_capabilities: caps)
driver.execute_script('console.log("test");')
puts driver.manage.logs.get(:browser)
#=> INFO 2019-06-13 21:48:03 -0400: console-api 362:34 "test"
当与 chromedriver >= 75.0.3770.90 一起使用时,Capybara 3.24 现在可以解决这个问题
这对我有用:
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome, desired_capabilities: {
"chromeOptions" => {
w3c: false
},
'goog:loggingPrefs' => {browser: 'ALL'}
})
end
并在日志位置
puts ""
puts "*** Browser logs:"
puts ""
puts page.driver.browser.manage.logs.get("browser").map { |log_entry|
"[#{Time.at(log_entry.timestamp.to_i)}] [#{log_entry.level}] #{log_entry.message}"
}.join("\n")
我发现只需将 selenium-webdriver
gem 升级到 3.142.4+ 即可解决问题 (https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES),即使您使用的是过时的 Capybara。
driver.browser.manage.logs.get(:browser)
和以前一样工作。
在 chromedriver 75.0.3770.8 上访问 driver.manage.logs.get(:browser) 时 - 它导致错误
# (NoMethodError) 的未定义方法“日志”
在 74.0.3729.6 上工作正常
Chrome 75 默认为 W3C 模式,未指定获取日志访问的方式。
此问题的短期修复是通过 chromeOptions
禁用 w3c
。
Capybara.register_driver :headless_chrome do |app|
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(
chromeOptions: { args: %w[headless window-size=1280,800], w3c: false },
)
Capybara::Selenium::Driver.new app,
browser: :chrome,
desired_capabilities: capabilities
end
根据 W3C 标准的要求,Chrome 驱动程序 75 的 release notes 中指定,功能 loggingPrefs
已重命名为 goog:loggingPrefs
。因此,应该调整设置功能的代码,至少由于日志捕获原因,没有必要退回到非 w3c 模式。
作为短期修复,您似乎可以 monkey-patch 恢复功能(使用 Selenium-WebDriver v3.142.3 测试):
您将需要 add/patch Chrome::Bridge 的方法:
require 'selenium-webdriver'
module Selenium
module WebDriver
module Chrome
module Bridge
COMMANDS = remove_const(:COMMANDS).dup
COMMANDS[:get_log] = [:post, 'session/:session_id/log']
COMMANDS.freeze
def log(type)
data = execute :get_log, {}, {type: type.to_s}
Array(data).map do |l|
begin
LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
rescue KeyError
next
end
end
end
end
end
end
end
根据您的能力,您需要切换到使用 "goog:loggingPrefs" 而不是 "loggingPrefs":
caps = Selenium::WebDriver::Remote::Capabilities.chrome('goog:loggingPrefs' => {browser: 'ALL'})
driver = Selenium::WebDriver.for(:chrome, desired_capabilities: caps)
driver.execute_script('console.log("test");')
puts driver.manage.logs.get(:browser)
#=> INFO 2019-06-13 21:48:03 -0400: console-api 362:34 "test"
当与 chromedriver >= 75.0.3770.90 一起使用时,Capybara 3.24 现在可以解决这个问题
这对我有用:
Capybara.register_driver :chrome do |app|
Capybara::Selenium::Driver.new(app, :browser => :chrome, desired_capabilities: {
"chromeOptions" => {
w3c: false
},
'goog:loggingPrefs' => {browser: 'ALL'}
})
end
并在日志位置
puts ""
puts "*** Browser logs:"
puts ""
puts page.driver.browser.manage.logs.get("browser").map { |log_entry|
"[#{Time.at(log_entry.timestamp.to_i)}] [#{log_entry.level}] #{log_entry.message}"
}.join("\n")
我发现只需将 selenium-webdriver
gem 升级到 3.142.4+ 即可解决问题 (https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES),即使您使用的是过时的 Capybara。
driver.browser.manage.logs.get(:browser)
和以前一样工作。