Selenium点击下载链接打开新标签而非弹窗,文件下载失败求助
问题解决:Selenium点击下载链接打开新标签页而非触发下载
核心问题分析
你的代码存在两处关键问题:
- Chrome浏览器下载配置不完整,未指定Excel文件的自动下载规则,且链接自带
target="_blank"属性导致点击后打开新标签页 - 依赖固定时长的
time.sleep()等待页面加载,稳定性差,容易出现元素未加载完成就执行操作的报错
修复后的完整代码
import logging import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.options import Options DOWNLOAD_URL = "https://www.nseindia.com/market-data/oi-spurts" DOWNLOAD_PATH = "/Users/myuser/Downloads/" class SeleniumDriver(object): def __init__(self, download_path=DOWNLOAD_PATH): logging.debug("Selenium DEBUG") self.__download_path = download_path def initiate_download(self): chrome_options = Options() chrome_options.add_argument('--no-sandbox') chrome_options.add_argument("--disable-popup-blocking") # 配置Chrome自动处理Excel下载,禁用弹窗 prefs = { "download.default_directory": self.__download_path, "download.prompt_for_download": False, "download.directory_upgrade": True, # 指定Excel文件MIME类型为流式下载,避免浏览器预览 "mime_types": { "application/vnd.ms-excel": "application/octet-stream", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": "application/octet-stream" } } chrome_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(options=chrome_options) try: driver.get(DOWNLOAD_URL) # 显式等待下载链接加载完成,替代不稳定的固定sleep download_link = WebDriverWait(driver, 20).until( EC.presence_of_element_located((By.CSS_SELECTOR, "div.xlsdownload a")) ) # 移除链接的target="_blank"属性,避免打开新标签页 driver.execute_script("arguments[0].removeAttribute('target');", download_link) # 触发下载 download_link.click() # 等待文件下载完成(可根据文件大小调整时长) time.sleep(10) finally: driver.quit() __slots__ = ( "__download_path", )
关键修复说明
- 完善下载配置:通过
prefs参数指定自动下载路径、禁用下载弹窗,并将Excel文件的MIME类型设置为流式下载,避免浏览器打开预览页面 - 替换等待方式:用
WebDriverWait显式等待元素加载,解决固定time.sleep()导致的元素定位失败问题 - 移除新标签页属性:通过JS脚本删除链接的
target="_blank",点击时直接触发下载而非打开新标签页
更高效的替代方案
如果无需模拟完整浏览器交互,直接提取下载链接用requests下载,速度更快且更稳定:
import requests from bs4 import BeautifulSoup DOWNLOAD_URL = "https://www.nseindia.com/market-data/oi-spurts" DOWNLOAD_PATH = "/Users/myuser/Downloads/oi_spurts.xls" headers = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } # 获取页面并提取下载链接 response = requests.get(DOWNLOAD_URL, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') download_href = soup.select_one("div.xlsdownload a")['href'] full_download_url = f"https://www.nseindia.com{download_href}" # 下载文件 file_response = requests.get(full_download_url, headers=headers) with open(DOWNLOAD_PATH, 'wb') as f: f.write(file_response.content)
内容的提问来源于stack exchange,提问作者name_masked
相关产品推荐
相关产品推荐

