Selenium(Python+Chrome)无法下载无独立URL的PDF问题求助
处理Chrome PDF Viewer场景下的Selenium PDF下载问题
问题场景
- 操作流程:
- 导航至目标页面
- 点击页面上的PDF下载按钮
- 页面通过JavaScript打开新标签页,用Chrome PDF Viewer渲染PDF,但PDF的URL始终固定,不指向实际文件,无法直接用requests下载
- 手动点击PDF Viewer内的下载按钮可以完成下载,但Selenium无法自动触发这个操作
已尝试的无效配置
if download_files: download_dir = os.getcwd() print(download_dir) prefs['download.default_directory'] = download_dir prefs['download.prompt_for_download'] = False prefs['download.directory_upgrade'] = True prefs['plugins.always_open_pdf_externally'] = True prefs['safebrowsing_for_trusted_sources_enabled'] = False prefs['safebrowsing.enabled'] = False # prefs['plugins.plugins_list'] = [{"enabled": False, "name": "Chrome PDF Viewer"}] # prefs['download.extensions_to_open'] = "applications/pdf" prefs['profile.default_content_settings'] = {"images": 2} print(prefs) chrome_options.add_experimental_option("prefs", prefs)
可行解决方案
方案一:直接操作Chrome PDF Viewer的下载按钮
新标签页打开PDF后,切换到该标签页,定位并点击Viewer内的下载按钮:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 点击页面上的PDF下载按钮 pdf_page_btn = driver.find_element(By.XPATH, "//替换为页面下载按钮的XPATH") pdf_page_btn.click() # 切换到新打开的PDF标签页 driver.switch_to.window(driver.window_handles[-1]) # 等待PDF Viewer加载完成,定位下载按钮(根据实际元素调整选择器) WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//button[@aria-label='下载']")) ).click() # 切换回原标签页继续后续操作 driver.switch_to.window(driver.window_handles[0])
方案二:调整Chrome配置,强制下载PDF
修改prefs配置,确保禁用Chrome PDF Viewer并强制外部打开(即直接下载):
import os from selenium import webdriver download_dir = os.getcwd() chrome_options = webdriver.ChromeOptions() prefs = { "download.default_directory": download_dir, "download.prompt_for_download": False, "download.directory_upgrade": True, "plugins.always_open_pdf_externally": True, "plugins.plugins_disabled": ["Chrome PDF Viewer"], "safebrowsing.enabled": False, "safebrowsing_for_trusted_sources_enabled": False } # 如果不需要禁用图片,可移除下面这行 prefs['profile.default_content_settings'] = {"images": 2} chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(options=chrome_options)
注意:确保plugins.plugins_disabled正确禁用Chrome PDF Viewer,避免和其他冲突配置共存。
方案三:读取PDF的Blob URL下载
如果PDF是通过Blob渲染的,可通过执行JS获取Blob地址,再用requests下载(需带上会话Cookie):
import requests # 执行JS获取PDF的Blob URL blob_url = driver.execute_script("return window.PDFViewerApplication.url;") # 提取当前会话的Cookie,确保请求权限 cookies = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()} # 下载PDF response = requests.get(blob_url, cookies=cookies) with open("target.pdf", "wb") as f: f.write(response.content)
内容的提问来源于stack exchange,提问作者qoob
相关产品推荐
相关产品推荐

