Selenium Python3无法关闭火狐浏览器下载成功后的通知弹窗
环境信息
- Selenium版本:3.141
- Mozilla Firefox版本:101.0.1
- 自动化框架:Pytest
问题现象
文件可正常下载完成,但下载后火狐浏览器右上角弹出的下载通知会遮挡界面,导致后续操作无法执行,期望通过Selenium代码关闭该通知,但所有尝试的方案均未生效。
已尝试的无效方案
- 配置FirefoxOptions相关首选项参数,代码如下:
import os from selenium import webdriver from webdriver_manager.firefox import GeckoDriverManager options = webdriver.FirefoxOptions() # options = FirefoxProfile() options.set_preference("dom.webnotifications.enabled", False) options.set_preference("dom.push.enabled", False) options.set_preference("browser.helperApps.neverAsk.saveToDisk","application/pptx, application/csv, application/ris, text/csv, image/png, application/pdf, text/html, text/plain, application/zip, application/x-zip, application/x-zip-compressed, application/download, application/octet-stream") options.set_preference("browser.download.panel.shown", False) options.set_preference("browser.download.folderList", 2) options.set_preference("browser.download.manager.showWhenStarting", False) options.set_preference("browser.download.dir", os.path.join(parent_folder, 'Downloads')) options.set_preference("browser.download.manager.closeWhenDone", True) options.set_preference("browser.download.manager.showAlertOnComplete", False) # options.add_argument("--headless") # options.headless = True web_driver = webdriver.Firefox(firefox_options=options,executable_path=GeckoDriverManager().install())
- 文件下载完成后,模拟按键操作尝试关闭通知未生效,相关代码如下:
self.driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + Keys.ENTER)
或
from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys ActionChains(self.driver).send_keys(Keys.ESCAPE).perform()
- 尝试刷新页面,通知仍然留存。
可行解决方案
方案1:前置配置(推荐,从根源禁用弹窗)
之前配置的browser.download.manager.*、browser.download.panel.shown参数仅对Firefox 57(量子版本)之前的旧版下载管理器生效,101版本火狐已经重构了下载面板逻辑,新增以下配置即可禁止下载完成后自动弹出右上角面板:
# 禁止下载完成后自动展开工具栏下载面板 options.set_preference("browser.download.alwaysOpenPanel", False)
补充说明:初始化WebDriver时传入的firefox_options参数在Selenium 3.141版本虽做了兼容,但已属于废弃写法,建议替换为标准参数options=options避免潜在兼容问题。
方案2:弹窗出现后主动关闭
之前模拟按键、刷新页面无效的核心原因:Selenium默认的按键发送、页面刷新操作的作用对象是网页DOM内容,无法将事件传递给浏览器外壳层面的UI组件,下载面板属于浏览器原生UI,不受网页操作的直接控制。
直接点击网页内不在弹窗遮挡范围内的区域即可收起面板,示例代码:
from selenium.webdriver.common.by import By # 点击页面根元素(左上角无遮挡区域)触发面板收起 self.driver.find_element(By.TAG_NAME, 'html').click()
如果点击后仍未收起,可直接偏移坐标点击页面最左上角的无遮挡位置:
from selenium.webdriver.common.action_chains import ActionChains # 移动到页面坐标(5,5)位置点击,该区域属于网页内容,不会被右上角下载面板遮挡 ActionChains(self.driver).move_by_offset(5,5).click().perform() # 操作完将鼠标移回初始位置,避免影响后续元素交互 ActionChains(self.driver).move_by_offset(-5,-5).perform()
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

