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

