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

Selenium+ChromeDriver操作Alert弹窗时代码阻塞问题求助

问题分析与解决方案

可能原因

  1. 弹窗并非原生JavaScript Alert:多数网站会用自定义div模态框替代原生alert,而Selenium的EC.alert_is_present()仅能识别原生弹窗,无法检测自定义模态框,导致代码持续等待原生alert出现而卡住。
  2. 自动操作的触发逻辑偏差:手动输入验证码后按回车,实际触发的是表单提交事件;但代码中给输入框发送Keys.ENTER,可能仅在输入框内换行,并未真正触发提交逻辑(虽你手动操作有效,但仍需排查此可能性)。
  3. 弹窗出现时机延迟:自动操作时页面处理速度与手动不同,弹窗出现时间可能晚于Selenium的等待超时阈值,或上下文未及时切换到alert。

解决方案

第一步:确认弹窗类型

打开浏览器开发者工具(F12),弹窗出现时切换到Elements面板:

  • 若能找到带modal/dialog类名的覆盖式div容器,说明是自定义模态框;
  • 若Elements无新增元素,且Console执行window.alert返回原生函数,说明是原生Alert。

针对自定义模态框的处理

定位弹窗中“确定”按钮的选择器(ID、class或XPath均可),替换原alert等待代码:

# 等待自定义弹窗的确定按钮可点击
confirm_btn = self.std_wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, '.modal-confirm-btn'))  # 替换为实际选择器
)
confirm_btn.click()

针对原生Alert的处理

若确认是原生弹窗但代码仍卡住,可尝试以下调整:

  1. 调整等待时机:在触发弹窗后加短暂延迟,或延长等待超时时间:
import time

veri_box.send_keys("randomKey")
veri_box.send_keys(Keys.ENTER)
time.sleep(1)  # 给弹窗留出加载缓冲
alert = self.std_wait.until(EC.alert_is_present(), timeout=15)
alert.accept()
  1. 手动切换alert上下文:部分场景需要显式切换到alert上下文:
veri_box.send_keys("randomKey")
veri_box.send_keys(Keys.ENTER)
# 切换到alert并确认
alert = self.driver.switch_to.alert
alert.accept()
  1. 替换回车操作为提交按钮点击:避免回车触发逻辑不一致,直接定位提交按钮操作:
veri_box = self.std_wait.until(EC.element_to_be_clickable((By.ID, 'checkCode')))
veri_box.send_keys("randomKey")
# 定位并点击提交按钮
submit_btn = self.std_wait.until(EC.element_to_be_clickable((By.ID, 'submit-button')))  # 替换为实际按钮ID
submit_btn.click()
# 等待并处理alert
alert = self.std_wait.until(EC.alert_is_present()).accept()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 12:02:16