自动化测试解决验证码问题(从如何测试验证码中得到启发)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zbj18314469395/article/details/79954153
现在的很多网站在登陆时都需要验证码,倘若遇到自动化测试时,怎么解决呢?

验证码大概有以下几种:

有的是图片验证码:图片上显示数字,汉字,英文数字以及算术题等;
有短信/邮箱发送验证码:一般为四位/六位/八位数字验证码;

有语音验证码:电话接听语音播报此次验证码;

首先来说说我所遇到的项目经验:
项目有短信和邮箱两种方式发送8位的数字验证码。
短信验证码只做了手工测试,当时想的是短信验证码需要一台手机,并且能够发送验证码,由于当时没有做移动端的任何测试,考虑到成本问题只能在自动化测试是放弃这种登录验证方式,只保证功能在手工测试时正常通过;
然后在登陆时选择邮件发送验证码,如何取得验证码呢?
首先申请了一个公用邮箱,专门用来接收验证码,然后
写一个自动登录脚本登陆邮箱(好在邮箱登陆时不用验证码),解析邮件内容,获取验证码。

后来我不在这个项目了,听同事说是不再使用邮件和短信这种方式来验证了(是在确保了发送验证码这一功能上线正常之后才使用的),直接通过托管的日志文件管理工具Splunk去获取验证码,相当于绕过发送到短信/邮箱。

为了更好地解决问题,首先来了解一下验证码的机制:

为什么登陆时需要验证码?
没有验证码登陆,黑客会更加容易破解你的账号,通过组合码刷机等黑客技术来破取你的密码,有了验证码相当于加了一层很厚的屏障,安全系数很高。
验证码是一种区分用户是计算机和人的公共全自动程序。
验证码作用:可以防止恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),利用比较简易的方式实现了这个功能,同时验证码的样子也会尽量千奇百怪,让机器不能够识别。

验证码一般存储在哪里?(如何测试验证码)

验证码服务端存储设计:服务器生成验证码后,存储起来(缓存或者持久化),以方便用户提交验证码时进行验证。 
1、存储在本进程内存中:服务器生成验证码后,即将验证码存储在服务器中,一般以session方式进行存储。 
优点:性能好 
缺点:扩展性查、占用服务器内存 
如何测试:其他进程是访问不到服务进程的,只能在开发时服务进程内增加验证码查询接口,以方便验证,上线时,将此接口移除或禁用。 
2、存储在文件中 
3、存储在数据库中 

优点:可供多个服务进程查询 
缺点:性能稍差,占用数据库服务器性能 
如何测试:(1)进程内提供接口,方便查询(2)直接进行数据库查询 
4、存储在redis等nosql数据库中 
优点:性能高、一般nosql数据库提供集群功能,可靠性高 
如何测试:调用nosql的客户端驱动,进行查询


验证码的机制
前端:前端网页通过一个URL来对后端进行请求,通常会给这个请求带上一个时间戳或者是随机数。 
后端:接收到前端的request,后端会先生成一个随机数(通常4位),然后把该随机数存到与该客户端的session里面。随后把该随机数图像处理一下,变得让机器难以识别。随后把图片(jpg或者png)直接发送到前端(response)。

然后后端验证用户输入图片上的验证码/或短信邮箱中的验证码与后台生成的验证码是否一致,一致即可登录。

PS:前端想获得随机数的值,如果是模板型网页(如jsp、php、asp等)可以在服务器端访问session来获取值。而如果是RESTfulAPI型的,就只能通过ajax对服务器进行请求来获得值了。

自动化测试遇到验证码的启发:自动化测试时如何应对验证码

从上述的验证码测试方案中可以得出:在做自动化登陆的同时,可以采取同样四种的方式来取得验证码,绕过短信邮件图片验证码的识别读取过程(当然的确保验证码的功能模块实现已经正常)。

当然在自动化测试登陆过程中,还有几种应对方案:

其一:去掉验证码(测试环境)
这是最简单的方法,对于开发人员来说,只是把验证码的相关代码注释掉即可,线上环境取消注释验证码模块。如果是在测试环境,这样做可省去了测试人员不少麻烦,线上环境若是去掉验证码的话一般是不可取的,线上环境可选择下面的方案二。

其二:设置万能验证码(应该是最佳选择,但是需要开发人员的支持)
去掉验证码的主要是安全问题,为了应对在线系统的安全性威胁,可以在修改程序时不取消验证码,而是程序中留一个“后门”——设置一个“万能验证码” ,只要用户输入这个“万能验证码” ,程序就认为验证通过,否则按照原先的验证方式进行验证。

其三:验证码识别技术
例如可以通过 Python-tesseract等技术来识别图片验证码,Python-tesseract 是光学字符识别 Tesseract OCR 引擎的 Python 封装类。能够读取任何常规的图片文件(JPG, GIF ,PNG , TIFF 等)。不过,目前市面上的验证码形式繁多,目前任何一种验证码识别技术,识别率都不是 100% 。
目前有很多专门做验证码识别技术的,毕竟术业有专攻,也是不错之选,毕竟自己造轮子不大可取。

其四:记录 cookie
通过向浏览器中添加 cookie 可以绕过登录的验证码,这是比较有意思的一种解决方案。
我们可以在用户登录之前,手动登陆,获取cookie,通过 add_cookie()方法将用户名密码写入浏览器 cookie ,再次访问系统登录链接将自动登录。
但是有的Cookie有一个过期时间,一旦再次运行代码时就需要重新获取cookie,也造成一些麻烦。
栗子:Selenium+python 绕过验证码登陆百度

# -*- coding:GBK -*-
'''
Created on 2018年4月11日
@author: Peter
'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
import time

url = "http://www.baidu.com"
driver = webdriver.Chrome()
# driver = webdriver.Firefox()

# 隐性等待,最长等X秒(X秒内加载完成所有网页,则执行下一步操作)
# 整个driver的周期都起作用,所以只要设置一次即可
# 缺点 有时候页面想要的元素早就在加载完成了,但是因为个别js之类的东西特别慢,我仍得等到页面全部完成才能执行下一步
driver.implicitly_wait(30)  

driver.maximize_window()
driver.get(url)

driver.add_cookie({'name':'BAIDUID','value':'XXXXXXXXX:FG=1'})
driver.add_cookie({'name':'BDUSS','value':'XXXXXXXXXX'}) #此处为BDUSS的值

time.sleep(5)
driver.refresh()

username = driver.find_element_by_class_name("user-name").text
print(username)
阅读更多

没有更多推荐了,返回首页