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

如何在Selenium Python中跟踪网站验证码图片的加载状态?

解决Selenium Python自动注册中验证码延迟/加载失败的问题

针对你遇到的验证码图片延迟加载、偶发空图的问题,可以通过以下几个步骤精准处理,确保验证码加载完成后立即执行后续操作:

1. 显式等待验证码图片资源加载完成

页面中验证码元素存在不代表图片资源已加载完成,我们可以通过检查图片的naturalWidth属性(空图或未加载完成的图片该值为0)来判断是否加载成功,配合Selenium的显式等待实现实时检测:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

def wait_for_captcha_load(driver, captcha_locator, timeout=30):
    # 等待图片naturalWidth不为0,即资源加载完成
    return WebDriverWait(driver, timeout).until(
        lambda d: d.find_element(*captcha_locator).get_attribute("naturalWidth") != "0"
    )

# 使用示例:假设验证码图片的ID是captcha-img
captcha_locator = (By.ID, "captcha-img")
wait_for_captcha_load(driver, captcha_locator)

2. 直接提取验证码图片数据,替代整页截图

整页截图可能会包含未加载完成的图片区域,直接从DOM中提取图片的Base64编码更可靠,避免空图问题:

def get_captcha_base64(driver, captcha_locator):
    captcha_img = driver.find_element(*captcha_locator)
    # 通过JS将图片绘制到Canvas并转为Base64
    base64_str = driver.execute_script("""
        var canvas = document.createElement('canvas');
        var ctx = canvas.getContext('2d');
        var img = arguments[0];
        canvas.width = img.naturalWidth;
        canvas.height = img.naturalHeight;
        ctx.drawImage(img, 0, 0);
        return canvas.toDataURL('image/png').slice(22); // 去掉data:image/png;base64,前缀
    """, captcha_img)
    return base64_str

# 获取Base64后直接传给验证码服务
captcha_base64 = get_captcha_base64(driver, captcha_locator)
# 此处调用你的验证码识别服务

3. 处理验证码加载失败的情况

如果检测到空图,自动触发验证码刷新按钮,循环直到加载成功:

def refresh_captcha(driver, refresh_locator):
    driver.find_element(*refresh_locator).click()

def ensure_captcha_loaded(driver, captcha_locator, refresh_locator, max_retries=5):
    for _ in range(max_retries):
        try:
            wait_for_captcha_load(driver, captcha_locator, timeout=10)
            captcha_img = driver.find_element(*captcha_locator)
            if captcha_img.get_attribute("naturalWidth") != "0":
                return True
        except:
            pass
        refresh_captcha(driver, refresh_locator)
    return False

# 使用示例:假设刷新按钮的CSS选择器是.btn-refresh-captcha
refresh_locator = (By.CSS_SELECTOR, ".btn-refresh-captcha")
ensure_captcha_loaded(driver, captcha_locator, refresh_locator)

关键逻辑说明

  • 利用naturalWidth判断图片是否真实加载:浏览器中未加载成功的图片(空图)naturalWidth属性为0,这比单纯等待元素存在更准确。
  • 直接提取Base64数据:避免截图的区域误差和未加载完成的问题,确保传给验证码服务的是完整的图片。
  • 自动重试刷新:遇到加载失败时无需人工干预,循环尝试直到获取有效验证码,保证流程自动化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:56:04