新闻动态

Jmeter验证码识别教程

2022-05-06

性能测试的脚本开发阶段,需要模拟用户输入,获取用户发送的请求,然后模拟用户发送数据。这种测试方式往往与系统的安全防御策略相冲突。一般性能测试中,通过删除验证码、万能验证码、使用已登录cookie等方式,绕过对验证码的限制,但是某些已上线系统或全链路测试中需要模拟用户真实操作,所以需要一些折中的办法实现。

下图为一个典型的登录界面,因为有验证码校验,所以自动化测试会遇到一些阻碍。

Jmeter验证码识别

 

市面上有很多已经封装好的识别工具,本次使用ddddocr进行识别,识别效果也是非常不错,对一些常规的数字、字母验证码识别有奇效。因为是性能测试,需要模拟大量用户并发请求,所以需要在请求识别图片的时候需要增加身份标识,比如这里被测系统将cookie与登录用户绑定,所以需要在urllib.request请求的http头中增加cookie内容。

# -*- coding: utf-8 -*-
import ddddocr
import urllib.request
import argparse

def ocrrun(imgurl,ocrcookie):
    ocr = ddddocr.DdddOcr(show_ad=False,use_gpu=True)
    img_src = imgurl
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.90 Safari/537.36 2345Explorer/9.5.2.18321',
        'cookie':ocrcookie
    }
    request = urllib.request.Request(url=img_src, headers=header)
    resp = urllib.request.urlopen(request)
    img_bytes = bytearray(resp.read())
    res = ocr.classification(img_bytes)
    print(res)

parser = argparse.ArgumentParser(description='ocr img')
parser.add_argument('--url', '-u', help='url of http img',required=True)
parser.add_argument('--cookie', '-c', help='cookie of login',required=True)
args = parser.parse_args()

if __name__=='__main__':
    try:
        ocrrun(args.url,args.cookie)
    except Exception as e:
        print(e)

处理验证码请求可以通过“后置处理器”或“函数助手”实现,本次使用函数助手实现,相对简单,新建工程,引入ApacheJMeter_core.jar,新建类继承AbstractFunction,重写getReferenceKey这样在函数助手中就能找到自定义的函数,在getArgumentDesc中设置输入,在execute中实现函数主体逻辑,通过命令执行的方式调用ddddocr识别验证码,这里注意输入参数中除了识别码url还需要设置对应的cookie。

public class ocr_function extends AbstractFunction {
 
	private CompoundVariable imgurl,ocrcookie;

    @Override
    public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
    	String img_url = imgurl.execute().trim();//获取填写数据
    	String ocr_cookie = ocrcookie.execute().trim();
    	StringBuilder str_cmd = new StringBuilder("python ");
    	str_cmd.append(System.getProperty("user.dir"));
    	str_cmd.append(File.separator);
    	str_cmd.append("pyocr");
    	str_cmd.append(File.separator);
    	str_cmd.append("ocr_image.py -u ");    	
    	str_cmd.append(img_url);
    	str_cmd.append(" -c ");
    	str_cmd.append(ocr_cookie);
    	String img_code = RuntimeUtil.execForStr(str_cmd.toString());
		return img_code.replaceAll("\r|\n", "");
    }
    @Override
    public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
        checkParameterCount(parameters, 2, 2);//填写数据规则,是否可以不填
        Object[] values = parameters.toArray();
        imgurl = (CompoundVariable) values[0];//获取数据
        ocrcookie = (CompoundVariable) values[1];
    }
    private static final String KEY = "ocr_img"; //函数名
    @Override
    public String getReferenceKey() {
        return KEY;
    }
    private static final List<String> desc = new LinkedList<>();
    static {
        desc.add("验证码url"); //函数助手中的名称
        desc.add("用户身份cookie");
    }
    @Override
    public List<String> getArgumentDesc() {
        return desc;
    }
}

将代码编译为jar包,放到jmeter目录下的lib/ext中,重新启动jmeter,能够在函数助手中找到自定义的函数

Jmeter验证码识别

 

在登录页面请求中获取cookie,并将cookie参数化后传入ocr函数中

Jmeter验证码识别

 

在实际测试中,识别成功率在80%左右,所以实际测试中还需要对脚本断言的判断进行优化

Jmeter验证码识别

在线充值在线咨询在线电话返回顶部

技术支持

电话咨询

19922193247

超10000+ 企业选择我们,快速体验!

温馨提示:我们将在您提交信息后的30分钟内与您取得联系,请您保持电话通畅,谢谢!