Python下Selenium可正常识别Chromedriver,却无法识别已配置的Geckodriver报路径错误
报错根源定位
你遇到的所有问题本质是Chrome和Firefox的Selenium驱动初始化参数逻辑不一致,你把Chrome的传参习惯直接套用到Firefox上,出现了参数错位:
- 对Chrome驱动来说,
webdriver.Chrome(r'c:\chromedriver\chromedriver.exe')能正常运行,是因为Chrome构造函数的第一个位置参数,从旧版本到Selenium 4+,始终对应接收executable_path(chromedriver可执行文件路径)的入参 - 对Firefox驱动来说,不管是Selenium 3还是Selenium 4,
webdriver.Firefox()的第一个位置参数,对应的都是firefox_profile(Firefox浏览器用户配置目录)的入参,要求传入的是文件夹路径。你把geckodriver.exe的文件路径直接传在第一个位置,Selenium会把这个文件路径当成待解析的配置目录去校验,发现传入路径是个文件、不是目录,自然抛出NotADirectoryError——这个报错和你geckodriver文件是否存在、是否能被pathlib识别完全没有关系。
至于之前把geckodriver加到系统Path后还是提示找不到的问题,通常是两个常见原因:
- 配置完系统Path后没有完全重启Python运行环境、IDE:环境变量是进程启动时一次性加载的,运行中途修改的系统Path不会被已经启动的Python进程读取到
- geckodriver版本和本地安装的Firefox浏览器版本不匹配,驱动无法正常被Selenium拉起
可落地的解决步骤
- 正确指定geckodriver路径的写法(适配全版本Selenium)
不要把geckodriver路径当位置参数传给webdriver.Firefox(),要通过显式声明的Service类传入驱动路径,正确可运行的代码示例:
from selenium import webdriver from selenium.webdriver.firefox.service import Service as FirefoxService # 初始化驱动服务,指定geckodriver的绝对路径 firefox_driver_service = FirefoxService(executable_path=r'c:\geckodriver\geckodriver.exe') # 初始化浏览器实例时传入配置好的服务 browser = webdriver.Firefox(service=firefox_driver_service)
- 校验Path配置是否真的生效
如果不想每次代码里都写驱动绝对路径,配置完系统Path后必须做两步校验:
- 完全关闭当前运行的Python解释器、IDE(包括后台残留的进程),重新启动后再运行代码
- 打开独立的Windows CMD终端,直接输入
geckodriver --version,能正常打印出版本号才代表Path配置生效;如果CMD中提示“不是内部或外部命令”,说明你配置的Path路径不对,或者geckodriver被放在了带中文、空格的特殊路径文件夹里
- 版本兼容校验
无论用哪种方式指定驱动路径,都要保证geckodriver大版本和本地安装的Firefox浏览器版本匹配:比如本地安装Firefox 115以上版本,就不能使用2022年之前发布的旧版geckodriver,不然就算路径完全正确也会启动失败。
内容的提问来源于stack exchange,提问作者Matthew Bendyna
相关产品推荐
相关产品推荐

