自动化测试验证码处理不了?看这里 ->>> pytesseract库登录验证码识

 

点击这里获取更多学习资料 --->>> 获取更多学习资料

 

1、调用第三方图片识别接口,这里没有找到比较好的免费的接口,有的同学可以分享哈~

 

2、使用cookie绕过登录直接访问页面,webdriver 中有操作cookie的方法,获取、添加、删除

# 思路:登录成功获取cookie保存到文件中 -> 添加 cookie 打开页面直接访问,

注意:.ini 配置文件中不能写入 % 字符,保存cookie时候需要替换下

    def get_cookie(self, option):
        """
        获取登录后的cookie值
        :param option: 配置文件中标题的值
        :param section: 对应key值
        :return:
        """
        # 由于.ini文件中不能写入 % 字符,会报错,替换成 $ 后写入
        cookieValue = str(self.driver.get_cookies()).replace("%", "$")
        Log.info("获取浏览器cookie值: {}...".format(cookieValue[:50]))
        # cookie值保存到配置文件
        rwParams.write_ini_file(section="LOGIN_COOKIE", option=option, value=cookieValue) 
  
    def set_cookie(self, option):
        """
        设置携带cookie访问网页
        :param option: 索要获取的cookie对应key值
        :return:
        """
        cookieStr = rwParams.read_ini_file(section="LOGIN_COOKIE", option=option)
        # 保存的cookie值中需要把 $ 字符替换为 % 字符, 且转化为原格式
        cookieValue = eval(cookieStr.replace("$", "%"))
        # 添加cookie, 原格式是个列表循环添加
        [self.driver.add_cookie(cookie) for cookie in cookieValue]
        Log.info("给浏览器添加cookie值: {}...".format(cookieStr[:50]))

    def del_cookie(self):
        """删除cookie"""
        self.driver.delete_all_cookies()
        Log.info("删除当前添加的所有cookie值")

 

3、最简单的方法,联系开发再项目代码中设置万能验证码,直接输万能码

 

4、降噪方法可以多执行几次,多次处理图片,还可以对图片进行切割处理,单个图片进行识别,目前只能识别不扭曲的验证码和干扰线不粗的验证码图片

# 思路:验证码图片转称黑白色 -> 遍历每个像素点判断周围8个点的颜色 -> 有4个以上的不同的颜色就判断该点为底色 -> 使用ocr工具进行识别处理后的验证码

# -*- coding: utf-8 -*-

# @Author  : Mr.Deng
# @Time    : 2021/3/21 14:34

"""
图片识别,登录页面验证码文字识别
"""
from util.basePages import BasePages
from config.filePathConfig import FilePathConfig
from config.varConfig import SysConfig as SC

from PIL import Image
from pytesseract import pytesseract

import re


class ImageRecognize:

    def __init__(self, driver):
        self.base = BasePages(driver)
        self.imageSavePath = FilePathConfig.CODE_IMG_SAVE_PATH + "\\" + "shotCode.png"

    def save_code_image(self, elementPath, zoomNum=1.25):
        """
        截图保存验证码图片
        :param elementPath:
        :param zoomNum: 电脑屏幕缩放比例,125% , zoom = 1.25
        :return:
        """
        self.base.driver.origin_driver.get_screenshot_as_file(self.imageSavePath)
        imageData = self.base.driver.get_location(elementPath)
        # 图片左右高低尺寸坐标,要乘以屏幕缩放比例
        left = imageData["x"] * zoomNum
        top = imageData["y"] * zoomNum
        right = left + imageData["width"] * zoomNum
        bottom = top + imageData["height"] * zoomNum
        self.imageObj = Image.open(self.imageSavePath)
        codeImage = self.imageObj.crop((left, top, right, bottom))
        codeImage.save(self.imageSavePath)
        return codeImage

    def binarization_image(self, image):
        """
        验证码图片二值化转化成黑白色
        :param image: 图片保存对象
        :return:
        """
        imageCode = image.convert("L")
        pixelData = imageCode.load()
        row, col = image.size
        threshold = 150 # 150 灰色
        for i in range(row):
            for y in range(col):
                if pixelData[i, y] > threshold:
                    pixelData[i, y] = 0
                else:
                    pixelData[i, y] = 255
        return imageCode

    def delete_noisy_point(self, image):
        """
        降噪,删除多余的干扰线像素点
        :param image: 图片对象
        :return:
        """
        pixelData = image.load()
        row, col = image.size
        # 判断图片中黑白像素点的多少,判断那种颜色是背景色,那个是验证码颜色
        poxList = []
        for x in range(row - 1):
            for y in range(col - 1):
                poxList.append(pixelData[x, y])
        # 按像素点多少降序排列,多的是背景,少的是验证码
        newList = sorted(set(poxList), key=lambda x: poxList.count(x), reverse=True)
        # 循环判断每个像素点上下左右,左上,右上,左下,右下八个像素点的颜色值
        for a in range(row - 1):
            for b in range(col - 1):
                count = 0
                if pixelData[a, b - 1] == newList[0]: count += 1 # 上
                if pixelData[a, b + 1] == newList[0]: count += 1 # 下
                if pixelData[a - 1, b] == newList[0]: count += 1 # 左
                if pixelData[a + 1, b] == newList[0]: count += 1 # 右
                if pixelData[a - 1, b - 1] == newList[0]: count += 1 # 左上
                if pixelData[a - 1, b + 1] == newList[0]: count += 1 # 左下
                if pixelData[a + 1, b - 1] == newList[0]: count += 1 # 右上
                if pixelData[a + 1, b + 1] == newList[0]: count += 1 # 右下
                # 统计周围四个以上的点都是背景色,则该点就是背景色,否则验证码色
                if count > 4:  pixelData[a, b] = newList[0]
        image.save(self.imageSavePath.replace("shotCode", "ProcessedImage")) # 保存处理后的验证码
        return image

    def image_str(self, image):
        """识别处理后的验证码图片"""
        img = self.binarization_image(image)
        afterSpotImg = self.delete_noisy_point(img)
        pytesseract.tesseract_cmd = SC.PYTESSERACT_OCR
        # 图片转文字
        result = pytesseract.image_to_string(afterSpotImg)
        return result


if __name__ == '__main__':

    from util.pySelenium import PySelenium

    p = PySelenium(openType="pc")
    # p.open_url(url="https://XXXX/admin/login?redirect=%2Fadmin%2Fdashboard")
    # p.sleep(2)
    # IM = ImageRecognize(p).save_code_image('xpath->//div[@class="imgs"]/img')
    code = ImageRecognize(p).image_str(image=Image.open(r"C:\Users\kk\Desktop\下载.jpg"))
    print(code)

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值