这几天编写自动化测试脚本,本以为非常简单,结果研发登录页面竟然多了验证码,当时与研发人员沟通,希望屏蔽掉验证码,结果研发人员回复忙没时间,沟通多次无果后,决定采用现有工具识别验证码,即采用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 组织测试用例