ruby 在chromedriver 75.0.3770.8上,Cromedriver '驱动程序.管理.日志.获取(:浏览器)'失败

ltqd579y  于 2022-11-04  发布在  Ruby
关注(0)|答案(7)|浏览(111)

当访问chromedriver 75.0.3770.8上的驱动程序.manage.logs.get(:browser)时-它会导致错误
未定义#(NoMethodError)的'log'方法
在74.0.3729.6上工作正常
从:https://github.com/SeleniumHQ/selenium/issues/7270

xxls0lw8

xxls0lw81#

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
zsbz8rwp

zsbz8rwp2#

在最新的selenium-webdriver(4.4.0)和最新的Chrome(105)中,manage.logs消失了,但这是可行的:

page.driver.browser.logs.get(:browser)
ctrmrzij

ctrmrzij3#

当与chromedriver〉= 75.0.3770.90一起使用时,Capybara 3.24现在可以解决这个问题

lfapxunr

lfapxunr4#

根据Chrome驱动程序75的release notes中的规定,根据W3C标准的要求,loggingPrefs功能已被重命名为goog:loggingPrefs。因此,应调整设置功能的代码,并且至少由于日志捕获原因,没有必要回退到非w3c模式。

jgovgodb

jgovgodb5#

作为一个短期修复,您似乎可以通过monkey-patch将该功能恢复(使用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"
z2acfund

z2acfund6#

这对我很有效:

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

czq61nw17#

我发现只要将selenium-webdriver gem升级到3.142.4+就可以解决这个问题(https://github.com/SeleniumHQ/selenium/blob/trunk/rb/CHANGES),即使您使用的是过时的水豚。
driver.browser.manage.logs.get(:browser)和以前一样工作。

相关问题