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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 17:42:46