我需要使用 Ruby 和 Capybara 捕获浏览器的控制台日志(类别:信息)。到目前为止,我已经尝试使用
driver.manage.logs.get(:browser)
或 (:client)
但是,使用这个,结果不是我想要的。它给出了 selenium 和浏览器之间的交互结果,我可以在其中看到我发送执行的 javascript 语句,但是结果输出无法被捕获。
使用 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)
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经过几次令人沮丧的尝试。
2022 年 11 月更新,使用:
page.driver.browser.logs.get(:browser)
不确定这是否是您想要的,但请看一下 https://github.com/dbalatero/capybara-chromedriver-logger。
它帮助我识别动态模块import('')
的
问题。通过显示失败的资产加载(我相信输出为
console.error
),可以在本地和 Github Actions / Circle CI 中工作。
基于 @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
我遇到了关于
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
)