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

Selenium调用browser.get()下载文件后卡住,如何自动关闭浏览器?

解决Selenium Firefox下载文件后程序卡住、浏览器无法关闭的问题

当使用browser.get()请求下载链接时,Selenium会等待页面完全加载完成才会执行后续代码。但下载文件的操作不会触发页面加载完成的信号(因为没有新的页面渲染),导致程序一直卡在get()步骤,无法进入后续逻辑,浏览器也无法自动关闭。

以下是两种可行的解决方案:

方法1:配置自动下载+页面加载超时

通过配置Firefox自动下载文件(无需弹窗),并设置页面加载超时,避免无限等待:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import os
import time

# 创建下载目录
download_dir = os.path.join(os.getcwd(), "downloads")
os.makedirs(download_dir, exist_ok=True)

# 配置Firefox下载参数
firefox_options = Options()
# 使用自定义下载目录
firefox_options.set_preference("browser.download.folderList", 2)
firefox_options.set_preference("browser.download.dir", download_dir)
# 指定zip文件自动下载,不弹出保存对话框
firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/zip")
# 隐藏下载管理器窗口
firefox_options.set_preference("browser.download.manager.showWhenStarting", False)

with webdriver.Firefox(options=firefox_options) as browser:
    try:
        # 设置页面加载超时时间(比如30秒)
        browser.set_page_load_timeout(30)
        browser.get("http://ipv4.download.thinkbroadband.com/5MB.zip")
        
        # 等待下载完成(简单等待,可根据文件大小调整时长)
        time.sleep(5)
        
        # 验证下载结果
        downloaded_file = os.path.join(download_dir, "5MB.zip")
        print("下载成功" if os.path.exists(downloaded_file) else "下载失败")
    except Exception as e:
        print(f"执行异常: {str(e)}")
# with块结束后会自动调用browser.quit(),无需手动调用

关键说明:

  • browser.download.folderList=2:指定使用自定义下载目录
  • browser.helperApps.neverAsk.saveToDisk:设置无需弹窗的文件MIME类型(zip对应application/zip,其他类型可自行查询)
  • set_page_load_timeout:超时后会抛出异常,程序跳出get()阻塞,继续执行后续逻辑,确保浏览器能正常关闭

方法2:用JS脚本发起请求(避免页面加载等待)

直接通过execute_script发起下载请求,绕过Selenium的页面加载等待机制:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
import os
import time

download_dir = os.path.join(os.getcwd(), "downloads")
os.makedirs(download_dir, exist_ok=True)

firefox_options = Options()
firefox_options.set_preference("browser.download.folderList", 2)
firefox_options.set_preference("browser.download.dir", download_dir)
firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/zip")
firefox_options.set_preference("browser.download.manager.showWhenStarting", False)

with webdriver.Firefox(options=firefox_options) as browser:
    try:
        # 用JS跳转链接,不等待页面加载
        browser.execute_script("window.location.href='http://ipv4.download.thinkbroadband.com/5MB.zip';")
        
        # 等待下载完成
        time.sleep(5)
        
        # 检查下载结果
        downloaded_file = os.path.join(download_dir, "5MB.zip")
        print("下载成功" if os.path.exists(downloaded_file) else "下载失败")
    except Exception as e:
        print(f"执行异常: {str(e)}")

关键说明:

  • window.location.href会直接跳转至下载链接,Selenium不会等待页面加载完成,因此不会阻塞程序
  • 同样需要配置自动下载参数,避免弹窗打断流程

进阶优化:精确判断下载完成

如果需要更精确的下载完成判断,可以循环检查文件大小是否稳定(避免因网络慢导致提前结束):

# 替换原有的time.sleep(5)
downloaded_file = os.path.join(download_dir, "5MB.zip")
prev_size = -1
wait_time = 0
max_wait = 60  # 最大等待60秒

while wait_time < max_wait:
    if os.path.exists(downloaded_file):
        current_size = os.path.getsize(downloaded_file)
        if current_size == prev_size:
            # 文件大小稳定,说明下载完成
            break
        prev_size = current_size
    time.sleep(1)
    wait_time += 1

if wait_time >= max_wait:
    print("下载超时")
else:
    print("下载成功")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:07:42