Sparkle CodesSparkle
项目 / web测试 / Day09

验证码难题:绕过与识别方案全析

x
xpx
Jun 20, 2024
Editorial Insight
#Automation#Selenium

验证码:Web 自动化的最后一公里

为了保障安全,现代 Web 中验证码无处不在。然而,自动化脚本如何跨越这道坎?


1. 业务绕过 (Business Bypassing) —— 首选方案

在测试环境中,最好的技术就是没有技术。

  • 暗号法: 设置万能验证码(如输入 8888 必过)。
  • 移除法: 测试环境直接关掉验证码功能。
  • 白名单法: 针对特定测试手机号或账号不校验。

2. 复用浏览器 (Debug Mode) —— 本地调试利器

当你只需要在登录后的页面执行测试,且不想重复输入密码/验证码时:

  1. 设置远程调试端口: chrome.exe --remote-debugging-port=9222
  2. 代码接管:
    PYTHON
    from selenium.webdriver.chrome.options import Options
    chrome_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 进行暴力破解。

三步识别逻辑:

  1. 去噪: 使用 OpenCV 均值偏移过滤 (pyrMeanShiftFiltering)。
  2. 二值化: 彩色图转灰度,灰度图转黑白 (threshold),提取纯净字符。
  3. 识别: 通过 pytesseract.image_to_string() 进行文本转换。
局限性

OCR 识别率受背景干扰、字体倾斜度和噪点影响极大。对于滑动条或 12306 类验证码,通常需要定制化算法。


5. 面试必备:验证码处理策略

面试官经常会问:「测试中遇到验证码怎么处理?」

  1. 回答逻辑: 「首先看测试环境还是生产环境,首选业务绕过」。
  2. 列举手段:
    • 万能码(后台配置)。
    • 接口获取(针对测试会话给出 vcode 接口)。
    • Cookie/复用浏览器(绕过登录步骤)。
    • OCR 识别(技术挑战点,适合炫技但需提及准确率瓶颈)。

继续阅读: Web自动化-测试框架对比:Unittest vs Pytest

BACK TO BLOG
The End of Interaction