Python Selenium Firefox驱动遇系统弹窗挂起问题求助
解决Selenium Firefox触发外部协议弹窗后脚本挂起的问题
方案1:利用SeleniumWire拦截外部协议请求
你已经在用SeleniumWire,它可以直接拦截触发外部协议的网络请求,从根源上避免弹窗触发。只需添加请求拦截逻辑,终止非HTTP/HTTPS的协议请求即可。
修改后的代码:
from selenium.webdriver import Keys from selenium.webdriver.firefox.options import Options from seleniumwire import webdriver def intercept_request(request): # 拦截所有非HTTP/HTTPS的外部协议请求 if not request.url.startswith(('http://', 'https://')): request.abort() options = Options() options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe' options.set_preference("security.external_protocol_requires_permission", False) driver = webdriver.Firefox(options=options) # 绑定请求拦截器 driver.request_interceptor = intercept_request # 访问页面 driver.get(url) user_field = driver.find_element("id", "UserName") user_field.send_keys(username) pass_field = driver.find_element("id", "Password") pass_field.send_keys(password) pass_field.send_keys(Keys.ENTER) # 此处弹窗触发请求已被拦截,脚本不会挂起 reqs = driver.requests print("Success!") driver.quit()
方案2:添加Firefox针对性协议偏好设置
针对触发弹窗的具体协议(比如customproto://这类自定义协议),直接禁止浏览器处理或提示。将以下配置添加到你的Options设置中,替换customproto为实际协议名:
# 禁止浏览器暴露该协议给系统处理 options.set_preference("network.protocol-handler.expose.customproto", False) # 关闭外部协议提示弹窗 options.set_preference("network.protocol-handler.warn-external.customproto", False) # 可选:指定无效的处理程序路径,避免系统启动未知程序 options.set_preference("network.protocol-handler.app.customproto", "C:\\Windows\\System32\\notepad.exe")
方案3:多线程强制跳过阻塞点
如果前两种方法无效,可通过多线程让主线程绕过阻塞点继续执行。将触发弹窗的操作放到子线程中,设置超时时间,主线程到点后直接执行后续代码:
import threading from selenium.webdriver import Keys from selenium.webdriver.firefox.options import Options from seleniumwire import webdriver def execute_trigger_action(driver, username, password): user_field = driver.find_element("id", "UserName") user_field.send_keys(username) pass_field = driver.find_element("id", "Password") pass_field.send_keys(password) pass_field.send_keys(Keys.ENTER) options = Options() options.binary_location = r'C:\Program Files\Mozilla Firefox\firefox.exe' options.set_preference("security.external_protocol_requires_permission", False) driver = webdriver.Firefox(options=options) driver.get(url) # 子线程执行触发操作,主线程不阻塞 action_thread = threading.Thread(target=execute_trigger_action, args=(driver, username, password)) action_thread.start() # 等待10秒(可根据实际操作耗时调整)后强制继续 action_thread.join(timeout=10) # 后续代码正常执行 reqs = driver.requests print("Success!") driver.quit()
内容的提问来源于stack exchange,提问作者Jessica Chambers
相关产品推荐
相关产品推荐

