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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:35:33