Cromedriver `driver.manage.logs.get (: browser)` не работает на chromedriver 75.0.3770.8 - PullRequest
3 голосов
/ 10 июня 2019

При обращении к driver.manage.logs.get (: browser) на chromedriver 75.0.3770.8 - это вызывает ошибку

неопределенный метод `log 'для # (NoMethodError)

Отлично работает на 74.0.3729.6

от: https://github.com/SeleniumHQ/selenium/issues/7270

Ответы [ 4 ]

3 голосов
/ 10 июня 2019

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
2 голосов
/ 14 июня 2019

Capybara 3.24 теперь решает эту проблему при использовании с chromedriver> = 75.0.3770.90

2 голосов
/ 10 июня 2019

Как указано в примечаниях к выпуску для Chrome Driver 75, возможность loggingPrefs была переименована в goog:loggingPrefs, как того требует стандарт W3C. Таким образом, код, задающий возможности, должен быть скорректирован, и не будет необходимости возвращаться в не-w3c режим, по крайней мере, из-за причины захвата журнала.

1 голос
/ 14 июня 2019

В качестве кратковременного исправления кажется, что вы можете исправлять функциональность обратно (протестировано с использованием 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"
...