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

问题描述 投票:0回答:7

在 chromedriver 75.0.3770.8 上访问

driver.manage.logs.get(:browser)
时,我收到此错误:

undefined method `log' for #<Selenium::WebDriver::Remote::W3C::Bridge:0x0000562dc661c250> (NoMethodError)

在 74.0.3729.6 上运行良好

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

ruby selenium-chromedriver capybara
7个回答
10
投票

在最近的

selenium-webdriver
(4.4.0) 和最近的 Chrome (105) 中,
manage.logs
消失了,但这有效:

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

8
投票

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

6
投票

Capybara 3.24 现在可以在与 chromedriver >= 75.0.3770.90 一起使用时解决此问题


4
投票

根据 Chrome 驱动程序 75 的 发行说明 中的规定,根据 W3C 标准的要求,功能

loggingPrefs
已重命名为
goog:loggingPrefs
。因此,应该调整设置功能的代码,并且至少由于日志捕获的原因,没有必要回退到非 w3c 模式。


2
投票

作为短期修复,您似乎可以对功能进行猴子修补(使用 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"

2
投票

这对我有用:

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

2
投票

我发现,即使您使用的是过时的水豚。

selenium-webdriver 就像以前一样工作。


© www.soinside.com 2019 - 2024. All rights reserved.