Chrome 106.0.5249.62版本下Selenium无头模式下载脚本失效问题排查
解决Chrome无头模式下Selenium无法下载文件的问题
让我帮你拆解下脚本里的问题,以及如何修复让无头模式下的文件下载正常工作:
1. 最明显的小错误:没有执行close方法
你代码里写的是driver.close而不是driver.close()——少了括号意味着你只是引用了这个方法,并没有真正调用它。不过这不是下载失败的核心原因,但必须修正,否则浏览器会话会一直残留。
2. 无头模式的核心配置缺失
Chrome无头模式默认不会自动处理下载,你必须手动配置下载目录并禁用下载提示弹窗。需要添加以下配置到你的Options里:
# 设置你的下载路径,Windows路径用原始字符串避免转义问题 download_path = r"C:\Your\Actual\Download\Folder" prefs = { "download.default_directory": download_path, "download.prompt_for_download": False, # 禁用下载提示 "download.directory_upgrade": True, "safebrowsing.enabled": True # 避免安全拦截 } options.add_experimental_option("prefs", prefs)
另外,针对无头模式,建议额外添加两个参数避免权限和资源问题:
options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox")
3. 下载触发逻辑的问题
你连续两次调用driver.get("https://domain.tld/download"),可能页面还没完成第一次下载就触发了第二次,导致请求被中断。建议在每次触发下载后添加足够的等待时间,或者如果是通过按钮触发下载,最好用click()方法而不是直接get(如果页面有下载按钮的话)。
4. Selenium语法的兼容性问题
你用的find_element_by_name是Selenium 3的旧语法,如果你的Selenium版本是4.x,建议更新为新语法(需要导入By类):
from selenium.webdriver.common.by import By # 替换旧写法 driver.find_element(By.NAME, "usernamefld").send_keys("xxxxx")
虽然这个不直接影响下载,但能避免后续版本兼容问题。
修正后的完整脚本
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By options = Options() options.add_argument("--disable-extensions") options.add_argument("--disable-gpu") options.add_argument("--headless") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") # 配置下载参数 download_path = r"C:\Your\Download\Directory" # 替换成你的实际下载目录 prefs = { "download.default_directory": download_path, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True } options.add_experimental_option("prefs", prefs) # 初始化驱动(Selenium 4+用options参数,不再用chrome_options) driver = webdriver.Chrome('C:/chromedriver/chromedriver.exe', options=options) driver.get("https://domain.tld") driver.implicitly_wait(20) # 登录操作 driver.find_element(By.NAME, "usernamefld").send_keys("xxxxx") time.sleep(0.2) driver.find_element(By.NAME, "passwordfld").send_keys("xxxxx") time.sleep(0.6) driver.find_element(By.NAME, 'login').click() # 等待登录跳转完成,避免直接访问下载页面时未登录 time.sleep(3) # 第一次下载并等待完成 driver.get("https://domain.tld/download") time.sleep(5) # 根据文件大小调整等待时间 # 第二次下载并等待完成 driver.get("https://domain.tld/download") time.sleep(5) # 正确关闭浏览器会话 driver.close() driver.quit()
额外注意事项
- 确保你设置的下载目录已经存在,否则Chrome会默认下载到临时文件夹。
- 如果下载的是大文件,建议用更智能的等待方式(比如监控下载目录中的文件是否完成),而不是固定的
time.sleep。 - 确认你的chromedriver版本和Chrome 106完全匹配,版本不兼容会导致各种异常。
内容的提问来源于stack exchange,提问作者hexagonprimarch
相关产品推荐
相关产品推荐

