如何使用 Geckodriver 在 Selenium 中禁用 Firefox 登录?

Posted

技术标签:

【中文标题】如何使用 Geckodriver 在 Selenium 中禁用 Firefox 登录?【英文标题】:How do I disable Firefox logging in Selenium using Geckodriver? 【发布时间】:2017-05-14 06:09:17 【问题描述】:

我正在使用:

火狐版本 50.1.0 geckodriver 版本 0.11.1 硒-java 3.0.1

我试过了

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("webdriver.log.browser.ignore", true);
profile.setPreference("webdriver.log.driver.ignore", true);
profile.setPreference("webdriver.log.profiler.ignore", true);
FirefoxDriver driver = new FirefoxDriver();

LoggingPreferences preferences = new LoggingPreferences();
preferences.enable(LogType.BROWSER, Level.OFF);
preferences.enable(LogType.CLIENT, Level.OFF);
preferences.enable(LogType.DRIVER, Level.OFF);
preferences.enable(LogType.PERFORMANCE, Level.OFF);
preferences.enable(LogType.SERVER, Level.OFF);
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.LOGGING_PREFS, preferences);
FirefoxDriver driver = new FirefoxDriver(capabilities);

这些方法都不会停止记录。 如果有帮助,这里是控制台输出:

第一种方法:http://pastebin.com/23nate2G 第二种方法:http://pastebin.com/NwmWEeXT

对于那些想知道的人,我的 pom.xml 中有 log4j 1.2.17,但没有 log4j.propertieslog4j.xml,我根本不使用它。


澄清一下:当我说日志时,我指的是 IntelliJ IDEA 中的控制台输出。我正在使用 Java。

【问题讨论】:

你为什么要使用 geckodriver ? Firefox 需要它吗?哦,好的,它是 selenium 3 中的新功能 如果我没记错的话,使用 selenium 3.0.0 及更高版本的 Firefox 需要 Geckodriver How to turn off the Marionette/gecko driver logs in selenium 3的可能重复 【参考方案1】:

您可以在 geckodriver.exe 中通过命令行定义所需的日志记录级别。

geckodriver.exe -help    
USAGE:
    geckodriver.exe [FLAGS] [OPTIONS]   
...
OPTIONS:
        --log <LEVEL>
            Set Gecko log level [values: fatal, error, warn, info, config,
            debug, trace]

如果你使用 selenium 的 geckodriver,你有两个选择:

使用自定义参数单独启动 geckodriver.exe,并通过 RemoteWebDriver 从 selenium 使用它 创建自定义包装器,为 geckodriver.exe 添加额外参数

geckodriver 包装 bat 文件示例(适用于 windows):

@ECHO OFF
ECHO Starting geckodriver: %0 %*
.\GeckoDriver\geckodriver.exe --log fatal %* > NUL 2>&1

在 java 中,您可以通过 webdriver.gecko.driver 系统属性定义 geckodriver 可执行路径:

System.setProperty("webdriver.gecko.driver", "c:/selenium/geckodriver/gdrvwrapper.bat");

【讨论】:

我选择了这个答案,但在 Linux 上设置日志级别对我没有任何帮助。它起作用了,因为输出被重定向到空值。您可以通过不添加 > NUL 2>& 部分来尝试此操作。我在下面添加了linux版本 这个bat文件还需要吗?或者有没有办法以编程方式做到这一点? 系统属性让你可以务实地做。查看其他答案 如何从 java 添加 geckodriver 日志级别?【参考方案2】:
  GeckoDriverService gecko = new GeckoDriverService(new File("c:/selenium/geckodriver.exe"), 4444, ImmutableList.of("--log=fatal"), ImmutableMap.of());
  gecko.sendOutputTo(new FileOutputStream("gecko_log.txt"));
  gecko.start();

  FirefoxOptions opts = new FirefoxOptions().setLogLevel(Level.OFF);
  DesiredCapabilities capabilities = opts.addTo(DesiredCapabilities.firefox());
  capabilities.setCapability("marionette", true);
  driver = new FirefoxDriver(gecko, capabilities);

【讨论】:

即使我将其更改为不再给出错误,我也会收到错误和弃用警告。这一定是 Selenium 的旧版本【参考方案3】:

这是上面@voji 答案的Linux 版本。请注意我在上面的评论中所说的。我不相信 --log fatal 没有任何作用,至少在 linux 上没有。 但是重定向到 NULL 对我来说效果很好

"webdriver.gecko.driver": "/path-to-driver/geckodriver.sh

文件名:geckodriver.sh(可执行文件)

#! /bin/bash
echo " ARGS: " $@
geckodriver --log fatal "$@" > /dev/null 2>&1

【讨论】:

【参考方案4】:

要在控制台中看不到日志,您可以使用以下命令:

System.setProperty("webdriver.gecko.driver","src/main/resources/drivers/geckodriver.exe");
System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE,"true");
System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE,"/dev/null");

return new FirefoxDriver();

【讨论】:

如何将 Marionette 日志级别设置为“警告”? From seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/…, BROWSER_LOGFILE 定义了 Firefox 日志应该存储的文件的位置 --> 但是我没有看到 /dev/null 下的日志文件(这个文件不存在) /dev/null 是否将其保存到无处? @IceTea 结帐:en.wikipedia.org/wiki/Null_device /dev/null 丢弃一切,就像垃圾一样【参考方案5】:

就这样做

System.setProperty(FirefoxDriver.SystemProperty.DRIVER_USE_MARIONETTE,"true");
System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE,"/dev/null");
driver = new FirefoxDriver();

【讨论】:

如何将日志级别设置为warn【参考方案6】:

对于 selenium 3.14.0,这是有效的

System.setProperty(FirefoxDriver.SystemProperty.BROWSER_LOGFILE,"/dev/null");

【讨论】:

【参考方案7】:

我在 C# 中使用无头 Firefox 驱动程序。 要禁用 geckoDriver 日志控制台,下面的代码似乎对我有用:

FirefoxDriverService service = FirefoxDriverService.CreateDefaultService(Directory.GetCurrentDirectory());
service.HideCommandPromptWindow = true;
FirefoxOptions options = new FirefoxOptions();
options.AddArguments("--headless");
options.LogLevel = FirefoxDriverLogLevel.Fatal;
WebDriver = new FirefoxDriver(service, options);

【讨论】:

【参考方案8】:

这可能有点老套,但无需任何编码即可快速完成工作。鉴于您知道文件的确切位置并在 Linux 上运行代码,您只需 cd 进入该目录并

rm geckodriver.log
ln -s /dev/null geckodriver.log

【讨论】:

【参考方案9】:
profile.setPreference("webdriver.log.init", true);

有效,因为它欺骗了 webdriver 相信日志已经被初始化,所以它不会初始化它并且不会产生日志。

【讨论】:

以上是关于如何使用 Geckodriver 在 Selenium 中禁用 Firefox 登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何安装 Geckodriver?

如何通过 Python 使用 GeckoDriver 和 Firefox 使 Selenium 脚本无法检测?

如何防止 Selenium 3.0 (Geckodriver) 创建临时 Firefox 配置文件?

如何通过 System.setProperty() 启动多个版本的 Geckodriver

如何始终下载最新版本的 chromedriver 和 geckodriver?

如何使用 selenium 和 geckodriver 设置 python 3.6.2? [复制]