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

