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

Selenium操作alert调用send_keys()触发UnexpectedAlertPresentException异常问题

解决Selenium操作Alert时send_keys引发的UnexpectedAlertPresentException问题

问题场景

目标网站包含PIN码列表,仅一个PIN正确。点击check按钮会弹出alert,输入PIN确认后根据返回消息执行后续操作。但调用send_keys()方法时程序崩溃,抛出异常:

selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: {Alert text :
Message: unexpected alert open: {Alert text : }

尝试添加time.sleep()、通过execute_script执行JS传入PIN均无效,移除send_keys()后程序可正常运行。

原代码

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

with webdriver.Chrome() as browser:
    browser.get('https://parsinger.ru/blank/modal/4/index.html')

    codes = browser.find_elements(By.CLASS_NAME, 'pin')
    btn = browser.find_element(By.ID, 'check')
    res = browser.find_element(By.ID, 'result')

    for code in codes:
        btn.click()
        alert = browser.switch_to.alert
        alert.send_keys(code.text)
        alert.accept()

        if res.text != 'Неверный пин-код':
            print(f'Правильный код: {code.text} ')
            print(f'Секретный код: {res.text}')

问题原因

  1. alert加载时机问题:点击按钮后alert可能未完全弹出就执行switch_to.alert,导致后续操作异常
  2. 未切回主页面:处理完alert后没有切换回主页面上下文,后续循环中点击按钮可能触发alert状态冲突

修正方案

使用显式等待确保alert完全弹出后再操作,处理完alert后切回主页面,同时增加异常处理避免残留alert影响循环:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoAlertPresentException, UnexpectedAlertPresentException

with webdriver.Chrome() as browser:
    browser.get('https://parsinger.ru/blank/modal/4/index.html')
    wait = WebDriverWait(browser, 10)
    
    codes = browser.find_elements(By.CLASS_NAME, 'pin')
    btn = browser.find_element(By.ID, 'check')
    res = browser.find_element(By.ID, 'result')

    for code in codes:
        try:
            # 先检查是否有残留alert,若有则关闭
            alert = browser.switch_to.alert
            alert.dismiss()
        except NoAlertPresentException:
            pass
        
        btn.click()
        # 显式等待alert出现
        alert = wait.until(EC.alert_is_present())
        alert.send_keys(code.text)
        alert.accept()
        
        # 切回主页面上下文
        browser.switch_to.default_content()
        
        if res.text != 'Неверный пин-код':
            print(f'Правильный код: {code.text} ')
            print(f'Секретный код: {res.text}')
            break  # 找到正确PIN后退出循环

关键改进点

  • 用WebDriverWait+EC.alert_is_present()替代直接switch_to.alert,确保alert完全加载后再操作
  • 循环开始前检查并关闭残留alert,避免状态冲突
  • 处理完alert后调用switch_to.default_content()切回主页面
  • 找到正确PIN后添加break退出循环,提升效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:58:13