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

如何使用Selenium/Python下载Chrome中无直接链接的预览PDF文件

如何使用Selenium/Python下载Chrome中无直接链接的预览PDF文件

我太懂你现在的头疼了——一步步用Selenium操作到PDF预览窗口,结果发现既没有可点击的下载链接,也找不到明显的下载按钮,完全卡在这里了。别慌,咱们结合你的场景来解决这个问题,这里有几个实用的办法:

方法一:提前配置Chrome,让PDF直接下载而非预览

这是最省心的思路,从根源上跳过预览窗口,让浏览器直接把PDF存到你指定的文件夹。你只需要在初始化ChromeDriver的时候加几个配置选项:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import ChromeService

# 配置Chrome下载偏好
chrome_options = Options()
chrome_options.add_experimental_option("prefs", {
    "download.default_directory": "你的本地下载路径",  # 替换成你想存PDF的文件夹,比如"C:/ZetaGas_PDFs"
    "plugins.always_open_pdf_externally": True,  # 强制PDF直接下载,不打开预览
    "download.prompt_for_download": False,  # 不弹出下载确认框
    "download.directory_upgrade": True
})

# 初始化带配置的ChromeDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_options)

这样改完之后,你点击「MAYOREO」按钮时,浏览器会直接把PDF下载到你指定的目录,不用再处理烦人的预览窗口了。记得把路径换成你自己的本地文件夹哦。

方法二:在PDF预览窗口里触发下载

如果没法提前配置浏览器,咱们就直接对预览窗口下手。Chrome的内嵌PDF预览其实有隐藏的下载按钮,或者可以用JavaScript强制触发下载动作。结合你的代码,修改accion_despues_presionar函数就行:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def accion_despues_presionar(elemento):
    time.sleep(1)
    mayoreo=driver.find_element(By.XPATH,'//*[@id="printFormato2"]')
    time.sleep(1)
    mayoreo.click()
    time.sleep(2)  # 给预览窗口留足加载时间

    # 先试试定位Chrome预览的下载按钮
    try:
        # Chrome预览的下载按钮一般有aria-label="下载"这个属性
        download_btn = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[aria-label="下载"]'))
        )
        download_btn.click()
    except:
        # 如果按钮定位不到,用JavaScript触发下载
        driver.execute_script("document.querySelector('embed').contentWindow.print();")
        # 或者另一种JS写法:直接打开PDF的源地址
        # driver.execute_script("window.open(document.querySelector('embed').src);")
    
    time.sleep(2)  # 等下载完成再关闭窗口
    cerrar=driver.find_element(By.XPATH,'//*[@id="modalPdfPrint"]/div/div/div[1]/button')
    cerrar.click()

注意:如果PDF是在iframe里加载的,得先切换到iframe再操作:

# 切换到PDF所在的iframe
pdf_iframe = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.TAG_NAME, 'iframe'))
)
driver.switch_to.frame(pdf_iframe)

# 在这里执行上面的下载操作(按钮定位或JS脚本)

# 操作完切回主页面
driver.switch_to.default_content()

方法三:抓包获取PDF真实地址(更高效)

有时候预览窗口里的PDF其实是有真实URL的,只是没显示在页面上。你可以打开Chrome开发者工具(F12),切换到「网络」标签,点击「MAYOREO」按钮后,找类型为「document」或「pdf」的请求,就能拿到PDF的真实链接。之后用Python的requests库直接下载,比Selenium操作更稳定:

import requests

# 把抓包拿到的PDF地址填这里
pdf_url = "http://extranet.zetagas.pe/xxx/xxx.pdf"
# 带上登录后的Cookie,不然可能没权限访问
cookies = driver.get_cookies()
session = requests.Session()
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

# 下载保存PDF
response = session.get(pdf_url)
with open("zetagas_devolucion.pdf", "wb") as f:
    f.write(response.content)

你可以先试方法一,这是最直接的解决方案。如果不行再试方法二或三,应该能搞定你的问题~

备注:内容来源于stack exchange,提问作者Juan Jose Collantes Antezana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 07:58:08