【自动化测试】web自动化测试验证码如何测?如何处理验证码问题?解决方案......
目录:导读
- 前言
- 一、Python编程入门到精通
- 二、接口自动化项目实战
- 三、Web自动化项目实战
- 四、App自动化项目实战
- 五、一线大厂简历
- 六、测试开发DevOps体系
- 七、常用自动化测试工具
- 八、JMeter性能测试
- 九、总结(尾部小惊喜)
前言
在对安全性有要求的软件(系统)中都存在验证码,那我们应该怎么进行测试呢,在自动化测试中又该怎么通过验证码使自动化顺利进行下去呢?
验证码的由来和作用
验证码,是一种区分其用户是计算机还是人类的公共全自动程序算法。这个验证码形式的问题是由计算生成并评判,但必须只允许有意识的人才能解答。
现在被广泛用于安全信息领域,以有效防范恶意的程序算法对信息系统进行暴力性的攻击破解,比如:防范密码破解、信息盗窃、钱财转移等恶意行为。
同时也发展为多种形式的验证码。常见的有手机短信验证码、Email验证码、视频验证码、手机语音验证码、拼图验证码、静态图文验证码、GIF动态图文验证码等,其中图文验证码是网站验证中最常见的一种。
验证码的存储
既然在网页中的验证码是图文验证码,以图片文字的形式显示出来,那么在网页源码可能存在于以下几种方式:
- 存储于文件中;
- HTML语句中直接放入经过编码的验证码信息;
- HTML语句中直接放入请求的验证码URL信息;
- 计算机生成验证码后,一般以session方式将验证码存储在服务器进程;
- 存储于redis等nosql数据库中,通过调用nosql的客户端驱动查询;
- 存储于数据库,通过进程内的接口进行查询或者直接进行数据库查询;
- 计算机服务器生成验证码后,就会缓存起来,原因在于方便用户提交验证码时进行验证。
验证码的原理
当用户需要验证时,服务器端将内存中临时生成的验证码发至客户端,为了其安全性,通常在发送后的一个有效时间内(比如:1分钟)就会删除其验证码,用户在有效时间内输入验证答案。其具体过程如下:
首先,前端网页通过一个URL来对后端进行请求;
接着,后端接收到前端的请求后,它将生成一个随机图文,然后把该随机图文存储于与对应客户端的session中;
然后,将该随机图文进行图像处理,使计算机难以识别而人类容易辨别,经过处理的图文(.png、.jpg等多种格式)直接发至前端;
最后,前端验证用户输入图文的验证答案,与后端生成的验证码是否一致,若一致则成功登录获取消息,反之不能通过。
如何测试验证码?
测试验证码,既要测其功能性,又要测其安全性;手动测试和自动化测试均不可缺少,相互互补,尽可能覆盖缺陷。
手动测试
手动测试的核心,测试用例的设计。
针对验证码测试的测试用例主要参考点如下:
| 有效时间内 | 有效时间内 |
|---|---|
| 输入图文中正确的顺序的验证码 | 输入图文中正确的顺序的验证码 |
| 输入图文中正确的倒序的验证码 | 输入图文中正确的倒序的验证码 |
| 输入已验证过的正确验证码 | 输入已验证过的正确验证码 |
| 输入正确验证码的部分 | 输入正确验证码的部分 |
| 不输入任何信息 | 不输入任何信息 |
| 空格输入 | 空格输入 |
| 空格+正确验证码 | 空格+正确验证码 |
| 正确验证码+空格 | 正确验证码+空格 |
| 输入验证码+空格+验证码” | 输入验证码+空格+验证码” |
| 输入特殊字符 | 输入特殊字符 |
| … | … |
根据完善的测试用例一步一步执行,最大化做到细致精准。
自动化测试
针对验证码的性质,随机生成的验证码不能使计算机简单的识别,这一点使自动化测试遇到了一定的困难瓶颈,通俗的说:验证码和自动化测试是对着干的。
因此,自动化工具测试到验证码时,针对不同程度安全性的要求,使用相应效率的解决方案。其解决方案包括:注释验证码、设置验证码开关、设置万能验证码、记录Cookies信息、验证码图文识别等。
注释验证码模块(现在很少用这种方案)
这是在安全性要求较低的情况下的解决方案,经过项目组的沟通,在测试阶段,开发人员将验证码模块的相关代码注释掉,等上线时取消注释。
当然这样给测试人员在测试阶段减小了麻烦,但是上线正式生产环境中,该验证码模块可能给系统带来一定的障碍风险。
设置验证码开关(也不推荐)
项目组的沟通,开发人员设置一个验证码开关模块,当手动测试时,按着测试用例进行执行;当自动化测试时,关闭验证码模块。
设置万能验证码(当前主流做法)
这是在安全性要求相对较高的情况下的解决方案,经过项目组的沟通,开发人员设置一个万能验证码。在设置万能验证码时,应当区分测试环境与生产环境。
比如:判断当前是否是测试环境(通常情况下根据读取服务器配置文件就可判断是否是测试环境)。如果是,则输入万能验证码直接通过;如果不是,则继续按着正常的验证流程去验证。
设置万能验证码的解决方案与注释验证码的解决方案相比,该方案设置的万能验证码模块的代码可以上线,几乎不会给系统带来障碍风险,同时这样,手动测试与自动化测试均很方便。
记录Cookies信息(不太推荐,对于复杂的验证方式这种方式可以考虑)
通过向browser添加Cookies,这样就可以绕过介入的验证码,而在用户介入前通过add_cookie( )方法将介入信息添加到Cookies,这样一来,若再一次访问系统时将自动的介入。
但是记录Cookies还是存在不足。一方面体现在有效Cookies是有时间限制,一旦过期无效,再次访问系统时需要重新获取;另一方面体现在如果找不到输入框名,就无法向输入框内输入介入信息。
验证码图文识别(作为安全性测试的一部分)
如果测试人员用图文识别技术解决了自动化测试动态随机验证码,那这也相当于产品的一个Bug,使其系统并不是那么具有安全性。
但为了系统的完整性,针对高级别程度安全需求的系统,利用验证码图文识别技术进行测试。
OCR图像识别(同样作为安全性测试的一部分)
当前OCR图像识别技术已经比较成熟,能够很容易地识别出简单的图文验证码。对此大多数网站都逐步提升了图文验证码的复杂度。
比如:加噪、扭曲图文等操作。当然这种对抗也正是系统不断升级的原因,敌对性发展。
针对图文验证码的加噪,测试时应当对图文先降噪,再识别;针对图文验证码的扭曲,测试时应当Machine Learning、Pattern Recognition等技术算法提取图文特征,再匹配正确的图文验证码。
Python-tesseract图像识别(同样可作为安全性测试的一部分)
除了OCR图像识别技术,还可以通过Python-tesseract识别图文验证码,需要用到tesseract-ocr图像识别工具,能够读取.png、.jpg、.gif等常规格式的图片文件。
| 下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战

