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

如何在文件下载完成后自动关闭Selenium控制的Firefox浏览器

Selenium Firefox下载文件时driver.get()卡住无法自动关闭浏览器问题

问题描述

使用Selenium打开网页自动下载数据文件,下载功能可正常运行,但代码卡在driver.get(s)行,无法自动关闭浏览器,需手动操作;调整FirefoxProfile相关参数后仍未解决。相关代码如下:

import lzma
import struct
import pandas as pd

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def download():
    profile = webdriver.FirefoxProfile()
    profile.set_preference("browser.download.folderList", 2)
    profile.set_preference("browser.helperApps.alwaysAsk.force", False)
    profile.set_preference("browser.download.manager.showWhenStarting", False)
    profile.set_preference("browser.download.manager.closeWhenDone", True)
    profile.set_preference("browser.download.manager.showAlertOnComplete", False)
    profile.set_preference("browser.download.manager.useWindow", False)
    #profile.set_preference("browser.download.alwaysOpenPanel", False)

    profile.set_preference("browser.download.dir", r'C:\Users\HistDataTick')
    profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/zip,text/plain,text/csv,application/csv,application/download,application/octet-stream")

    driver = webdriver.Firefox(executable_path=r'C:\Downloads\geckodriver-v0.30.0-win64/geckodriver.exe',
                               firefox_profile=profile)

    s = 'https://datafeed.dukascopy.com/datafeed/NZDUSD/2022/03/12/BID_candles_min_1.bi5'

    driver.get(s)  #<<<< GETS STUCK HERE
    # #time.sleep(3)
    # button = driver.find_element(By.ID, 'file_down')  #find_element_by_id('file_down')
    # button.submit()
    time.sleep(1)
    driver.close()
    driver.quit()


t = download()

解决方案

1. 验证文件MIME类型

请求的.bi5文件对应的MIME类型可能未被正确添加到browser.helperApps.neverAsk.saveToDisk列表中,导致Firefox等待用户确认,阻塞driver.get()执行:

  • 用浏览器开发者工具查看该文件响应头的Content-Type,将对应MIME类型补充到偏好设置里。.bi5通常对应application/octet-stream(已添加),但也可能是application/x-binary,需实际验证。

2. 改用requests直接下载(推荐)

既然目标是下载文件,无需通过浏览器渲染,用requests库直接下载更高效,彻底避免Selenium的浏览器阻塞问题:

import requests

def download():
    url = 'https://datafeed.dukascopy.com/datafeed/NZDUSD/2022/03/12/BID_candles_min_1.bi5'
    save_path = r'C:\Users\HistDataTick\BID_candles_min_1.bi5'
    
    response = requests.get(url, stream=True)
    with open(save_path, 'wb') as f:
        for chunk in response.iter_content(chunk_size=1024):
            if chunk:
                f.write(chunk)

t = download()

3. 给Selenium添加超时机制

若坚持使用Selenium,可设置页面加载超时,避免无限等待:

# 在driver初始化后添加超时设置
driver.set_page_load_timeout(10)  # 设置10秒超时
try:
    driver.get(s)
except:
    # 超时后跳过等待,直接执行关闭
    pass
time.sleep(1)
driver.quit()  # 用quit()彻底退出浏览器进程,比close()更可靠

4. 检查GeckoDriver与Firefox版本兼容性

GeckoDriver v0.30.0适配Firefox 91-95版本,若你的Firefox版本过高或过低,会引发兼容性问题导致卡住。建议匹配对应版本的GeckoDriver和Firefox。

内容的提问来源于stack exchange,提问作者ManInMoon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:38:23