Python用Selenium登录时遇验证码弹窗UnexpectedAlertPresentException如何解决
问题根因
点击提交按钮后如果验证码错误,页面会立刻弹出alert弹窗,此时Selenium执行get_url=driver.current_url这行代码时,因为页面存在未处理的alert,无法正常执行DOM相关操作,直接抛出UnexpectedAlertPresentException异常,程序直接中断,自然走不到后面的else分支。
解决方案
- 引入异常捕获逻辑,专门处理验证码错误触发的alert场景
- 替换已废弃的
switch_to_alert()方法为最新的switch_to.alert - 可添加alert显式等待逻辑,避免硬等待时间不够导致的处理失败
- 冗余逻辑优化,比如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
相关产品推荐
相关产品推荐