四、App自动化项目实战

五、一线大厂简历

六、测试开发DevOps体系

七、常用自动化测试工具

八、JMeter性能测试

九、总结(尾部小惊喜)
只有你学会把自己已有的成绩都归零,才能腾出空间去接纳更多的新东西,如此才能使自己不断的超越自己。
并不是随着年纪的成长,每一个人都会变得更加成熟的,有的人就算是见得多,也不一定懂得多。凡事靠自己,也要相信自己。
人活着就是为了解决困难。这才是生命的意义,也是生命的内容。逃避不是办法,知难而上往往是解决问题的最好手段。
相关文章:
【自动化测试】web自动化测试验证码如何测?如何处理验证码问题?解决方案......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 在对安全性有要求的…...
面试浅谈之 C++ STL 篇
面试浅谈之 C STL 篇 一 🏠 概述 HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是面试浅谈系列,收录在专栏面试中 😜😜😜 本系列将记录一些阿呆个人整理的面试题…...
【PTA Advanced】1144 The Missing Number(C++)
目录 题目 Input Specification: Output Specification: Sample Input: Sample Output: 思路 代码 题目 Given N integers, you are supposed to find the smallest positive integer that is NOT in the given list. Input Specification: Each input file contains…...
oracle的sqlnet.ora文件配置传输加密算法
sqlnet.ora文件位于ORACLE_HOME/network/admin目录中。sqlnet.ora文件中增加如下:SQLNET.ENCRYPTION_SERVER REQUIRED SQLNET.ENCRYPTION_TYPES_SERVER (RC4_256) SQLNET.CRYPTO_CHECKSUM_SERVER REQUIRED SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER MD5SQLNET.ENCRYP…...
RK3568存储性能测试
USBU盘储存性能参数(USB3.0接口)参数测试条件最小典型最大单位说明写速度写入1GB数据—32.6—MB/sU盘型号:KODAK,32GB USB3.0读速度读取1GB数据—66.7—MB/s 备注HW356X-CORE-4GB-32GBHW356X-GKA,操作系统:LinuxU盘储存性能参数(U…...
Homekit智能家居一智能灯泡
一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时,它们可以通过声控、触控、红外等方式进行控制,或者带有调光开关,让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块,可与手机、家庭智能助手、或其他智能…...
轻量级 Java 权限认证框架——Sa-Token
文章目录Sa-Token 介绍SpringBoot 集成 Sa-TokenSa-Token 功能登录认证会话查询Token 查询权限认证权限校验角色校验注解鉴权注册 Sa-Token 拦截器关闭注解校验路由拦截鉴权注册 Sa-Token 路由拦截器[记住我] 模式密码加密Sa-Token 集成 Redis方式1、使用 jdk 默认序列化方式方…...
算法复习(四、五、六)
动态规划 动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构、重叠子问题 关于动态规划算法和备忘录方法的适用条件: 要求: 用分治法和动态规划法分别解决最大子段和问题(第四步求最优解不需要掌握ÿ…...
SORT与DeepSORT简介
一、MOT( mutil-object tracking)步骤 在《DEEP LEARNING IN VIDEO MUTIL-OBJECT TEACKING: A SURVEY》这篇基于深度学习多目标跟踪综述中,描绘了MOT问题的四个主要步骤 1.跟定视频原始帧 2.使用目标检测器如Faster-rcnn, YOLO, SSD等进行检测,获取目标…...
TCP/IP网络编程——多播与广播
完整版文章请参考: TCP/IP网络编程完整版文章 文章目录第 14 章 多播与广播14.1 多播14.1.1 多播的数据传输方式以及流量方面的优点14.1.2 路由(Routing)和 TTL(Time to Live,生存时间),以及加入组的办法14…...
K8S DNS解析过程和延迟问题
一、Linux DNS查询解析原理(对于调用glibc库函数gethostbyname的程序)我们在浏览器访问www.baidu.com这个域名,dns怎么查询到这台主机呢? 1、在浏览器中输入www.baidu.com域名,操作系统会先查找本地DNS解析器缓存&a…...
【JavaScript】js实现深拷贝的方法
前言 在js中我们想要实现深拷贝,首先要了解深浅拷贝的区别。 浅拷贝:只是拷贝数据的内存地址,而不是在内存中重新创建一个一模一样的对象(数组) 深拷贝:在内存中开辟一个新的存储空间,完完全全…...
RK3288 GPIO记录
1、引脚对应的GPIO 编号第一种 使用/sys/kernel/debug/gpio查询所有gpio引脚的基数第二种 cat /sys/class/gpio/gpiochip248/label对应的label就是GPIO引脚,例如下图GPIO8对应的基数就是2482、计算编号编号 基数 PIN脚如GPIO8的基数是248, GPIO8_A6的编…...
MongoDB介绍及使用教程
文章目录一、MongoDB介绍1. 什么是MongoDB2. 为什么要用MongoDB3. MongoDB的应用场景4. MongoDB基本概念二、MongoDB使用教程1.下载安装(Windows)2.MongoDB Conpass简单使用(选学)3.使用navicat连接MongoDB4.JAVA项目中使用MongoD…...
51单片机开发环境搭建 - VS Code 从编写到烧录
我安装并测试成功的环境: 操作系统:Windows 10 (22H2)单片机:STC89C52RCPython version: 3.7.6 在这之前,给51单片机写程序是用 Keil 5(编写编译)、STC-ISP(烧录),由于…...
python datetime、字符串和时间戳之间的相互转换12小时制和24小时制时间相互转化
文章目录1.字符串转datetime格式2.datetime转字符串3.时间戳转datetime格式4.datetime格式转时间戳5.应用:将12小时制的字符串转换为时间戳1.字符串转datetime格式 把字符串转换为datetime的格式 项目字符串的样子‘%m/%d/%Y %H:%M:%S’2/3/2023 15:30:20‘%m-%d-…...
百度百科词条怎么做?百度百科词条创建攻略分享
只要是想要将自己宣传出去的企业或是个人,都建议创建属于自己的百度百科词条,因为百度百科词条流量大、权重高、排名靠前,创建百度百科词条可以提高企业或是个人的知名度和口碑。 百度百科词条怎么做?每天都有用户在百度上搜索这…...
基于Hive的河北新冠确诊人数分析系统的设计与实现
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…...
k8s二进制部署
目录 一、环境准备 常见的k8s部署方式 关闭防火墙 关闭selinux 关闭swap 根据规划设置主机名 在master添加hosts 将桥接的IPv4流量传递到iptables的链 时间同步 二、部署etcd集群 1、master节点部署 #查看证书的信息 上传etcd-cert.sh 和etcd.sh 到/opt/k8s/ 目录…...
Windows出现0xc00d36e5错误怎么办?
当我们使用Windows Media Player来播放视频文件时,可能会出现无法播放,并显示0xc00d36e5错误代码。该错误可能是因为Windows Media Player不支持视频格式、注册表项损坏、系统配置问题、第三方应用程序冲突等。下面将开始介绍0xc00d36e5错误的解决方法&a…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...
