如何在文件下载完成后自动关闭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
相关产品推荐
相关产品推荐

