web-dev-qa-db-fra.com

Chromedriver `driver.manage.logs.get (: navigateur)` échoue sur chromedriver 75.0.3770.8

Lors de l'accès à driver.manage.logs.get (: navigateur) sur chromedriver 75.0.3770.8 - cela provoque une erreur

méthode non définie `log 'pour # (NoMethodError)

Fonctionne bien sur 74.0.3729.6

de: https://github.com/SeleniumHQ/Selenium/issues/727

10
Daniel

Capybara 3.24 contourne désormais ce problème lorsqu'il est utilisé avec chromedriver> = 75.0.3770.90

4
Thomas Walpole

Chrome 75 utilise par défaut le mode W3C, qui ne spécifie pas un moyen d'accéder au journal.

La solution à court terme pour ce problème consiste à désactiver w3c via 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
Daniel

Comme spécifié dans les notes de version pour Chrome Driver 75, la capacité loggingPrefs a été renommée goog:loggingPrefs, comme requis par la norme W3C. Ainsi, le code définissant les capacités doit être ajusté et il ne sera pas nécessaire de revenir au mode non-w3c au moins pour la raison de la capture du journal.

4
Alexey Subach

En tant que correctif à court terme, il semble que vous pouvez réinstaller la fonctionnalité (testée à l'aide de Selenium-WebDriver v3.142.3):

Vous devrez ajouter/patcher la méthode dans 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

Dans vos capacités, vous devrez passer à l'utilisation de "goog: loggingPrefs" au lieu de simplement "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"
1
Justin Ko

Cela fonctionne pour moi:

Capybara.register_driver :chrome do |app|

  Capybara::Selenium::Driver.new(app, :browser => :chrome,   desired_capabilities: {
      "chromeOptions" => {
        w3c: false
      },
      'goog:loggingPrefs' => {browser: 'ALL'}
    })  
end

et dans le rondin

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")
1
Hussam Kurd