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

Python用Selenium登录时遇验证码弹窗UnexpectedAlertPresentException如何解决

问题根因

点击提交按钮后如果验证码错误,页面会立刻弹出alert弹窗,此时Selenium执行get_url=driver.current_url这行代码时,因为页面存在未处理的alert,无法正常执行DOM相关操作,直接抛出UnexpectedAlertPresentException异常,程序直接中断,自然走不到后面的else分支。

解决方案

  1. 引入异常捕获逻辑,专门处理验证码错误触发的alert场景
  2. 替换已废弃的switch_to_alert()方法为最新的switch_to.alert
  3. 可添加alert显式等待逻辑,避免硬等待时间不够导致的处理失败
  4. 冗余逻辑优化,比如tesseract路径配置不需要放在循环内重复执行

修改后可正常运行的代码如下:

# 先导入需要的异常类
from selenium.common.exceptions import UnexpectedAlertPresentException

# 全局配置只需要执行一次,不用放到循环里
pytesseract.pytesseract.tesseract_cmd = r"C:\Users\ankit19.gupta\AppData\Local\Programs\Tesseract-OCR\tesseract.exe"

while(1):
    img = driver.find_element(By.XPATH,"//form[@id='form1']/div[4]/div/div/div/div[3]/div[2]/div[3]/div/img")
    location = img.location
    size = img.size
    driver.save_screenshot("captcha.png")
    image = Image.open("captcha.png")
    left = location['x']
    top = location['y'] 
    right = location['x'] + size['width']
    bottom = location['y'] + size['height']
    image = image.crop((left, top, right, bottom))
    image.save("captcha.png", 'png')
    captcha = pytesseract.image_to_string(image)
    captcha = captcha.replace(" ", "").strip()
    txtUserName="user"
    txtPassword = "pwd"
    
    # 输入前先清空输入框,避免重试时内容叠加
    query = wait.until(EC.presence_of_element_located((By.XPATH, "//input[@id='txtUsername']")))
    query.clear()
    query.send_keys(txtUserName)
    
    query = wait.until(EC.presence_of_element_located((By.XPATH,"//input[@id='txtPassword']")))
    query.clear()
    query.send_keys(txtPassword)
    
    query = wait.until(EC.presence_of_element_located((By.XPATH,"//input[@id='txtinput']")))
    query.clear()
    query.send_keys(captcha)    
    
    element=wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@id='btnSubmit']")))
    element.click()
    
    # 核心修改:添加异常捕获处理alert场景
    try:
        get_url=driver.current_url
        print(get_url)
        if get_url == 'home_page_url':
            break
    except UnexpectedAlertPresentException:
        # 捕获到验证码错误的alert,直接处理
        alert = wait.until(EC.alert_is_present())
        alert.accept()
        print("验证码错误,重试登录")
        # 不需要重新请求登录页,关闭alert后页面还停留在登录页,直接进入下一次循环即可
        # 如果确实需要刷新可以保留driver.get("login_page_url")
        continue

额外优化建议

如果验证码识别率太低,可以对裁剪后的验证码图片做二值化、去噪处理,能大幅提升pytesseract的识别准确率,减少重试次数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:45:04