Chromedriver 75.0.3770.8でdriver.manage.logs.get(:browser)にアクセスするとエラーが発生する
#の未定義のメソッド `log '(NoMethodError)
74.0.3729.6で正常に動作します
Capybara 3.24は、chromedriver> = 75.0.3770.90と一緒に使用すると、この問題を回避します
Chrome 75のデフォルトはW3Cモードで、ログアクセスを取得する方法は指定されていません。
この問題の短期的な修正は、w3c
経由のchromeOptions
。
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
リリースノート for Chrome Driver 75で指定されているように、機能loggingPrefs
は、W3C標準で要求されるようにgoog:loggingPrefs
に名前が変更されました。したがって、機能を設定するコードを調整する必要があり、少なくともログキャプチャの理由により、非w3cモードにフォールバックする必要はありません。
短期的な修正として、機能をモンキーパッチで戻すことができるようです(Selenium-WebDriver v3.142.3を使用してテスト済み)。
メソッドを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
機能では、単に「loggingPrefs」ではなく「goog: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"
これは私にとってはうまくいきます:
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")