在自动化测试中,处理验证码是一项具有挑战性的任务,常见的处理方式如下:
1. 绕过验证码
- 环境配置修改:在测试环境中,通过修改配置文件关闭验证码功能。许多基于 Java Spring Boot 框架开发的 Web 应用,可在
application.properties
(或application.yml
)文件中设置特定参数来禁用验证码。例如,将captcha.enabled=false
写入配置文件,重启应用后,自动化测试就无需处理验证码。但此方法仅限于测试环境,生产环境使用会严重降低系统安全性。 - 特定测试账号:与开发团队协作,创建特殊的测试账号。这些账号在登录或执行关键操作时,系统自动绕过验证码验证。比如企业内部管理系统,可为测试人员专门设置几个具有 “免验证码” 权限的账号。此方式操作简便,但无法完全模拟真实用户场景,对于依赖验证码的业务逻辑测试可能不准确。
2. 使用固定验证码
- 硬编码固定值:在开发阶段,将验证码设置为固定值。例如,把验证码逻辑代码修改为始终返回 “123456”。自动化测试脚本每次输入此固定值即可通过验证。这种方式简单直接,但仅适用于测试,生产环境使用会带来严重安全隐患。
- 配置文件设定:将固定验证码配置在文件中,如 Python 项目的
config.ini
文件或 Java 项目的properties
文件。测试脚本从配置文件读取验证码值。以 Python 为例,使用configparser
库读取config.ini
中的验证码:
python
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
captcha = config.get('captcha_section', 'captcha_value')
这样便于在不同环境配置不同的固定验证码,且修改验证码时无需修改大量测试代码。
3. 识别验证码
- OCR 技术:利用光学字符识别技术识别验证码图片。常见的开源 OCR 库如 Tesseract,支持多种编程语言。以 Python 结合 Tesseract 为例,首先安装
pytesseract
库和 Tesseract OCR 引擎:
bash
pip install pytesseract
# 不同操作系统安装Tesseract OCR引擎方法不同,以Ubuntu为例
sudo apt - get install tesseract - ocr
然后编写代码识别验证码图片:
python
import pytesseract
from PIL import Image
image = Image.open('captcha.png')
captcha_text = pytesseract.image_to_string(image)
但 OCR 对复杂验证码(如扭曲、含干扰线、不规则字体)识别准确率较低,通常需对图片进行预处理,如灰度化、二值化、降噪、去除干扰线等,以提高识别率。
- 第三方识别平台:借助专门的验证码识别平台,如打码兔、超级鹰等。这些平台提供 API 接口,测试脚本将验证码图片发送到平台,平台利用算法或人工识别后返回结果。以超级鹰为例,使用 Python 调用其 API:
python
import requests
# 超级鹰API相关参数
username = 'your_username'
password = 'your_password'
soft_id = 'your_soft_id'
app_key = 'your_app_key'
captcha_path = 'captcha.png'
# 读取图片内容
with open(captcha_path, 'rb') as f:
captcha_data = f.read()
# 构造请求参数
data = {
'user': username,
'pass2': password,
'softid': soft_id,
'appkey': app_key,
'codetype': '1004', # 验证码类型
'image': captcha_data
}
response = requests.post('http://api.chaojiying.net/Upload/Processing.php', data=data)
result = response.json()
if result['err_no'] == 0:
captcha_text = result['pic_str']
else:
print('识别失败:', result['err_str'])
此方法识别准确率较高,但可能涉及付费,且依赖外部平台,存在稳定性风险。
4. 验证码接口模拟
- 分析生成逻辑:若能获取验证码生成算法和逻辑,测试脚本可模拟生成相同验证码。例如,简单的数字验证码由时间戳与特定密钥经哈希算法生成。测试脚本可获取当前时间戳,结合已知密钥,按照相同哈希算法生成验证码。但分析和模拟生成逻辑难度较大,且业务代码变更时,脚本需相应调整。
- 调用生成接口:部分系统开发团队会提供测试用的验证码生成接口。测试脚本直接调用该接口获取验证码,确保与真实环境一致。例如,接口返回 JSON 格式数据,包含生成的验证码:
python
import requests
response = requests.get('验证码生成接口URL')
captcha_json = response.json()
captcha_text = captcha_json['captcha']
使用此方法需开发团队配合提供接口,并注意接口权限和安全性。
5. 通过 Cookie 处理验证码
- 原理:当用户在浏览器中手动输入正确验证码并成功通过验证后,服务器通常会在响应中设置特定的 Cookie。这个 Cookie 可能包含验证码验证通过的标识或相关信息。在自动化测试中,如果能获取并添加这个 Cookie 到浏览器会话,就可以绕过验证码输入环节,直接进行后续操作。
- 操作步骤:
- 手动获取 Cookie:首先,手动在浏览器中访问目标网站,输入正确的验证码完成相关操作(如登录)。然后利用浏览器的开发者工具(如 Chrome 浏览器按 F12 ,在 “Application” 选项卡下的 “Cookies” 部分),找到与该网站相关且与验证码验证通过有关的 Cookie。记录下该 Cookie 的名称、值、域和路径等关键信息。这可能需要多次尝试不同操作,并观察 Cookie 的变化来准确确定。
- 自动化添加 Cookie:以 Python 的 Selenium 库为例,代码如下:
python
from selenium import webdriver
# 创建浏览器驱动实例
driver = webdriver.Chrome()
# 打开网站
driver.get('目标网站URL')
# 手动获取的与验证码相关的Cookie
captcha_cookie = {
'name': 'captcha - related - cookie - name',
'value': 'captcha - related - cookie - value',
'domain': '目标网站域名',
'path': '/'
}
# 添加Cookie到当前会话
driver.add_cookie(captcha_cookie)
# 刷新页面使Cookie生效,可进行后续操作
driver.refresh()
# 此处可编写后续测试代码,如登录后的功能测试等
在上述代码中,先创建 Chrome 浏览器驱动实例并打开目标网站,接着根据手动获取的 Cookie 信息构建captcha_cookie
字典。注意替换name
和value
为实际获取的值,domain
和path
也需根据实际情况填写,以确保 Cookie 能正确生效。通过driver.add_cookie()
方法添加 Cookie 后,使用driver.refresh()
刷新页面,使添加的 Cookie 生效,从而绕过验证码进行后续测试。
- 局限性和注意事项:
- 局限性:这种方式依赖于手动获取 Cookie,并且 Cookie 通常具有时效性。一旦 Cookie 过期或网站验证码机制改变,就需要重新获取并更新测试代码中的 Cookie 信息。此外,不同网站的 Cookie 机制差异较大,有些网站可能对 Cookie 进行加密或采用更复杂的验证方式,使得通过添加 Cookie 绕过验证码变得困难甚至不可行。
- 注意事项:在实际应用中,要确保获取 Cookie 的操作符合网站的使用条款和法律法规,避免因绕过验证码等行为引发法律问题。同时,自动化测试代码中添加 Cookie 的操作应封装在独立的函数或模块中,便于维护和管理。