启用跟踪日志

geckodriver 为不同受众提供不同级别的日志。默认情况下,最重要的日志条目会显示给所有人,其中包括 geckodriver 提供 WebDriver API 的端口,以及信息性警告、错误和致命异常。

不同的日志级别,按带宽升序排列:

  1. fatal 保留用于 geckodriver 或 Firefox 无法恢复的异常情况。这通常意味着一个或两个进程都会退出。

  2. error 消息是程序代码中的错误,可以从中恢复。

  3. warn 显示更多信息性质的警告,不一定是 geckodriver 中的问题。例如,如果您使用旧的 desiredCapabilities/requiredCapabilities 对象而不是新的 alwaysMatch/firstMatch 结构,就会发生这种情况。

  4. info (默认) 包含 geckodriver 绑定到的端口信息,以及上面列出的所有较低带宽级别的消息。

  5. config 还会显示在将 alwaysMatch 功能与 firstMatch 功能序列匹配后协商的功能。

  6. debug 保留用于编程时有用的信息。

  7. trace,除了自身之外,还包括所有先前的级别。跟踪级别显示 geckodriver 收到的所有 HTTP 请求、发送到 Firefox 和从 Firefox 发送的远程协议数据包以及发送回客户端的响应。

换句话说,这意味着配置的级别将合并来自所有较低级别的条目,包括自身。如果您将日志级别设置为 error,则将获得 fatalerror 的日志条目。类似地,对于 trace,您将获得提供的所有日志。

为了帮助调试 geckodriver 或 Firefox 的问题,跟踪级别的输出对于理解正在发生的事情至关重要。这就是为什么我们在针对 geckodriver 提交错误时要求包含跟踪日志的原因。只有在非常特殊的情况下才不需要跟踪日志,因此您通常会发现,在我们对您的问题进行分类时,我们的第一个操作就是要求您包含一个。帮自己和我们一个忙,立即提供跟踪级别的日志。

要完全静默 geckodriver,您可以例如将所有输出重定向到追加到某些日志文件

% geckodriver >>geckodriver.log 2>>geckodriver.err.log

或某个黑洞

% geckodriver >/dev/null 2>&1

为 geckodriver 设置的日志级别会传播到 Firefox 中的 Marionette 日志记录器。Marionette 是 geckodriver 用于实现 WebDriver 的远程协议。这意味着启用 geckodriver 的跟踪日志也将隐式地为 Marionette 启用它们。

日志级别以不同的方式设置。可以使用 --log <LEVEL> 选项,其中 LEVEL 是上面列表中的日志级别之一,或者使用 -v(用于调试)或 -vv(用于跟踪)快捷方式。例如,以下命令将为 geckodriver 和 Marionette 启用跟踪日志

% geckodriver -vv

设置日志级别的第二种方法是通过功能。geckodriver 在 moz:firefoxOptions 中接受一个 Mozilla 特定的配置对象。此 JSON 对象在 README 中有进一步描述,可以保存 Firefox 特定的配置,例如使用哪个 Firefox 二进制文件、设置哪些其他首选项,当然还有使用哪个日志级别。

每个客户端都有自己的指定功能的方式,并且一些客户端包括用于提供浏览器特定配置的“帮助程序”。通常建议使用这些帮助程序而不是自己编码 JSON 对象,因为很难准确掌握细节,但是如果您选择这样做,它应该如下所示

{"moz:firefoxOptions": {"log": {"level": "trace"}}}

请注意,大多数已知的 WebDriver 客户端(例如 Selenium 项目提供的客户端)都没有公开查看日志的方法,除非您将日志输出重定向到特定文件(使用上面显示的方法)或让客户端“继承”geckodriver 的输出,例如通过将其 stdout 和 stderr 流重定向到它自己的流。值得注意的例外是 Python 和 Ruby 绑定,它们以一种非常简单有效的方式显示 geckodriver 日志。

请参阅下面的客户端特定文档,了解在您的语言中启用跟踪日志的最惯用方法。我们希望扩展此文档以涵盖人们与 geckodriver 一起使用的所有最知名的客户端。如果您发现您的语言丢失,请考虑 提交补丁

C#

Selenium 的 C# 客户端 带有一个 FirefoxOptions 帮助程序,用于构建 moz:firefoxOptions 功能对象

FirefoxOptions options = new FirefoxOptions();
options.LogLevel = FirefoxDriverLogLevel.Trace;
IWebDriver driver = new FirefoxDriver(options);

日志输出定向到标准输出。

Java

Selenium 的 Java 客户端 也带有一个 org.openqa.selenium.firefox.FirefoxOptions 帮助程序,用于构建 moz:firefoxOptions 功能对象

FirefoxOptions options = new FirefoxOptions();
options.setLogLevel(FirefoxDriverLogLevel.TRACE);
WebDriver driver = new FirefoxDriver(options);

日志输出定向到标准输出。

Javascript (webdriver.io)

使用 Selenium 的 JavaScript 客户端,可以直接构造功能对象

import WebDriver from 'webdriver'

const driver = await WebDriver.newSession({
    capabilities: {
        browserName: 'firefox',
        'moz:firefoxOptions': {
            log: { level: 'trace' },
        }
    }
})

日志输出定向到标准输出,或者如果 geckodriver 作为 wdio 插件运行,则生成的日志是 wdio 日志系统的一部分。

Python

Selenium 的 Python 客户端 带有一个 selenium.webdriver.firefox.options.Options 帮助程序,可用于以编程方式构建 moz:firefoxOptions 功能对象

from selenium.webdriver import Firefox
from selenium.webdriver.firefox.options import Options

opts = Options()
opts.log.level = "trace"
driver = Firefox(options=opts)

日志输出存储在脚本当前工作目录中的名为 geckodriver.log 的文件中。

Ruby

Selenium 的 Ruby 客户端 带有一个 Options 帮助程序,用于生成正确的 moz:firefoxOptions 功能对象

Selenium::WebDriver.logger.level = :debug
opts = Selenium::WebDriver::Firefox::Options.new(log_level: :trace)
driver = Selenium::WebDriver.for :firefox, options: opts

日志输出定向到标准输出。