You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 22:16:01