验证码:Web 自动化的最后一公里
为了保障安全,现代 Web 中验证码无处不在。然而,自动化脚本如何跨越这道坎?
1. 业务绕过 (Business Bypassing) —— 首选方案
在测试环境中,最好的技术就是没有技术。
- 暗号法: 设置万能验证码(如输入
8888必过)。 - 移除法: 测试环境直接关掉验证码功能。
- 白名单法: 针对特定测试手机号或账号不校验。
2. 复用浏览器 (Debug Mode) —— 本地调试利器
当你只需要在登录后的页面执行测试,且不想重复输入密码/验证码时:
- 设置远程调试端口:
chrome.exe --remote-debugging-port=9222 - 代码接管:
PYTHON
from selenium.webdriver.chrome.options import Optionschrome_options = Options()chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")driver = webdriver.Chrome(options=chrome_options)# 此时 driver 会接管已打开的那个浏览器,无需重新登录
3. Cookie 绕过 —— 集成测试常用
手动登录一次获取 JSESSIONID 或 token,随后保存到脚本。
PYTHON
driver.get("domain.com") # 必须先打开该域名
driver.add_cookie({'name': 'JSESSIONID', 'value': '手动获取到的ID'})
driver.refresh() # 刷新后即为登录态
4. OCR 图像识别 (高级方案) —— tesseract-ocr
当其他方式都无法奏效时,可以使用 OpenCV + PyTesseract 进行暴力破解。
三步识别逻辑:
- 去噪: 使用 OpenCV 均值偏移过滤 (
pyrMeanShiftFiltering)。 - 二值化: 彩色图转灰度,灰度图转黑白 (
threshold),提取纯净字符。 - 识别: 通过
pytesseract.image_to_string()进行文本转换。
局限性
OCR 识别率受背景干扰、字体倾斜度和噪点影响极大。对于滑动条或 12306 类验证码,通常需要定制化算法。
5. 面试必备:验证码处理策略
面试官经常会问:「测试中遇到验证码怎么处理?」
- 回答逻辑: 「首先看测试环境还是生产环境,首选业务绕过」。
- 列举手段:
- 万能码(后台配置)。
- 接口获取(针对测试会话给出 vcode 接口)。
- Cookie/复用浏览器(绕过登录步骤)。
- OCR 识别(技术挑战点,适合炫技但需提及准确率瓶颈)。