PyCharm运行Selenium 4 Firefox代码报ConnectionRefusedError问题
问题根因分析
触发告警与报错的直接原因
DeprecationWarning: firefox_profile已废弃告警:Selenium 4.x版本调整了webdriver.Firefox()的入参签名,第一个位置参数不再是geckodriver路径,而是firefox_profile。直接将驱动路径作为第一个位置参数传入时,代码会把路径字符串误识别为传入的firefox_profile配置,因此触发废弃提示。ConnectionRefusedError与后续的MaxRetryError:错误传参触发的兼容兜底逻辑,在PyCharm的运行沙箱环境下无法正常执行,加上PyCharm默认启动配置不会完全继承系统终端的环境变量(尤其是通过桌面快捷方式启动的Linux版PyCharm,不会加载shell配置文件里的PATH、DISPLAY等变量),导致geckodriver要么找不到Firefox二进制文件,要么无法连接图形服务启动浏览器进程,最终驱动侧轮询本地连接端口时被拒绝。- 其他编辑器、系统终端运行正常的核心原因:这些环境要么直接加载了完整的系统环境变量,要么没有对Selenium的旧版传参兼容逻辑做拦截,兜底流程可以正常走完。
匹配环境信息
- Python 3.10.4
- Selenium 4.3.0
- Firefox 102.0 (64-bit)
- Gecko Driver: geckodriver-v0.31.0-linux64
- 测试代码逻辑:导入selenium webdriver模块,指定geckodriver路径初始化Firefox驱动,访问https://www.python.org/ 输出页面标题后退出驱动
解决步骤
按顺序操作即可完全修复问题:
1. 替换为Selenium 4.x标准初始化写法,消除传参告警
废弃直接传驱动路径的旧写法,改用Service+Options的标准传参方式,从根源避免参数识别错误,参考代码:
from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options # 替换为当前设备上geckodriver的实际绝对路径 GECKO_DRIVER_PATH = "/path/to/your/geckodriver" firefox_service = Service(executable_path=GECKO_DRIVER_PATH) firefox_options = Options() # 无头模式等自定义启动参数可通过firefox_options.add_argument()添加 driver = webdriver.Firefox(service=firefox_service, options=firefox_options) driver.get("https://www.python.org/") print(driver.title) driver.quit()
注意:该标准写法适配Selenium 4.x全版本,稳定性远高于依赖兼容逻辑的旧写法,无需为了适配旧代码降级Selenium版本。
2. 调整PyCharm运行配置,解决环境变量缺失问题
- 打开PyCharm右上角运行配置菜单,选择
Edit Configurations,找到当前运行的脚本配置项:- 勾选
Emulate terminal in output console选项,让运行控制台模拟系统终端环境 - 确认选择的Python解释器和系统终端中能正常运行代码的解释器完全一致,避免虚拟环境依赖缺失
- 勾选
- 如果是Linux环境通过桌面快捷方式启动PyCharm,需要补充图形服务变量:
- 在系统终端执行
echo $DISPLAY拿到返回值(通常为:0) - 回到运行配置页的
Environment variables项,新增变量DISPLAY,值为刚才终端拿到的返回值,保存配置
- 在系统终端执行
- 如果上述配置后仍报错,直接关闭当前PyCharm,从系统终端执行
pycharm.sh命令启动PyCharm即可,该启动方式会完整加载所有系统环境变量,不会出现变量缺失问题。
内容的提问来源于stack exchange,提问作者Kimi Lao
相关产品推荐
相关产品推荐

