python+自动化测试图形验证码篇

python+自动化测试图形验证码篇

如何在自动化测试中处理图形验证码

很多后台在登录的时候需要图形验证码,图形验证码有多种多样,下面我主要把我们用到的图形验证码处理的部分做一下解释,供跟我一样被python瓶颈锁喉的人一点出路。

我的代码是在别的博主的基础上进行修改的。原文链接如下:
https://blog.csdn.net/ever_peng/article/details/90547299
(真心感谢这位博主,我自己弄的时候一头雾水,看了博主的文后处理起来有了思路了。我主要还是在博主原先的代码上做了小改动,因为我们公司的图形验证码是下面哪种)
登录页面截取下面的验证码图片灰度处理后的图片:python+自动化测试图形验证码篇_第1张图片

下面我把大体部分做一下介绍:
get_pictures 函数:主要功能主要是从登录页面获得图形验证码,得到的图形验证码就跟我上面截图的一致
processing_image函数:主要功能就是把图形验证码里胡乱画的线条替换成我指定的一种图片里的灰色。如果不替换,或者替换的颜色没选好,工具是识别不出来图片中的验证码
处理思路:
1.先从登录页上拿到图形验证码
2.然后循环图形验证码里的像素,把像素为黑色的颜色改为我指定一的一个灰色(209, 207, 242)
3.然后再把图片转成灰度图片好识别
4.然后借用工具pytesseract将图形验证码转换成字符串。

上面的难度一半在安装,一半在代码理解上。
安装我给关联下一篇博主的连接,(还有没说到的就留言吧)
https://www.jianshu.com/p/2db541800418

下面的代码需要说名一下:
如果遇到线条复杂覆盖字母严重的,会出现验证码识别不出来或者识别出来的完全和图形验证码对不上号的情况,我目前解决的办法就是在登录的时候如果返回验证码获取错误,那就在获取一遍进行处理,其他还没有好的解决办法,如果哪位小伙伴有好的想法或者我有不对的地方,可以留言哈,我积极改正。

完整的代码如下:


```python
import re  #用于正则
from PIL import Image #用户打开图片和对图片处理
import pytesseract #用于图片转文字
from selenium import webdriver # 用于打开网站
from selenium.webdriver.common.by import By  #获取属性的方法
import time  #代码运行停顿

class test:
    def __init__(self):
        self.driver=webdriver.Chrome()

    #获取图片验证码
    def get_pictures(self):
    #打开登录页面
        self.driver.get("http://xxx.xx.xxx.xxxx/#/login") #打开登录页面
        self.driver.implicitly_wait(30) #隐式等待30s
        self.driver.save_screenshot("Login_Verpicture.png") #全屏截图
        page_snap_obj=Image.open("Login_Verpicture.png") #打开图片
        img=self.driver.find_element(By.XPATH,'//div/img[@class="login-code"]') #获取验证码元素
        time.sleep(10)
        location=img.location #location属性可以返回该图片对象(既这张图片)在浏览器中的位置,以字典的形式返回
        print("Length:", len(location))
        print(location)
        size=img.size #获取图验证码的宽x高
        print("size:", len(size))
        print(size)
        left=location['x']   #此处的x和y是图片验证码左上角的点再浏览器中的x轴y轴对应的值
        top=location['y']
        right=left+size['width']
        bottom=top+size['height']
        image_obj=page_snap_obj.crop((left,top,right,bottom)) #按照提供的图片验证码的左上右下的坐标值对图片验证码进行裁剪
        #image_obj.show() #打开切割后的完整验证码
        #self.driver.close() #处理完验证码后关闭浏览器
        return image_obj

    #处理图片验证码
    def processing_image(self):
        image_obj=self.get_pictures()  #获取图片验证码
        w=image_obj.size[0]#图形验证码的宽度
        h=image_obj.size[1]#图形验证码的高度
        img = image_obj.convert("RGB")  # 把图片强制转成RGB
        for i in range(0, w):  # 遍历所有长度的点
            for j in range(0, h):  # 遍历所有宽度的点
                temp = 0
                #print(img.getpixel((i, j)))
                color=img.getpixel((i, j))
                for r in color:
                #下面的100根据情况设置,因为我发现我们公司的验#证码干扰的线条都是黑色的,我把所有的像素都打印出来后,发现RGB三#原色中(x,y,x)三个值都小于100的貌似都是黑色,所以就用下面的这种笨办法了。
                    if r<= 100:
                       temp = temp+1
                       if temp == 3:
                           # 将图片中指定的像素处设置颜色为白色
                           #print("可能来了一个黑色")
                           #print(img.getpixel((i, j)))
                           img.putpixel((i, j), (209, 207, 242))
        img=img.convert("L")
        img.save("ss.png")
        return img

    def image_str(self):
        image = self.processing_image()
        pytesseract.pytesseract.tesseract_cmd = r"C:\Program Files (x86)\Tesseract-OCR\tesseract.exe"  # 设置pyteseract路径
        result = pytesseract.image_to_string(image)  # 图片转文字
        resultj = re.sub(u"([^\u4e00-\u9fa5\u0030-\u0039\u0041-\u005a\u0061-\u007a])", "", result)  # 去除识别出来的特殊字符
        result_four = resultj[0:4]  # 只获取前4个字符
        print(resultj)  # 打印识别的验证码
        return result_four

if __name__ == '__main__':
    a = test()
    print('登录时的验证码是:'+a.image_str())

你可能感兴趣的:(python学习,测试,python,自动化,开发语言)