zoukankan      html  css  js  c++  java
  • 基于selenium模块的Python 自动化脚本(三)_页面验证码识别方法

            这几天编写自动化测试脚本,本以为非常简单,结果研发登录页面竟然多了验证码,当时与研发人员沟通,希望屏蔽掉验证码,结果研发人员回复忙没时间,沟通多次无果后,决定采用现有工具识别验证码,即采用Pillow进行登录页面截图处理,tesseract开源库和pytesseract进行验证码识别。

    1. tesseract安装和配置

    参考博客:https://www.cnblogs.com/hupeng1234/p/7136442.html

    2. pytesseract安装

             采用 pip 命令安装 pytesseract 和 Pillow。针对Windows,在命令行窗口输入

           pip install pytesseract

           pip install Pillow

     

    3.  验证码识别代码

    from PIL import Image
    import pytesseract
    from PIL import ImageGrab
    def Verification_Code_identify(picture_name,left_distance = 995 , upper_distance = 430, 
    right_distance = 1110, lower_distance = 490 ):
    """
    :param picture_name: 用于给定包含验证码的图片
    """
    vcode = ''
    iden_time = 2
    img = Image.open(picture_name)
    cropedIm = img.crop((left_distance, upper_distance, right_distance, lower_distance)) #裁剪图片
    cropedIm.save(picture_name)
    #cropedIm.show()
    cropedIm.load()
    while len(vcode) != 4:
    vcode = pytesseract.image_to_string(cropedIm,config=tessdata_dir_config)
    iden_time = iden_time - 1
    if iden_time <= 0:
    break
    return vcode

    在此段代码中,由于被识别验证码长度为4个字母,因此增加验证码识别判定,并最多识别2次。

     

    4 登录代码

    def login_in_webnet(self):
            flag_success = 0
            while flag_success == 0:
                image_save = ImageGrab.grab()
                image_save.save('验证码截图.jpg')
                verfication_code = .Verification_Code_identify('验证码截图.jpg')
                Username_Loc = (By.CSS_SELECTOR, "loc")
                Password_loc = (By.CSS_SELECTOR, "loc")
                loc_check_code = (By.CSS_SELECTOR, "loc")
                Submit_Loc = (By.CSS_SELECTOR, "loc" )
                # 输入用户名
                self.find_element(*Username_Loc).clear()
                self.find_element(*Username_Loc).send_keys('')
                # 输入密码
                self.find_element(*Password_loc).clear()
                self.find_element(*Password_loc).send_keys('')
                # 输入验证码
                self.find_element(*loc_check_code).clear()
                self.find_element(*loc_check_code).send_keys(verfication_code)
                # 提交
                self.find_element(*Submit_Loc).click()
                sleep(2)
                if 'login' in (self.get_current_website_string()):
                    self.driver.refresh()
                else:
                    flag_success = 1
                sleep(1)

             由于验证码识别准确率并非100%,因此在登录时要增加验证码错误处理。在上述代码中,增加若登录失败,则刷新页面重新进行验证码识别和登录。

    5小结

       验证码识别采用的工具及作用

    Pillow:用于登录页面截图和 截图后的裁剪

    tesseract开源库: 用于验证码识别

    pytesseract: Python 第三方库,用于调用tesseract

    应用注意事项:

               1、应用前应先做验证码识别实验,保证识别准确率达到90%以上。

               2、编写登录页面 建议 放在Page类内,作为类方法

               3、建议采用unittest 组织测试用例

  • 相关阅读:
    leetcode_1423. 可获得的最大点数
    leetcode_剑指 Offer 06. 从尾到头打印链表
    leetcode_剑指 Offer 05. 替换空格
    leetcode_49. 字母异位词分组
    leetcode_73. 矩阵置零
    leetcode_26. 删除排序数组中的重复项
    jstack查看JVM堆栈信息
    如何画一张架构图
    百年孤独家谱
    阿尔萨斯(Arthas)入门
  • 原文地址:https://www.cnblogs.com/Finding-bugs/p/9404372.html
Copyright © 2011-2022 走看看