【测试技巧】自动化测试中验证码的一种解决思路

最近针对公司网站写自动化测试脚本,对于验证码的问题,之前的解决方案是让开发在每次需要自动化测试及性能测试时对需要测试的环境惊醒去验证码,等测试完再把验证码还原。对于测试来说,验证码一直都是难题,要做到识别很费精力并且识别率并不高,设置万能验证码会降低网站的安全性,而每次都进行去验证码则过于浪费人力并且测试的真实性得不到保障。于是想了一种思路,既可以一次解决测试部的验证码问题,又不会有任何安全影响,已被公司采用,这里给大家分享一下思路:
先看下验证码生成部分的源码:


static function buildImageVerify( $length=5, $mode='8', $type='png',
$width=65, $height=30, $size=14, $verifyName='verify') {
import('ORG.Util.String');
$randval = strtolower(String::randString($length, 8));
session($verifyName, md5($randval));
//其他代码
}

生成4位随机字符MD5加密保存到session中,校验的时候把用户输入的验证码md5再和session中的md5比对。
于是在登录类的代码中添加一个方法:


public function setcode($key) {
if ($key=='nobody'){
session('verify','098f6bcd4621d373cade4e832627b4f6');
die('test');
}
}

其中098f6bcd4621d373cade4e832627b4f6为md5(‘test’),nobody为自行设置的密码
公司登录类的访问地址为
http://www.baidu.com/login
则访问
http://www.baidu.com/login/setcode/password
即可把当前session的验证码设置为test

针对python+selenium写了个方法命名为setverify


import requests
def setverify(sess):
cookie=dict(PHPSESSID=sess)
url='http://www.baidu.com/Login/setcode/key/nobody'
r=requests.get(url,cookies=cookie)
return(r.text)

则在遇到验证码时只要加一段


setverify(driver.get_cookie("PHPSESSID")['value'])

便可以把验证码设置成test

====================================================================

python代码示例:


from selenium import webdriver
import requests
driver.get("http://www.baidu.com/login")
driver.find_element_by_id('username').send_keys(userName)
driver.find_element_by_id('password').send_keys(pwd)
driver.find_element_by_id('sendnumber').send_keys(setverify.setverify(driver.get_cookie("PHPSESSID")['value']))
driver.find_element_by_id('button').click()
def setverify(sess):
cookie=dict(PHPSESSID=sess)
url='http://www.baidu.com/Login/setcode/key/nobody'
r=requests.get(url,cookies=cookie)
return(r.text)

这样便解决了验证码的问题