Cromedriver`driver.manage.logs.get(:browser)`在chromedriver 75.0.3770.8上失败

时间:2019-06-10 07:49:48

标签: ruby selenium-chromedriver capybara

在chromedriver 75.0.3770.8上访问driver.manage.logs.get(:browser)时-会导致错误

#(NoMethodError)的未定义方法`log'

在74.0.3729.6上工作正常

来自:https://github.com/SeleniumHQ/selenium/issues/7270

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

根据{3}在Chrome驱动程序75中的指定,功能loggingPrefs已重命名为goog:loggingPrefs,这是W3C标准所要求的。因此,应该对设置功能的代码进行调整,至少由于日志捕获原因,没有必要退回到非w3c模式。

答案 2 :(得分:2)

与chromedriver> = 75.0.3770.90

一起使用时,Capybara 3.24现在可以解决此问题。

答案 3 :(得分:1)

作为一个短期修复,看来您可以重新修补该功能(使用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

在您的能力范围内,您将需要切换为使用“ 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"

答案 4 :(得分:1)

这对我有用:

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")

答案 5 :(得分:0)

我发现即使您使用的是过时的 Capybara,只需将 selenium-webdriver gem 升级到 3.142.4+ 即可解决问题 (https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES)。

driver.browser.manage.logs.get(:browser) 和以前一样工作。