You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无GUI Linux机器上运行Selenium测试报错求助

无GUI Linux环境下运行Selenium Firefox测试的问题解决

问题场景

在无GUI的Linux机器上尝试通过pyvirtualdisplay运行无浏览器Selenium测试,执行代码后出现连接超时错误,geckodriver日志显示Xlib扩展RANDR缺失等相关异常。

原始测试代码

#!/usr/bin/env python

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()
browser.get('http://www.google.com')
print(browser.title)
browser.quit()

display.stop()

报错信息

Python Traceback

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    browser = webdriver.Firefox()
  File "/home/developer/python3.7/lib/python3.7/site-packages/selenium/webdriver/firefox/webdriver.py", line 201, in __init__
    super().__init__(command_executor=executor, options=options, keep_alive=True)
  File "/home/developer/python3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 286, in __init__
    self.start_session(capabilities, browser_profile)
  File "/home/developer/python3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 378, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/home/developer/python3.7/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
  File "/home/developer/python3.7/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: Connection refused (os error 111)

geckodriver日志

1683750630214   geckodriver     INFO    Listening on 127.0.0.1:56877
1683750630219   mozrunner::runner       INFO    Running command: MOZ_CRASHREPORTER="1" MOZ_CRASHREPORTER_NO_REPORT="1" MOZ_CRASHREPORTER_SHUTDOWN="1" MOZ_NO_REMOTE="1" "/opt ... te" "--remote-debugging-port" "49636" "--remote-allow-hosts" "localhost" "-no-remote" "-profile" "/tmp/rust_mozprofilezNqnc6"

(process:28229): GLib-CRITICAL **: g_slice_set_config: assertion 'sys_page_size == 0' failed
Xlib:  extension "RANDR" missing on display ":841919765".

(firefox:28229): GLib-GObject-WARNING **: Attempt to add property GnomeProgram::sm-connect after class was initialised

(firefox:28229): GLib-GObject-WARNING **: Attempt to add property GnomeProgram::show-crash-dialog after class was initialised

(firefox:28229): GLib-GObject-WARNING **: Attempt to add property GnomeProgram::display after class was initialised

(firefox:28229): GLib-GObject-WARNING **: Attempt to add property GnomeProgram::default-icon after class was initialised
*** e = [Exception... "Component returned failure code: 0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE) [nsIJSCID.getService]"  nsresult: "0x80570016 (NS_ERROR_XPC_GS_RETURNED_FAILURE)"  location: "JS frame :: chrome://browser/content/utilityOverlay.js :: getShellService :: line 376"  data: no]

解决方案

1. 安装必要的系统依赖

Firefox运行需要基础X11组件支持,执行对应系统的安装命令:

# Debian/Ubuntu 系列
sudo apt-get update
sudo apt-get install xvfb x11-xserver-utils libxrandr2 libxinerama1 libxcursor1 libxi6 libxtst6

# RHEL/CentOS 系列
sudo yum update
sudo yum install xorg-x11-server-Xvfb xorg-x11-utils libXrandr libXinerama libXcursor libXi libXtst

2. 使用Firefox原生无头模式(推荐)

新版Firefox支持原生无头模式,无需依赖pyvirtualdisplay,稳定性更高,修改代码如下:

#!/usr/bin/env python
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")  # 非root用户运行必须添加
options.add_argument("--disable-dev-shm-usage")  # 解决临时目录空间不足问题

browser = webdriver.Firefox(options=options)
browser.get('http://www.google.com')
print(browser.title)
browser.quit()

3. 若坚持使用pyvirtualdisplay,完善虚拟显示配置

如果必须使用pyvirtualdisplay,需要指定加载必要的X扩展,调整代码:

#!/usr/bin/env python
from pyvirtualdisplay import Display
from selenium import webdriver

# 加载RANDR等必要X扩展
display = Display(visible=0, size=(800, 600), extra_args=["-extension", "RANDR"])
display.start()

options = webdriver.FirefoxOptions()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

browser = webdriver.Firefox(options=options)
browser.get('http://www.google.com')
print(browser.title)
browser.quit()

display.stop()

4. 检查版本兼容性

确保geckodriver与Firefox版本匹配:

  • Firefox 115+ 对应 geckodriver 0.33+
  • 通过firefox --version和geckodriver --version查看版本,不匹配则下载对应版本的geckodriver并放入系统PATH目录。

5. 权限与环境配置

  • 非root用户运行时必须添加--no-sandbox参数
  • 确保当前用户对/tmp目录有读写权限

内容的提问来源于stack exchange,提问作者Jonathan Viana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:37:10