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
相关产品推荐
相关产品推荐

