使用Selenium ChromeDriver点击链接无法下载PDF的解决方案
问题
通过Selenium编写自动化脚本下载目标页面的PDF文件时,脚本可以正常打开页面、触发下载按钮点击动作,但无法完成PDF的实际落盘下载,原代码如下:
print("Helllo Pratik") from selenium import webdriver options = webdriver.ChromeOptions() options.add_experimental_option('prefs', { "download.default_directory": "D:\\pdf_download", "download.prompt_for_download": False, "download.directory_upgrade": True, "plugins.always_open_pdf_externally": True }) driver = webdriver.Chrome('D:\driver_chrome\chromedriver.exe',options=options) driver.get("Axis银行存款利率目标页面") element=driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div/div[2]/a/div/div/span") element.click() driver.quit()
故障原因
- 核心问题:点击下载按钮后立刻执行
driver.quit(),浏览器进程被直接销毁,后台下载请求还没完成握手、文件还没开始写入就被强制终止 - 定位逻辑脆弱:直接复制浏览器开发者工具生成的绝对路径Xpath,容错性极差,页面只要加个广告位、调整一层DOM层级就会定位到错误元素,点击动作根本没命中真实的下载触发节点
- API兼容问题:高版本Selenium已经废弃
find_element_by_xpath这类旧接口,运行时会抛隐式异常,很多人没看控制台日志就误以为点击成功 - 浏览器策略拦截:Chrome配置缺少下载安全相关参数,银行域名下的内嵌跨域PDF资源,会被默认安全下载策略拦截
- 路径转义错误:Windows本地路径
D:\driver_chrome\chromedriver.exe里的\d会被Python识别为转义字符,可能导致驱动加载异常
修复后可直接运行的代码
print("Hello Pratik") # 修正了原代码里Helllo的拼写错误,不影响功能可直接忽略 import time import os from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service # 自动创建下载目录,避免路径不存在导致下载失败 download_dir = "D:\\pdf_download" if not os.path.exists(download_dir): os.makedirs(download_dir) options = webdriver.ChromeOptions() options.add_experimental_option('prefs', { "download.default_directory": download_dir, "download.prompt_for_download": False, "download.directory_upgrade": True, "plugins.always_open_pdf_externally": True, "safebrowsing.enabled": True # 关闭安全下载拦截,避免PDF被默认拦截 }) # 适配高版本Selenium的驱动加载方式,支持Chrome 115+版本 s = Service('D:\\driver_chrome\\chromedriver.exe') driver = webdriver.Chrome(service=s, options=options) driver.implicitly_wait(10) # 加全局隐式等待,等页面元素加载完成再操作 driver.get("Axis银行存款利率目标页面") # 替换脆弱的绝对路径Xpath,用按钮文本+上级节点特征定位,稳定性更高 element = driver.find_element(By.XPATH, '//span[contains(text(), "Download")]/ancestor::a') element.click() # 预留下载时间,等文件写入完成再关浏览器 time.sleep(15) driver.quit()
注意事项
- 等待时长按自己网速调整就行,网速快设10秒够,慢就把sleep的数值调大,核心是别刚点完下载就关浏览器,下到一半进程被掐断肯定存不下来
- 要是还是定位不到下载按钮,就自己开F12找下载按钮对应的
<a>标签,抓它的class、按钮文本这类稳定特征写定位表达式,别用从html根节点开始数div的绝对Xpath,页面随便改个版就失效 - 提前把本地Chrome驱动的版本和你装的Chrome浏览器版本对齐,版本差太多会出各种奇奇怪怪的兼容性问题
- 确保你写的下载目录、驱动存放路径有读写权限,别扔到C盘系统保护目录里,容易被权限卡下载
内容的提问来源于stack exchange,提问作者pratik patil
相关产品推荐
相关产品推荐

