使用水豚捕获浏览器控制台日志

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

我需要使用 Ruby 和 Capybara 捕获浏览器的控制台日志(类别:信息)。到目前为止,我已经尝试使用

driver.manage.logs.get(:browser)
或 (
:client)
但是,使用这个,结果不是我想要的。它给出了 selenium 和浏览器之间的交互结果,我可以在其中看到我发送执行的 javascript 语句,但是结果输出无法被捕获。

javascript ruby selenium capybara console.log
6个回答
31
投票

使用 selenium 时日志是否可用取决于您使用 Selenium 的浏览器。如果您使用的是 Firefox,那么您就不走运了,因为它不支持日志检索 API,但由于您使用的是 Chrome,因此可以访问它们。您遇到的问题是,默认情况下,仅捕获 WARN 或 ERROR 级别的日志。您可以通过loggingPrefs功能在驱动程序注册中更改此设置

硒3

    Capybara.register_driver :logging_selenium_chrome do |app|
      caps = Selenium::WebDriver::Remote::Capabilities.chrome(loggingPrefs:{browser: 'ALL'})
      browser_options = ::Selenium::WebDriver::Chrome::Options.new()
      # browser_options.args << '--some_option' # add whatever browser args and other options you need (--headless, etc)
      Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options, desired_capabilities: caps)
    end

硒4

   Capybara.register_driver :logging_selenium_chrome do |app|
     options = Selenium::WebDriver::Chrome::Options.new
     options.add_option("goog:loggingPrefs", {browser: 'ALL'})

     browser_options = ::Selenium::WebDriver::Chrome::Options.new()

     Capybara.register_driver :chrome do |app|
     Capybara::Selenium::Driver.new(app,
                                 capabilities: options,
                                 browser: :chrome)
     end
   end

然后指定使用

:logging_selenium_chrome
作为您的驱动程序

 Capybara.javascript_driver = :logging_selenium_chrome # or however else you're specifying which driver to use

然后应该允许您在测试中获取日志

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

9
投票

Thomas Walpole 答案是正确的,但现在看来,如果您使用 chrome 作为驱动程序,您应该使用

Selenium::WebDriver::Remote::Capabilities.chrome( "goog:loggingPrefs": { browser: 'ALL' } )

注意

goog:loggingPrefs
而不是
loggingPrefs
仅使用此解决方案,我才能在日志中打印
console.log

我花了一段时间才从这里得到它https://intellipaat.com/community/5478/getting-console-log-output-from-chrome-with-selenium-python-api-bindings经过几次令人沮丧的尝试。


2
投票

2022 年 11 月更新,使用:

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


1
投票

不确定这是否是您想要的,但请看一下 https://github.com/dbalatero/capybara-chromedriver-logger

它帮助我识别动态模块import('')

问题
。通过显示失败的资产加载(我相信输出为
console.error
),可以在本地和 Github Actions / Circle CI 中工作。


0
投票

基于 @thomas-walpole 和 @0ds0 的答案,翻阅其他各种帖子,并跟踪弃用警告,我找到了这段代码(截至 2023 年 7 月,使用 Chrome

v114
)。它还重现了 Capybara 用于 构建原始
selenium_chrome
驱动程序的代码。

Capybara.register_driver :selenium_chrome do |app|
  browser_options = Selenium::WebDriver::Chrome::Options.new.tap do |opts|
    # Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
    opts.add_argument('--disable-site-isolation-trials')

    opts.add_option('goog:loggingPrefs', browser: 'ALL')
  end

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
end

Capybara.javascript_driver = :selenium_chrome

我像这样存储日志:

config.prepend_after(js: true) do |example|
  Selenium::WebDriver.logger.info "Finishing Capybara test: #{example.location}\n"

  browser_logs = page.driver.browser.logs.get(:browser)
  log_str = SystemConfigurationHelpers.make_browser_log_string(browser_logs)

  Selenium::WebDriver.logger.info "** Browser logs for #{example.location}:\n\n#{log_str}\n"

  driver_logs = page.driver.browser.logs.get(:driver)
  log_str = SystemConfigurationHelpers.make_browser_log_string(driver_logs)

  Selenium::WebDriver.logger.info "** Driver logs for #{example.location}:\n\n#{log_str}\n"
end

使日志条目看起来不错的代码是:

module SystemConfigurationHelpers
  # Convenience method used for displaying browser log statements extracted from Selenium
  # @param [Array<String>] collection of browser log statements
  # @return [String] newline-delimited list of formatted log messages
  def self.make_browser_log_string(logs)
    logs.inject(+'') do |result, log|
      result << "* #{log.time} #{log.level}: #{log.message}\n"
    end
  end
end

0
投票

我遇到了关于

Selenium::WebDriver::Remote::Capabilities
的已弃用警告。

这对我有用,并且似乎与文档的建议一致:

    ...
    # this gives us access to the javascript logs using `page.driver.browser.logs.get(:browser)` in our test
    # see https://www.selenium.dev/documentation/webdriver/browsers/chrome/
    service = Selenium::WebDriver::Service.chrome
    service.args << '--log-level=ALL'

    Capybara::Selenium::Driver.new(
      app,
      browser: :chrome,
      options: options,
      service: service
    )
© www.soinside.com 2019 - 2024. All rights reserved.