Python自动化测试实战:本地部署OCR识别图文验证码

小鹿同学
小鹿同学
发布时间:2026-10-12| 4人浏览过
原创

针对Web自动化测试中频繁弹出的图文验证码难题,常规策略包括关闭验证、预留万能码、Cookie注入或直接调用第三方打码平台。若需本地自主识别,可借助Python的Selenium获取页面坐标,配合PIL库进行像素级色彩过滤,最后接入Tesseract OCR引擎还原字符内容。该方法无需联网付费,稳定可靠,适合私有化测试环境的高效拦截与复用要求。

自动化测试环境下的验证码处理方案

在Web应用程序登录环节引入验证码,主要是为了拦截非正常请求。常见的类型涵盖字母数字组合、图形点击、算术运算以及滑动拼图等。对自动化测试而言,这些交互机制往往会导致断言失败或流程阻塞。

典型的网页登录图文验证码界面
常规验证码会阻断自动化流程,需提前制定识别或绕过策略

Python本地OCR识别图文验证码操作流程

第1步:环境准备与依赖检查

目的:确保运行环境具备抓取与识别基础;入口:本地终端或集成开发环境;动作:校验驱动包版本并核验系统命令可执行性;参数:selenium、Pillow、tesseract-ocr;可观察的完成状态:命令行输入 tesseract --version 能正确输出版本信息且无缺省报错。

第2步:定位验证码元素并截取原始区域

目的:从复杂页面布局中提取独立验证码图像;入口:WebDriver 实例与页面DOM节点;动作:调用 save_screenshot 获取全屏后,通过 location 与 size 计算边界框并完成像素裁剪;参数:全尺寸截图路径、目标元素 ID 属性值;可观察的完成状态:指定目录下生成仅含验证码区域的原始图片文件,且四周边框贴合原图显示范围。

第3步:图像色彩过滤与二值化预处理

目的:剔除背景噪点提升光学字符识别准确率;入口:原始验证码图像对象;动作:遍历 XY 轴坐标比对 RGB 分量,符合条件者映射至新画布黑色通道;参数:阈值常量(R/G/B)、输出格式 PNG;可观察的完成状态:背景转为纯白、目标文字呈现清晰黑底的二值化图片,视觉干扰大幅降低。

第4步:调用引擎执行OCR识别

目的:将静态图像转化为可编辑文本串;入口:预处理后的图片路径与系统命令管道;动作:使用 subprocess 拉起 Tesseract 进程并在同目录写入结果文件;参数:可执行命令字符串、编码格式 UTF-8、语言包标识;可观察的完成状态:终端日志显示进程执行完毕,且工作目录出现同名 .txt 记录,大小为数十字节以上。

第5步:结果解析与状态校验

目的:过滤无效输出并标准化返回值供主流程消费;入口:OCR 生成的文本文件;动作:读取内容并执行去空格、长度与类型判断;参数:预期字符集、长度约束(如 4 位);可观察的完成状态:函数明确返回有效字符序列或 fail 标记,测试脚本据此决定是否填入输入框或触发重试逻辑。

# coding:utf-8
import os
import subprocess
from PIL import Image
from selenium.webdriver.common.by import By

def process_and_recognize(driver, captcha_id, full_screen_img_path, captcha_img_path, captcha_final_path, txt_path, ocr_cmd):
    """
    driver: WebDriver 实例
    captcha_id: 验证码图片元素的ID属性值
    full_screen_img_path: 全屏截图存储路径
    captcha_img_path: 裁剪后的原始验证码路径
    captcha_final_path: 色彩过滤后的预处理图片路径
    txt_path: OCR识别输出的TXT文件路径
    ocr_cmd: 调用Tesseract的完整命令字符串
    """
    # 1. 截取全屏并定位验证码区域坐标
    driver.save_screenshot(full_screen_img_path)
    element = driver.find_element(By.ID, captcha_id)
    left = int(element.location['x'])
    top = int(element.location['y'])
    right = int(left + element.size['width'])
    bottom = int(top + element.size['height'])
    
    # 2. 裁剪出独立验证码
    img_crop = Image.open(full_screen_img_path).crop((left, top, right, bottom))
    img_crop.save(captcha_img_path)

    # 3. 像素级色彩过滤(滤除白色/浅色背景,保留深色文字)
    img_new = Image.new('P', img_crop.size, 255)
    for x in range(img_crop.size[1]):
        for y in range(img_crop.size[0]):
            pix = img_crop.getpixel((y, x))
            # 预设文字为高饱和度蓝色,背景为浅色
            if pix[0] < 20 and pix[1] < 20 and pix[2] > 50:
                img_new.putpixel((y, x), 0) # 0代表黑色前景
    img_new.save(captcha_final_path, format='png')

    # 4. 执行Tesseract识别命令(推荐用subprocess替代已废弃的os.system)
    try:
        subprocess.run(ocr_cmd, shell=True, check=True)
    except Exception as e:
        print(f"OCR引擎调用失败: {e}")
        return "fail"

    # 5. 读取并清洗结果
    with open(txt_path, 'r', encoding='utf-8') as f:
        text_content = f.read().strip()
        if not text_content:
            return "fail"
        
        clean_text = text_content.replace(' ', '')
        # 校验规则:仅当为全数字且长度为4时判定有效
        if clean_text.isdigit() and len(clean_text) == 4:
            return clean_text
        return "fail"

关键注意事项与排错指南

在实际落地时,前端验证码样式若发生更新(如颜色反转、增加干扰线或改为倾斜字体),上述 <20, <20, >50 的RGB阈值需同步调整。此外,Tesseract 对粘连严重或极低分辨率的图片识别能力有限,可在预处理阶段加入简单的放大或直方图均衡化步骤。若控制台抛出权限拒绝或找不到文件的报错,请检查运行账号对临时目录的读写权限及相对路径是否正确。

以上就是基于Python自动化测试与Tesseract本地部署破解图文验证码的详细内容,更多关于Python图像处理与AI辅助测试的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。