Python自动化测试实战:本地部署OCR识别图文验证码
针对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辅助测试的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









