zoukankan      html  css  js  c++  java
  • Web自动化测试之图文验证码的解决方案

    对于web应用程序来讲,处于安全性考虑,在登录的时候,都会设置验证码,
    
    验证码的类型种类繁多,有图片中辨别数字字母的,有点击图片中指定的文字的,也有算术计算结果的,再复杂一点就是滑动验证的。
    
    诸如此类的验证码,对我们的系统增加了安全性的保障,但是对于我们测试人员来讲,在自动化测试的过程中,无疑是一个棘手的问题。

    1、Web 自动化验证码解决方案

    一般在我们测试过程中,登录遇到上述的验证码的时候,有以下种解决方案:

    • 第一种、让开发去掉验证码
    • 第二种、设置一个万能的验证码
    • 第三种、通过 cookie 绕过登录
    • 第四种、自动识别技术识别验证码

    2、验证码解决方案

    # coding:utf-8
    import os
    import subprocess
    from PIL import Image
    
    
    def get_captcha(driver, captcha_id, full_screen_img_path, captcha_img_path, captcha_final_path, txt_path, ocr_path):
        # 浏览器界面截图
        driver.save_screenshot(full_screen_img_path)
        # 找到验证码图片,得到它的坐标
        element = driver.find_element_by_id(captcha_id)
        left = element.location['x']
        top = element.location['y']
        right = element.location['x'] + element.size['width']
        bottom = element.location['y'] + element.size['height']
        left, top, right, bottom = int(left), int(top), int(right), int(bottom)
        img = Image.open(full_screen_img_path)
        img = img.crop((left, top, right, bottom))
        # 得到验证码图片
        img.save(captcha_img_path)
        # 打开验证码图片
        img = Image.open(captcha_img_path)
        # 颜色直方图,255种颜色,255为白色
        # 新建一张图片(大小和原图大小相同,背景颜色为255白色)
        img_new = Image.new('P', img.size, 255)
        for x in range(img.size[1]):
            for y in range(img.size[0]):
                # 遍历图片的xy坐标像素点颜色
                pix = img.getpixel((y, x))
                # print(pix)
                # 自己调色,r=0,g=0,b>0为蓝色
                if pix[0] < 20 and pix[1] < 20 and pix[2] > 50:
                    # 把遍历的结果放到新图片上,0为透明度,不透明
                    img_new.putpixel((y, x), 0)
        img_new.save(captcha_final_path, format='png')
    
        # 通过tesseract工具解析验证码图片,生成文本
        os.system(ocr_path)
    
        # 读取txt文件里面的验证码
        with open(txt_path, 'r') as f:
            if f.read():
                t = f.read().strip()
                # 去掉中间空格
                if ' ' in t:
                    t = t.replace(' ', '')
                if t.isdigit() and len(t) == 4:
                    return t
                else:
                    return 'fail'
    
    
    def check_resp(result, msg):
        if msg in result:
            return 'pass'
        else:
            return 'failed'
    
    
    # 接口 - 识别验证码
    def get_captcha(captcha_img_path, captcha_final_path, txt_path, ocr_path):
    
        # 打开验证码图片
        img = Image.open(captcha_img_path)
    
        # 新建一张图片(大小和原图大小相同,背景颜色为255白色)
        img_new = Image.new('P', img.size, 55)
        for x in range(img.size[1]):
            for y in range(img.size[0]):
                # 遍历图片的xy坐标像素点颜色
                pix = img.getpixel((y, x))
                # print(pix)
                # 自己调色,r=0,g=0,b>0为蓝色
                if pix[0] < 20 and pix[1] < 20 and pix[2] > 50:
                    # 把遍历的结果放到新图片上,0为透明度,不透明
                    img_new.putpixel((y, x), 0)
        img_new.save(captcha_final_path, format='png')
    
        # 通过tesseract工具解析验证码图片,生成文本,【Tesseract-OCR必须和jpg的根目录必须相同,如C盘、D盘!!!】
        os.system(ocr_path)
    
        # 读取txt文件里面的验证码
        with open(txt_path, 'r') as f:
            if r.read():
                t = f.read().strip()
                # 去掉中间空格
                if ' ' in t:
                    t = t.replace(' ', '')
                # 如果是数字且长度为4,就返回数字,如果不是就返回 fail
                if t.isdigit() and len(t) == 4:
                    return t
                else:
                    return fail
    

      

  • 相关阅读:
    bzoj 2337 [HNOI2011]XOR和路径【高斯消元+dp】
    bzoj 3196 Tyvj 1730 二逼平衡树【线段树 套 splay】
    bzoj 3528 [Zjoi2014]星系调查【树链剖分+数学】
    bzoj 2127 happiness【最小割+dinic】
    bzoj 3110 [Zjoi2013]K大数查询【树套树||整体二分】
    bzoj 4137 [FJOI2015]火星商店问题【CDQ分治+可持久化trie】
    运用背景橡皮擦抠透明郁金香
    使用快速通道抠荷花
    抠图总结
    花纹的选区
  • 原文地址:https://www.cnblogs.com/chenyablog/p/15162797.html
Copyright © 2011-2022 走看看