无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
相关产品推荐
相关产品推荐

