zoukankan      html  css  js  c++  java
  • Python&selenium&tesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考

            在自动化测试或者安全渗透测试中,Captcha验证码的问题经常困扰我们,还好现在OCR和AI逐渐发展起来,在这块解决上越来越支撑到位。

    我推荐的几种方式,一种是对于简单的验证码,用开源的一些OCR图片处理包即可,对于复杂的识别率要求非常高的,可以考虑百度等公司的OCR有偿服务(当然注册后好像每天可以免费试用上百次,普通测试够用了)。

     

    本人环境: win10,python3.x, pip( python3安装版会自带), pycharm, tesseract-ocr-setup-3.02.02.exe,

                      pytesser3 ,pytesseract ,selenium(chrome浏览器以及匹配版本的浏览器驱动geckodriver.exe),pillow 5.3,pillow-PIL 0.1 

    注意事项: 

    A.务必单独下载安装tesseract-ocr-setup-3.02.02.exe(会自动配置好PATH环境变量),安装好后可以运行DOS命令执行

    tesseract  G: empcaptchaimage_code.png  g: empabc_123  digits_numbers

    tesseract 要识别的图片  识别出来后字符的保存文件,默认为.txt ,  tesseract安装后Tesseract-OCR essdataconfigs路径有个digits文件,可以定义识别白名单,比如只识别数字等,使用后可以提高识别率,可以在原来文件直接改,我这里是复制后修改并且重新命名为digits_numbers,如果不使用白名单命令行可以不加digits_numbers

    B.在pytesser3目录下的__init__.py文件里,要修改好以下这行,主要是配置好tesseract.exe的安装路径,注意.exe不需要写

    #请务必修改下面的tesseract的name 换成你安装的ocr路径,谢谢!
    tesseract_exe_name = 'D:\programs\Tesseract-OCR\tesseract' # Name of
    #tesseract_exe_name = 'c:\Program Files (x86)\Tesseract-OCR\tesseract'

    以下是pycharm下的工程包和OCR核心源码,至于后续识别后如何登陆就是普通的接口测试或者selenium等UI自动化范畴了,此处省略一万字。如果连UI自动化都不精,不建议直接做这个,赶快回家看书去。

     

     

    from selenium import webdriver
    import pytesser3
    import os
    import sys, time
    from PIL import Image, ImageEnhance

    url = "http://登陆的URL"

    driver = webdriver.Chrome()

    time.sleep(2)

    driver.get(url)

    time.sleep(5)

    try:
    account = driver.find_element_by_id('_account')
    password = driver.find_element_by_id('_password')
    region = driver.find_element_by_id('_regionId')
    captcha = driver.find_element_by_id('_captcha')
    except:
    print("查找元素出现异常")

    # 网页截图 + 验证码截图
    try:
    driver.get_screenshot_as_file('G:\temp\page\loginPage1.png') # 比较好理解
    im = Image.open('G:\temp\page\loginPage1.png')
    box = (884, 684, 1024, 734) # 设置要裁剪的区域,这个坐标是验证码图片这个长方形的左上角坐标和右下角坐标,不懂可以问UI美工,用图形编辑工具很容易获得
    region = im.crop(box) # 此时,region是一个新的图像对象。
    region.save("G:\temp\captcha\image_code.png")
    except:
    print("网页截图 + 验证码截图出现异常")

    driver.close()
    # --------------------图片增强+自动识别简单验证码-----------------------------
    # 防止图片还没保存好,就开始识别
    time.sleep(3)
    im = Image.open("G:\temp\captcha\image_code.png")
    imgry = im.convert('L') # 图像加强,二值化
    sharpness = ImageEnhance.Contrast(imgry) # 对比度增强
    sharp_img = sharpness.enhance(2.0)
    sharp_img.save("G:\temp\captcha\image_code.png")


    time.sleep(2)

    def image_file_to_string(file):
    cwd = os.getcwd()
    try:
    os.chdir("D:\programs\Tesseract-OCR")
    return pytesser3.image_file_to_string(file)
    finally:
    os.chdir(cwd)

    # code即为识别出的图片数字str类型
    code = image_file_to_string("G:\temp\captcha\image_code.png")
    time.sleep(1)
    print(code)

    后续省略一万字,自己用次code去完成接下来的自动化登陆即可....
    有些复杂点的图片验证码识别率不高,是的,一开始我就说了,







    改进参考: 

    1. 真正应用的时候可以考虑把打开浏览器,截图等事情换个实现方式,使用内核浏览器操作,而非真正打开可见的浏览器,这样更快。

    2. OCR识别部分还需要用你要实现产品的验证码样本进行tesseract的进一步学习训练,或者换用商用OCR工具,识别率更高



  • 相关阅读:
    使用xorm将结构体转为sql文件
    Java反射之方法反射demo
    Java操作Redis小案例
    Java中static修饰类的问题
    static、final修饰的变量和方法能否被继承的问题
    小学生算术
    另一种阶乘问题
    整除个数
    兰州烧饼
    对决
  • 原文地址:https://www.cnblogs.com/sea520/p/10030317.html
Copyright © 2011-2022 走看看