无法在无头模式下运行 Firefox

Posted

技术标签:

【中文标题】无法在无头模式下运行 Firefox【英文标题】:Unable to run Firefox in headless mode 【发布时间】:2019-08-12 14:11:00 【问题描述】:

我正在尝试使用 Xvfb 在 Firefox 中以无头模式运行 Python + Selenium 脚本,但出现错误。没有太多可用于 Xvfb 解决问题的文档或指南,因此请在此处寻求帮助。

环境信息: 操作系统:CentOS 6.5 版(最小安装) Xvfb:xorg-x11-server-Xvfb-1.15.0 火狐:52.8.0 壁虎司机:0.24.0 Python:3.6.7

后续步骤:

完成上述要求的安装后。我启动了一个虚拟显示器:

$Xvfb :1 -ac &

另外,我尝试过:

$Xvfb :1 -screen 0 1024x768x24 -extension RANDR &

然后我设置显示变量:

export DISPLAY=:1

当我尝试在 Python 控制台中启动 Selenium WebDriver 时,我收到错误 Connection denied

> from selenium import webdriver
> from pyvirtualdisplay import Display
> display = Display(visible=0, size=(800, 600))
> display.start()
> driver = webdriver.Firefox()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.6/site-packages/selenium/webdriver/firefox/webdriver.py", line 174, in __init__
keep_alive=True)
File "/usr/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
self.start_session(capabilities, browser_profile)
File "/usr/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
response = self.execute(Command.NEW_SESSION, parameters)
File "/usr/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "/usr/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: connection refused

任何帮助或建议将不胜感激。

【问题讨论】:

这对大多数人来说可能很明显,但是这个文件"&lt;stdin&gt;" 回溯指的是什么?此外,您需要为无头浏览器设置firefoxCapabilitiesfirefoxProfile @C.Peck "" 错误应该从 Selenium webdriver 抛出,但不太清楚为什么它会抛出这样的错误。您能否详细解释一下如何设置 firefox 功能和配置文件,或者请提供链接以供参考 我将首先警告我对 xvfb 完全不熟悉,而且我从未尝试过从 python 命令行运行 selenium(仅通过调用脚本)。我将添加一个可以为您解决此问题的脚本的答案。 在讨论How to make firefox headless programmatically in Selenium with python? 中查看@MortenB cmets。 MOZ_HEADLESS=1 python manage.py test 成功了!不再需要 xvfb-run 了!!! @BillClintonJ,进展如何?你试过我的回答吗?谢谢。 【参考方案1】:

xvfb 周围有一个名为PyVirtualDisplay 的包装器,它似乎是为这个精确的解决方案而设计的。如果您只是简单地执行pip install pyvirtualdisplay,则以下脚本应该运行一个无头 Firefox 窗口:

from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(800, 600))
display.start()

# now Firefox will run in a virtual display. 
# you will not see the browser.
browser = webdriver.Firefox(executable_path="/Users/username/Location/geckodriver")
browser.get('http://www.google.com')
print browser.title
browser.quit()

display.stop()

【讨论】:

使用 pyvirtualdisplay 初始化显示成功,但在启动 webdriver 时再次出现同样的错误。 你的意思是在这条线上browser = webdriver.Firefox() 是的,正确,在执行该行时遇到了与我在问题中提供的相同的错误。 请添加您的问题,而不是评论。 可能你还没有设置geckodriver的可执行路径?您可以使用 webdriver.Firefox(executable_path="/Users/username/Location/geckodriver");我将其编辑到我的问题中。

以上是关于无法在无头模式下运行 Firefox的主要内容,如果未能解决你的问题,请参考以下文章

Selenium webdriver 无法在 chrome 无头模式下定位元素

有没有办法在无头模式下运行 QtWebEngine

在无头模式下运行 Chrome

在无头模式下使用 Firefox 改进 scrapy 和 selenium

Nightwatch测试在Headless chrome模式下找不到元素

JODConverter 出现问题并在无头模式下运行 LibreOffice