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
(预计会)。可以使用ipcs
或lsof
实用程序列出打开的共享内存对象/接口。
【讨论】:
【参考方案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 机器上崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Selenium 的无头 Firefox 中使用 --screenshot 和 python
Selenium Firefox Python 在无头模式下运行超时初始化驱动程序