Python2.7+Selenium3.8+Firefox57自动下载PDF仍弹出保存窗口问题
解决Firefox 57自动下载PDF弹窗问题
嘿,我来帮你排查这个自动下载PDF的弹窗问题!结合你的环境和代码,我梳理了几个关键问题和对应的修复方案:
1. 变量赋值顺序搞反了
看你的代码,download_to_location是在设置browser.download.dir之后才赋值的——这会导致你的下载路径根本没生效!必须先定义好路径,再把它配置到profile里。
2. MIME类型不够完整
很多网站返回的PDF文件,MIME类型不一定只有application/pdf,常见的还有application/x-pdf、binary/octet-stream这些类型。如果没把它们加进白名单,Firefox还是会触发保存弹窗。
3. 关于Marionette的疑问
不用额外安装配置Marionette啦!Selenium 3.x搭配Firefox 57+时,已经默认启用Marionette驱动,只要你正确配置了geckodriver(注意Firefox 57对应geckodriver v0.19.0左右的版本,版本兼容很重要),就没问题。
4. 现有配置文件可能冲突
如果你指定的是已经手动修改过的Firefox配置文件,里面的原有设置可能会覆盖你代码里的preference。要么确保现有profile的设置和代码完全一致,要么直接用临时profile(不指定现有路径)更稳妥。
修正后的代码示例
from selenium import webdriver # 先定义下载路径,替换成你的实际文件夹路径 download_to_location = "/PATH_TO_FOLDER_WITHIN_DIRECTORY" # 建议用临时profile,避免和现有配置冲突;如果要继续用现有profile,注释掉下面一行,打开下一行 profile = webdriver.FirefoxProfile() # profile = webdriver.FirefoxProfile("/Users/USERNAME/Library/Application Support/Firefox/Profiles/NAME") # 完整的下载偏好设置 profile.set_preference('browser.download.folderList', 2) # 自定义下载位置 profile.set_preference('browser.download.manager.showWhenStarting', False) # 隐藏下载管理器弹窗 # 添加所有可能的PDF MIME类型 profile.set_preference("browser.helperApps.neverAsk.openFile", "application/pdf,application/x-pdf,binary/octet-stream") profile.set_preference('browser.helperApps.neverAsk.saveToDisk', "application/pdf,application/x-pdf,binary/octet-stream") profile.set_preference('browser.download.dir', download_to_location) # 禁用内置PDF预览,避免触发预览弹窗 profile.set_preference("pdfjs.disabled", True) profile.set_preference("plugin.scan.plid.all", False) profile.set_preference("plugin.scan.Acrobat", "99.0") # 初始化浏览器,若geckodriver没在环境变量里,可加executable_path参数指定路径 browser = webdriver.Firefox(firefox_profile=profile) for race in races: browser.get(race) try: # 把列表推导式改成循环,方便单独处理每个元素的异常 for lxp in download_from_xpaths: browser.find_element_by_xpath(lxp).click() except Exception as e: # 捕获具体异常,方便排查问题 print(f"点击下载按钮出错: {e}")
额外注意事项
- 确保geckodriver的路径在系统环境变量里,或者在初始化Firefox时通过
executable_path="/path/to/geckodriver"指定路径。 - 如果还是有弹窗,可以打开Firefox的
about:config页面,搜索browser.helperApps.neverAsk.saveToDisk,看看实际生效的MIME类型,对比代码里的是否遗漏。
内容的提问来源于stack exchange,提问作者doyz
相关产品推荐
相关产品推荐

