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}')
问题原因
- alert加载时机问题:点击按钮后alert可能未完全弹出就执行
switch_to.alert,导致后续操作异常 - 未切回主页面:处理完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
相关产品推荐
相关产品推荐

