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

Chrome v62及以上版本Python-Selenium弹窗处理失效问题

解决Chrome v62-v66中Selenium处理弹窗的异常问题

我之前也遇到过类似的情况——Chrome 62及以上版本对弹窗的处理机制做了调整,导致原本在旧版本正常的EC.alert_is_present()检测逻辑失效,进而触发UnexpectedAlertPresentException。结合你的场景,这里有几个可行的解决方案:

1. 先修正代码里的拼写小错误

首先留意到你的代码里有个笔误:Alert(driver).accpet() 应该是 Alert(driver).accept(),这个小问题可能会让你在修正核心问题时走弯路,先把它改过来。

2. 绕过EC.alert_is_present(),直接尝试切换到弹窗

有时候EC.alert_is_present()的等待逻辑在Chrome 62+下会存在检测延迟或失效的情况,我们可以用try-except块直接操作弹窗,同时预留一点加载时间:

from selenium.common.exceptions import NoAlertPresentException
import time

# 给弹窗预留1-2秒的加载时间
time.sleep(1.5)
try:
    alert = driver.switch_to.alert
    alert.accept()
    currentURL = driver.current_url
except NoAlertPresentException:
    print("未检测到弹窗,执行后续逻辑")

3. 自定义等待条件替代官方的alert_is_present

如果你更倾向于使用显式等待,可以自定义一个等待条件,直接检查弹窗是否可切换:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoAlertPresentException

def is_alert_present(driver):
    try:
        driver.switch_to.alert
        return True
    except NoAlertPresentException:
        return False

# 最长等待10秒,直到弹窗可被切换
WebDriverWait(driver, 10).until(is_alert_present)
alert = driver.switch_to.alert
alert.accept()
currentURL = driver.current_url

4. 调整Chrome启动参数适配新版本

Chrome 62+对弹窗的默认处理有变化,你可以尝试添加以下启动参数,确保弹窗能被Selenium正常识别:

from selenium.webdriver.chrome.options import Options

chrome_options = Options()
# 禁用弹窗拦截,确保弹窗能正常弹出
chrome_options.add_argument("--disable-popup-blocking")
# 禁用沙箱模式,避免部分环境下的弹窗检测异常
chrome_options.add_argument("--no-sandbox")
# 初始化驱动时传入配置
driver = webdriver.Chrome(options=chrome_options)

补充说明

Chrome 62开始调整了弹窗的JavaScript事件触发逻辑,官方的EC.alert_is_present()内部的检测逻辑没有及时适配这个变化,导致无法正确捕捉到弹窗的存在状态。而直接切换到弹窗的方式更直接,不受这个检测逻辑的限制,所以能在新版本中正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:22