Firefox 无头在无头 redhat linux 机器上崩溃

Posted

技术标签:

【中文标题】Firefox 无头在无头 redhat linux 机器上崩溃【英文标题】:Firefox headless crashing on headless redhat linux machine 【发布时间】:2020-05-06 19:02:42 【问题描述】:

我正在尝试在使用 firefox headless 的无头 redhat linux 构建机器上运行 selenium 测试。我创建驱动程序的方法如下:

private static WebDriver createFireFoxDriver() 
    WebDriverManager.firefoxdriver()
            .setup();

    FirefoxOptions options = new FirefoxOptions();
    options.setHeadless(true);
    options.addPreference("browser.download.folderList", 2);
    options.addPreference("browser.download.dir", ABSOLUTE_PATH_TO_FOLDER);
    options.addPreference("browser.download.manager.showWhenStarting", false);
    options.addPreference("browser.helperApps.neverAsk.saveToDisk", "application/json");

    return new FirefoxDriver(options);

我在日志文件中看到的错误如下:

[Parent 65433, Gecko_IOThread] WARNING: pipe error (82): Connection reset by peer: file /builds/worker/workspace/build/src/ipc/chromium/src/chrome/common/ipc_channel_posix.cc, line 358
[Parent 65433, Gecko_IOThread] WARNING: pipe error: Broken pipe: file /builds/worker/workspace/build/src/ipc/chromium/src/chrome/common/ipc_channel_posix.cc, line 727

###!!! [Parent][MessageChannel] Error: (msgtype=0x1E0074,name=PBrowser::Msg_StopIMEStateManagement) Channel error: cannot send/recv


###!!! [Parent][MessageChannel] Error: (msgtype=0x1E008F,name=PBrowser::Msg_Destroy) Channel error: cannot send/recv

1579539977190   Marionette  TRACE   [11] Frame script loaded
1579539977191   Marionette  TRACE   [11] Frame script registered
A content process crashed and MOZ_CRASHREPORTER_SHUTDOWN is set, shutting down

我检查了我们在机器上安装了正确版本的 gtk、glib、pango、xorg 和 libstdc++。有没有人在使用无头构建机器之前遇到过这个问题?

火狐版本:68.4.1 |硒版:3.141.59 | Geckdriver 版本:0.26.0

深入研究导致崩溃的测试。就在崩溃发生之前,测试正在单击 SwaggerUI 的 API 尝试功能。网站上没有其他操作会导致此崩溃发生。

【问题讨论】:

【参考方案1】:

找到了一个有效的解决方案以及根本原因。

在 linux docker 容器中运行 firefox 时,/dev/shm 必须至少有 2gb。我的构建机器配置不满足这个要求。将内存量增加到超过 2gb 的值立即解决了我的问题。

这种行为的原因是 Firefox 使用 POSIX 共享内存,它在 Linux 上(根据 shm_open(3) 手册页)基于安装在 /dev/shm 上的 tmpfs(预计会)。可以使用ipcslsof 实用程序列出打开的共享内存对象/接口。

【讨论】:

【参考方案2】:

关于Which Firefox browser versions supported for given Geckodriver version? 中的讨论,我在您使用的二进制文件中没有看到任何版本不匹配。

唯一的嫌疑人是FirefoxOptions 类的setHeadless() 方法,根据文档如下:

setHeadless(boolean headless)

如此有效,您的代码块将是:

FirefoxOptions options = new FirefoxOptions();
options.setHeadless(true)

更新

另外还有

browser.download.folderList browser.download.dir browser.download.manager.showWhenStarting browser.helperApps.neverAsk.saveToDisk

需要通过setPreference()方法使用FirefoxProfile()的实例进行配置,如下:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.download.folderList", 2);
profile.setPreference("browser.download.dir", ABSOLUTE_PATH_TO_FOLDER);
profile.setPreference("browser.download.manager.showWhenStarting", false);
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/json");

您可以在How to auto-download through Firefox browser using FirefoxProfile?找到相关的详细讨论

【讨论】:

是的。 setHeadless(Boolean) 在浏览器的初始化中添加“--headless”参数 @st0ve 设置options.setHeadless(true) 后是否看到任何错误? 我已经编辑了我的原始文本。 HEADLESS 是一个布尔值,在构建机器上始终为真。所以options.setHeadless(true) == options.setHeadless(HEADLESS) @st0ve 查看更新后的答案并告诉我状态。 我刚试了一下。仍然看到问题:(。我深入研究了围绕崩溃的测试并将其添加到我的原始帖子中

以上是关于Firefox 无头在无头 redhat linux 机器上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

无法在无头模式下运行 Firefox

如何在 Xvfb 上运行无头 Firefox

如何在 Selenium 的无头 Firefox 中使用 --screenshot 和 python

Selenium Firefox Python 在无头模式下运行超时初始化驱动程序

使用 selenium 在无头模式下运行 Firefox 错误:“选项”对象没有属性“二进制”

Chromium 无头页面无响应但适用于 Firefox