基于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 组织测试用例

原文地址:https://www.cnblogs.com/Finding-bugs/p/9404372.html