用HTTP协议写自动化测试时暂时跳过验证码

用HTTP协议写自动化测试时临时跳过验证码

用HTTP协议写自动化测试时临时跳过验证码

这两天测试了一个问答系统,由于开发和测试时间比较紧迫,没有时间屏蔽掉验证码

测试的需求是:

1.模拟用户在网站提出大量问题

2.问题的模板从其他同行业网站上抓取

3.调用提问action前必须以管理员身份登录

 

解决办法:

以下均由自动化脚本实现

1.urllib先请求登录页,脚本提示输入验证码

2.urllib从登录页获取验证码图片的地址

3.urllib请求该图片地址,将图片保存,os.system自动打开图片,

4.raw_input提示测试人员输入验证码

5.urllib提交登录表单(使用刚输入的验证码,放心,由于session没有变,验证码是有效的)

6.完成登录,开始不停调用提交问题的action(从之前抓取保存的问答模板中,每行是一个问题,逐行提交问题)

 

 

下面是脚本:

 

1.管理员登录的脚本

class askAdminLogin(object):
    '''问答管理员登录'''
    def __init__(self, username):
        self.username = username
    
    def runcase(self):
        username = self.username
        logger.info("管理员登录:")
        
        #构建http
        cookie = cookielib.CookieJar()
        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
        urllib2.install_opener(opener)
        
        #构造数据
        req = urllib2.Request("http://10.105.20.11:9090/xxxxx/xxx/admin/login.action")
        req_logger(req)
        
        #请求action
        fp = urllib2.urlopen(req)
        resp = fp.read()
        srandimgurl = re.findall('<img src="(.+)" alt="验证码"', resp)[0]
        
        req = urllib2.Request("http://10.105.20.11:9090" + srandimgurl)
        req_logger(req)
        
        #请求action
        fp = urllib2.urlopen(req)
        resp = fp.read()
        
        srandimg = file('srandimg.jpeg', 'wb')
        srandimg.write(resp)
        srandimg.close()
        os.system('srandimg.jpeg')
        
        srand = raw_input("请手动输入验证码后按回车")
        
        #构造数据
        req = urllib2.Request("http://10.105.20.11:9090/xxxxx/xxx/admin/dologin.action")
        data = urllib.urlencode({"userName":username["LOGINNAME"],    #用户名
                                 "password":username["LOGINNAME"].split("@")[0],  #密码
                                 "checkcode":srand})   #验证码
        req_logger(req, data)
        
        #请求action
        fp = urllib2.urlopen(req, data)
        resp = fp.read()
        geturl = fp.geturl()
        
        assert '<title>宜人问答管理中心</title>' in resp, "登录未成功, 服务器返回:%s" % resp
        assert "http://10.105.20.11:9090/xxxxx/xxx/admin/questionView.action" in geturl, "页面跳转不正确:%s" % geturl
    
        return opener, cookie


 

 

2.发布新知识问答的脚本

class addKnowledge(object):
    '''发布新知识'''
    def __init__(self, username):
        self.username = username
    
    def runcase(self):
        username = self.username
        
        logger.info("发布新知识:")
        
        dbopra = db_update()
        sql = 'delete from QA_KNOWLEDGE_TYPE_LINK t'
        dbopra.set_value(sql)
        sql = 'delete from QA_KNOWLEDGE t'
        dbopra.set_value(sql)
        
        #构建http
        lg = askAdminLogin(username)    #调用登录功能
        opener, cookie = lg.runcase() 
        urllib2.install_opener(opener)
        
        req = urllib2.Request("http://10.105.20.11:9090/xxxxx/xxx/admin/showAddKnowledge.action")
        req_logger(req)
        fp = urllib2.urlopen(req)
        resp = fp.read()
        
        ktypes = re.findall('<option value="(\d+)"', resp)
        
        fpfile = file('paipai.txt', 'r')
        for eachline in fpfile:
            alist = eachline.split('\t')
            ktitle = alist[1]
            kcontent = alist[2]
            ktype = random.Random().choice(ktypes)
            
            #构造数据
            req = urllib2.Request("http://10.105.20.11:9090/xxxxx/xxx/admin/updateKnowledge.action?t=%s" % str(time.time()).split('.')[0])
            datapara = (("ktitle", ktitle), 
                        ("kcontent", kcontent), 
                        ("ktype",ktype))
            data = urllib.urlencode(datapara)  
            req_logger(req, data)
            
            #请求action
            fp = urllib2.urlopen(req, data)
            resp = fp.read()
            
            if '添加成功' not in resp:
                logger.critical('服务器返回不正确:%s' % resp)
            
        fpfile.close()
        return opener, cookie


 

 

附图:

1.之前用脚本抓取的一些数据,用于当做问答知识一条条发布

用HTTP协议写自动化测试时暂时跳过验证码

 

2.每次自动保存的验证码图片

用HTTP协议写自动化测试时暂时跳过验证码

 

 

3.脚本运行了不到一分钟后,每个分类都插入了一些问答知识

用HTTP协议写自动化测试时暂时跳过验证码

 

 

总结:

这个脚本应该可以更好的理解验证码,浏览器在请求登录页面的时候,其实是先获取了主页返回的HTML,然后加载HTML又自动请求了里面的验证码图片地址,

验证码是服务每次请求时生成的(先生成随机4位数字,再将数字转换成图片),每次生成的随机4位数字会和SESSION进行绑定

在这个SESSION里且不刷新,这个验证码就是有效期的