Selenium Firefox偏好已修改但未生效,PDF自动下载失败求助
我之前也碰到过一模一样的情况,结合你的测试环境(Selenium 3.12.0 + Firefox 59/60 + GeckoDriver 0.19-0.21),这个问题大概率是GeckoDriver早期版本的配置加载时序bug导致的——虽然你在FirefoxOptions里设置了所有偏好,但GeckoDriver初始化浏览器会话时,部分下载相关的配置并没有被正确注入到当前会话中,而手动重新应用后,这些偏好才真正生效。另外,系统目录的权限问题也可能是诱因,下面给你几个针对性的解决方案:
1. 启动浏览器后强制刷新下载偏好
在driver初始化完成后,不要立刻执行下载操作,用Firefox的内置JavaScript API重新设置关键偏好,确保会话中的配置是正确的:
from selenium import webdriver from selenium.webdriver.firefox.options import Options # 初始化FirefoxOptions options = Options() # 原有配置 options.set_preference("browser.download.dir", "C:\\Windows\\temp") options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.manager.showWhenStarting", False) options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") options.set_preference("pdfjs.disabled", True) options.set_preference("plugin.scan.plid.all", False) options.set_preference("plugin.scan.Acrobat", "99.0") # 启动driver driver = webdriver.Firefox(firefox_options=options) # 启动后重新应用核心下载偏好 driver.execute_script(""" Services.prefs.setIntPref("browser.download.folderList", 2); Services.prefs.setStringPref("browser.download.dir", "C:\\Windows\\temp"); Services.prefs.setBoolPref("pdfjs.disabled", true); """) # 执行下载操作 driver.get("你的下载页面URL") # 触发下载的代码...
2. 升级GeckoDriver版本
你使用的GeckoDriver 0.19-0.21版本和Firefox 59/60配合时,确实存在一些配置传递的小bug。建议升级到GeckoDriver 0.23.0,这个版本专门修复了Firefox 60+系列的配置同步问题,能很大概率解决初始化时偏好不生效的问题。
3. 排查系统目录的权限问题
C:\Windows\temp是系统敏感目录,自动化进程可能没有足够的写入权限,导致下载失败。你可以先换成一个非系统目录(比如C:\Users\你的用户名\Downloads\test_download)测试,如果换目录后下载正常,那需要给运行自动化的用户赋予C:\Windows\temp的写入权限。
4. 启用日志排查细节
启动GeckoDriver时开启日志,能帮你定位具体的失败原因:
driver = webdriver.Firefox(firefox_options=options, service_log_path='geckodriver.log')
查看日志中的Download相关条目,会明确提示是权限不足、路径无效还是偏好未生效的问题。
内容的提问来源于stack exchange,提问作者Anthony Machniak

