Selenium 中的 alert 处理

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


1. 获取 alert 对象

当页面弹出 alert 时,你需要先切换到该 alert,然后才能对其进行操作:

python 复制代码
alert = driver.switch_to.alert

2. 常见操作

(1)获取 alert 文本

获取弹窗的文本内容:

python 复制代码
text = alert.text
print(text)

(2)接受 alert

点击 "确定" 按钮:

python 复制代码
alert.accept()

(3)取消 alert

点击 "取消" 按钮(适用于确认弹窗和输入弹窗):

python 复制代码
alert.dismiss()

(4)输入文本

适用于输入类型的弹窗:

python 复制代码
alert.send_keys("Hello, Selenium!")
alert.accept()  # 发送文本后点击"确定"

3. 等待 alert 出现

有时候 alert 可能不会立刻出现,因此可以使用 显式等待 让 Selenium 等待弹窗:

python 复制代码
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 是否存在:

python 复制代码
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 处理异常:

    python 复制代码
    try:
        alert = driver.switch_to.alert
        print(alert.text)
        alert.accept()
    except NoAlertPresentException:
        print("没有弹窗")

2)UnexpectedAlertPresentException

selenium.common.exceptions.UnexpectedAlertPresentException

原因 :执行某个 Selenium 操作时,页面突然弹出 alert,导致操作失败。

解决方案

  • 先处理 alert,然后再执行 Selenium 操作:
python 复制代码
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 是否仍然存在

python 复制代码
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

python 复制代码
# 先切换到 `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

python 复制代码
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
相关推荐
@LetsTGBot搜索引擎机器人11 小时前
从零打造 Telegram 中文生态:界面汉化 + 中文Bot + @letstgbot 搜索引擎整合实战
开发语言·python·搜索引擎·github·全文检索
短鼻子小象11 小时前
DeepSeek-OCR:革命性文档识别模型全面解析及实测
python·ai·ocr
jc062012 小时前
7.1-性能与测试工具
测试工具
合作小小程序员小小店12 小时前
基于可视化天气系统demo,基于python+ matplotlib+request爬虫,开发语言python,数据库无,10个可视化界面,需要的可以了联系。
开发语言·爬虫·python·matplotlib
倔强青铜三12 小时前
苦练Python第71天:一行代码就搭出服务器?别眨眼,http.server真有这么爽!
人工智能·python·面试
倔强青铜三12 小时前
苦练Python第70天:征服网络请求!揭开urllib.request的神秘面纱
人工智能·python·面试
倔强青铜三12 小时前
苦练Python第72天:colorsys 模块 10 分钟入门,让你的代码瞬间“好色”!
人工智能·python·面试
胖哥真不错13 小时前
Python基于PyTorch实现多输入多输出进行BP神经网络回归预测项目实战
pytorch·python·毕业设计·论文·毕设·多输入多输出·bp神经网络回归预测
合作小小程序员小小店13 小时前
web网页开发,旧版在线%考试,判题%系统demo,基于python+flask+随机分配考试题目,基于开发语言python,数据库mysql
开发语言·后端·python·mysql·flask·html5
dalalajjl14 小时前
爱派(AiPy):一个让大语言模型直接操作Python完成任务
python