Selenium-中的-alert-处理
Selenium 中的 alert 处理
在 Selenium 中,
alert
是浏览器的 JavaScript 弹窗(如
alert()
,
confirm()
,
prompt()
),通常用于警告、确认操作或输入信息。Selenium 提供了
driver.switch_to.alert
来处理这些弹窗。


1. 获取 alert 对象
当页面弹出
alert
时,你需要先切换到该
alert
,然后才能对其进行操作:
alert = driver.switch_to.alert2. 常见操作
(1)获取 alert 文本
获取弹窗的文本内容:
text = alert.text
print(text)(2)接受 alert
点击 “确定” 按钮:
alert.accept()(3)取消 alert
点击 “取消” 按钮(适用于确认弹窗和输入弹窗):
alert.dismiss()(4)输入文本
适用于输入类型的弹窗:
alert.send_keys("Hello, Selenium!")
alert.accept() # 发送文本后点击“确定”3. 等待 alert 出现
有时候
alert
可能不会立刻出现,因此可以使用
显式等待
让 Selenium 等待弹窗:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待 `alert` 出现(最多 10 秒)
wait = WebDriverWait(driver, 10)
alert = wait.until(EC.alert_is_present())
# 获取文本并接受
print(alert.text)
alert.accept()(在这种时候它就自己切换了!不用再alert = driver.switch_to.alert)
等价于
如果不用
WebDriverWait
,手动
switch_to.alert
需要自己检查
alert
是否存在:
from selenium.common.exceptions import NoAlertPresentException
import time
time.sleep(3) # 先等待几秒,假设 `alert` 可能延迟出现
try:
alert = self.driver.switch_to.alert # 手动切换到 `alert`
print("弹窗内容:", alert.text)
alert.accept()
except NoAlertPresentException:
print("没有弹窗")4. 常见 alert 相关异常
(1) NoAlertPresentException
selenium.common.exceptions.NoAlertPresentException: Message: no such alert原因 :试图操作
alert,但当前页面没有弹窗。
解决方案 :
确保
alert确实存在,可以先用WebDriverWait等待弹窗。使用
try-except处理异常:try: alert = driver.switch_to.alert print(alert.text) alert.accept() except NoAlertPresentException: print("没有弹窗")
2) UnexpectedAlertPresentException
selenium.common.exceptions.UnexpectedAlertPresentException原因 :执行某个 Selenium 操作时,页面突然弹出
alert,导致操作失败。
解决方案 :
- 先处理
alert,然后再执行 Selenium 操作:
try:
alert = driver.switch_to.alert
alert.accept() # 先处理弹窗
except NoAlertPresentException:
pass # 没有弹窗就继续执行
# 继续执行 Selenium 操作
driver.find_element(By.CSS_SELECTOR, "#submit").click()处理 alert 关闭后仍然存在的问题
有些
alert
在关闭后,可能仍然会影响 Selenium 操作(
比如
accept()
之后仍然报
alert
存在的错误
)。
解决方案
:执行
time.sleep(1)
或再次检查
alert
是否仍然存在
import time
alert = WebDriverWait(self.driver, 5).until(EC.alert_is_present())
alert.accept()
# 等待 alert 彻底消失
time.sleep(1)
try:
self.driver.switch_to.alert # 这里如果 alert 还在会报错
print("alert 仍然存在")
except NoAlertPresentException:
print("alert 已成功关闭")alert 可能出现在 iframe 里
如果
alert
是
嵌套在
iframe
内部
,你可能需要先切换
iframe
:
# 先切换到 `iframe`
iframe = self.driver.find_element(By.CSS_SELECTOR, "iframe")
self.driver.switch_to.frame(iframe)
# 再等待 `alert`
alert = WebDriverWait(self.driver, 5).until(EC.alert_is_present())
alert.accept()
# 切回默认页面
self.driver.switch_to.default_content()5. 示例:处理登录失败的 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
# 启动浏览器
driver = webdriver.Edge()
driver.get("https://example.com/login")
# 输入错误的用户名和密码
driver.find_element(By.CSS_SELECTOR, "#username").send_keys("")
driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
driver.find_element(By.CSS_SELECTOR, "#submit").click()
# 等待 `alert` 并获取文本
try:
wait = WebDriverWait(driver, 10)
alert = wait.until(EC.alert_is_present())
print("弹窗内容:", alert.text)
alert.accept()
except NoAlertPresentException:
print("没有弹窗")
# 关闭浏览器
driver.quit()driver.switch_to.alert用于切换到alert并进行操作。alert.text获取弹窗内容,accept()点击 确定 ,dismiss()点击 取消 。send_keys()仅适用于prompt()类型的弹窗。- 使用
WebDriverWait(driver, timeout).until(EC.alert_is_present())等待alert出现,避免NoAlertPresentException。