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

使用Selenium+Firefox下载文件后浏览器卡顿,browser.quit()无法执行

解决Selenium Firefox下载后卡顿、browser.quit()无法执行的问题

针对你遇到的下载后浏览器卡顿、browser.quit()无法正常调用的问题,可以从以下几个方向调整代码和配置:

1. 替换固定等待,改用显式等待确认下载完成

time.sleep(3)是不可靠的,若文件较大或网络缓慢,3秒内可能未完成下载,导致浏览器仍在处理下载任务时执行quit()引发卡顿。可以通过监控下载目录的文件状态来确认下载完成:

import os
from selenium.webdriver.support.ui import WebDriverWait

# 下载前清理同名文件,避免判断错误
download_path = "/home/<myuser>/"
target_file = os.path.join(download_path, "feed.rss")
if os.path.exists(target_file):
    os.remove(target_file)

# 触发下载
browser.get(URL + "feed.rss")

# 显式等待文件出现且大小非0,超时设为30秒
WebDriverWait(browser, 30).until(
    lambda d: os.path.exists(target_file) and os.path.getsize(target_file) > 0
)

2. 添加对应文件的MIME类型设置

你下载的是RSS文件,需要明确告知Firefox该类型文件无需询问直接保存,添加以下偏好配置:

firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/rss+xml,application/xml")

注:若实际RSS文件的MIME类型不同,可通过浏览器开发者工具的网络请求查看响应头Content-Type值,补充到该配置中。

3. 优化Firefox下载相关偏好

移除重复配置项,调整可能导致卡顿的设置,优化后的配置如下:

firefox_options = Options()
firefox_options.set_preference("browser.download.folderList", 2)
firefox_options.set_preference("browser.download.dir", "/home/<myuser>/")
firefox_options.set_preference("browser.directory.upgrade", True)
firefox_options.set_preference("browser.download.prompt_for_download", False)
firefox_options.set_preference("browser.download.manager.showWhenStarting", False)
firefox_options.set_preference("browser.download.manager.closeWhenDone", True)
firefox_options.set_preference("browser.download.manager.showAlertOnComplete", False)
firefox_options.set_preference("browser.download.manager.useWindow", False)
firefox_options.set_preference("browser.helperApps.alwaysAsk.force", False)
firefox_options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/rss+xml,application/xml")
firefox_options.set_preference("pdfjs.disabled", True)
firefox_options.set_preference("network.proxy.socks_remote_dns", True)

firefox_options.add_argument("--disable-infobars")
firefox_options.add_argument("--disable-extensions")

4. 用try-finally确保quit()执行

即使中间出现异常,也要保证浏览器进程被正常终止,将核心逻辑包裹在try-finally块中:

browser = webdriver.Firefox(service=s, options=firefox_options)
try:
    browser.get(URL)
    browser.find_element(By.NAME, "login").send_keys(USER)
    browser.find_element(By.NAME, "password").send_keys(PASSWORD)
    browser.find_element(By.CLASS_NAME, CLASS).click()

    # 下载逻辑(替换为上述显式等待版本)
    download_path = "/home/<myuser>/"
    target_file = os.path.join(download_path, "feed.rss")
    if os.path.exists(target_file):
        os.remove(target_file)
    browser.get(URL + "feed.rss")
    WebDriverWait(browser, 30).until(
        lambda d: os.path.exists(target_file) and os.path.getsize(target_file) > 0
    )
finally:
    browser.quit()

5. 检查版本兼容性

虽然geckodriver 0.31.0理论上支持Firefox 98-104,若上述调整后仍卡顿,可尝试更新geckodriver到对应Firefox 103的最新兼容版本(如0.32.0),排除版本适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:21:57