在自动化测试的过程中,验证码一直被视为一个“拦路虎”。很多测试人员在做接口或UI自动化时都会遇到验证码的阻碍,导致测试无法继续进行。今天,我们就来讨论如何在自动化过程中破解验证码,快速绕过这道关卡,轻松完成自动化测试任务!
如何通过程序实现验证码破解?有哪些工具和方法可以帮助我们在测试过程中自动识别验证码?
验证码的基本原理:
验证码的设计目的是为了区分人类与机器人,因此具有一定的随机性和难度。常见的验证码类型包括数字验证码、图形验证码、滑块验证码等。对于自动化测试而言,识别这些验证码成为一个不可忽视的挑战。
-
常用的破解方法:
- OCR技术:利用光学字符识别(OCR)技术,可以将图片中的文字转换为文本。目前比较成熟的OCR工具有Tesseract,它可以用来识别数字、字母验证码。
- 示例:某电商平台在登录时要求输入数字验证码,测试人员通过Tesseract库,将验证码图片读取并转换为文本,从而顺利完成登录操作。
- 通过API获取验证码:在某些系统中,验证码的生成是通过服务器端的API完成的。在这种情况下,可以通过抓包分析找到验证码接口,从而获取验证码的真实值,直接输入进行验证。
- 示例:某系统的验证码是通过后台API生成,测试人员通过Fiddler抓取验证码接口,将验证码获取并用于登录。
- 第三方打码平台:对于复杂的图形验证码或滑块验证码,可以使用第三方打码平台(如超级鹰、若快)进行识别。这些平台提供接口,自动化测试工具可以通过调用这些接口来获取验证码的识别结果。
- 示例:在一次UI自动化测试中,某电商平台使用了滑块验证码,测试人员通过集成打码平台的API接口,自动识别滑块并完成测试。
- OCR技术:利用光学字符识别(OCR)技术,可以将图片中的文字转换为文本。目前比较成熟的OCR工具有Tesseract,它可以用来识别数字、字母验证码。
-
滑块验证码破解:滑块验证码需要通过模拟鼠标的移动轨迹来完成验证。在Python中,可以使用Selenium模拟拖动操作,并结合工具如OpenCV识别滑块位置。
- 示例:在某登录系统中,测试人员通过Selenium模拟鼠标拖动滑块,并使用OpenCV分析滑块与背景图之间的差异,从而精准完成验证操作。
实战案例:
01 需求分析
1.打开一个chrome浏览器
2.输入论坛的网址
http://114.116.2.138:8090/forum.php
3.输入用户名admin
4.输入密码123456
5.点击登录
6.输入验证码
7.再点击登录
02 准备工作
selenium环境搭建
参考地址:
- python 必须要3.7+(因为dddocr和selenium4.0都要求)
- pycharm
- chrome 浏览器
- chromedriver 驱动(与浏览器版本要配套)
- 配置PATH中含有chromedriver所在目录
- 安装selenium第三方库
03 操作步骤
第1步:导入webdriver模块
from selenium import webdriver
-
前提:安装好selenium 环境
-
需要了解:python导入语法
from 包名 import 模块
第2步:打开chrome浏览器
driver = webdriver.Chrome() # 启动浏览器驱动
-
用webdriver模块的Chrome类,对它实例化
-
Chrome首字符大写的,往往是Python中的类名
-
Chrome()这是一个实例化的过程
第3步:输入网址
driver.get("http://101.116.2.138:8090/forum.com") # 打开网站
-
字面翻译:使用driver.get()在浏览器上输入一个网址
http://101.116.2.138:8090/forum.com
-
get是HTTP的一种请求方式
(引申:学接口的要去懂更多的HTTP请求方式,POST/DELETE/PUT)
-
url的标准格式示例:
schema://[username:password@]IP|域名[:PORT]/资源?参数=参数值&参数=参数值
其中schema是协议,常见是http/https/file/FTP等
第4步:输入用户名|密码|点击登录
1 driver.find_element('css selector','#ls_username').send_keys('admin')
2 driver.find_element('css selector','#ls_password').send_keys('123456')
3 driver.find_element('css selector','', 'p.vm').click()
-
要会chrome开发者工具
F12/右键检查/CTRL+SHIFT+I
INSPECTOR工具左上角的(箭头)\leftarrow,移动到元素上点击即可获取该元素的HTML源码
-
要有HTML的基础
<input type="text" name="username" id="ls_username" autocomplete="off" class="pxvm" tabindex="901">
<标签名 属性名1=属性值1 属性名2=属性值2>文本</标签名>
-
find_element源码
def find_element(self, by=By.ID, value=None) -> WebElement:
"""
定位元素的方法
参数:
by: 定位方式,有8种方式
ID = "id" # ID属性定位
XPATH = "xpath" # XPATH定位
LINK_TEXT = "link text" # 链接的文本
PARTIAL_LINK_TEXT = "partial link text" # 部分链接的文本定位
NAME = "name" # name属性定位
TAG_NAME = "tag name" # 标签名定位
CLASS_NAME = "class name" # class属性定位
CSS_SELECTOR = "css selector" # css选择器定位
value: 对应方式的值
"""
-
八个定位方法:id、css、xpath是最常用的
-
css参考:
https://www.w3school.com.cn/cssref/css_selectors.asp
-
-
xpath参考:
https://www.w3school.com.cn/xpath/xpath_axes.asp
-
WebElement 是ind_element的返回值,可以在这个元素上输入:
-
send_keys
-
点击:click
-
获取文本:text
-
第5步:验证码输入
获取验证码图片
ele_pic = driver.find_element(By.CSS_SELECTOR, "[id^='vseccode_c']>img")
with open('code.png', 'wb') as f: # 打开code.png准备写入bytes数据
f.write(ele_pic.screenshot_as_png) # ele_pic.screenshot_as_png将当前这个元素的bytes数据写入
-
注意用到了css定位的[属性^=属性开头的值]的语法
-
python读写文件的open方法
-
wb是write,bytes
-
-
ele_pic.screenshot_as_png:就是当前这个元素的bytes数据
-
首次运行遇到错误
# Unable to locate element: {"method":"css selector", "selector":"[id^='vseccode_c']>img"}
# (Session info: chrome=103.0.5060.134)
-
点击了登录后,弹出这个提示,获取验证码,无法定位
-
点击操作往往会产生新的页面,新的页面加载的时候会出现延迟,这个时候等待就需要加入!!
-
引申:selenium的等待
-
强制:sleep
-
隐式:implicitly_wait
-
显式等待:
-
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
分析验证码的数据
-
ddddocr的用法
-
导入ddddocr
-
实例化
-
用classiication获取bytes数据的文本
import ddddocr # 导入ddddocr库
ocr = ddddocr.DdddOcr() # 实例化一个ocr对象
text = ocr.classification(ele_pic.screenshot_as_png) # 用classification方法获取bytes数据的文本
输入验证码
-
跟前面一样的,不再赘述
driver.find_element(By.CSS_SELECTOR, "[id^='seccodeverify_cS']").send_keys(text)
第6步:点击弹出框的登录
-
跟前面一样的,不再赘述
driver.find_element(By.CSS_SELECTOR, ".pn.pnc[name='loginsubmit']").click()
验证码的出现是为了防止机器人攻击,尤其是在用户注册、登录等关键环节。对于企业来说,验证码不仅提高了安全性,也让自动化测试面临新的挑战。破解验证码的方法虽然有效,但也需要在合规和安全的前提下进行,避免被滥用。
“验证码再强大,也难挡测试人员的智慧与工具!” ——合理运用工具与技术,让自动化测试更加轻松高效。