3. selenium_pytesseract 识别验证码

前言:

很多网站的注册,登录都会有验证码,有安全作用的一方面,也避免了一些持续访问攻击对服务产生性能问题。

自动化测试中对验证码处理的办法一般有三种:

  1. 让开发写一个固定的验证码
  2. 自动化测试的时候让开发去掉验证码
  3. 自己想办法识别验证码

接下来使用python 中的pytesseract 模块和 PIL 模块解决一些不太复杂的验证码。
PIL(Python Imaging Library)是Python常用的图像处理库。
pytesseract 识别验证码。

思路步骤:

  1. 获取验证码页面
  2. 确定验证码坐标和大小
  3. 通过坐标和尺寸截取验证码图片,PIL 模块处理图片
  4. 通过pytesseract 识别验证码

安装PIL 和 pytesseract

pip install pytesseract -i https://pypi.douban.com/simple
pip install pillow -i https://pypi.douban.com/simple

Pillow 是 pil 的一个分支。

以下开始截取验证码图片。

找到验证码图片 id

截取验证码

import time

from selenium import webdriver
from time import sleep
from PIL import Image

driver = webdriver.Chrome()
driver.get("http://120.25.209.187:12306/jpress/user/register")
sleep(2)

driver.maximize_window()               # 页面最大化

t = time.time()                        # 时间戳
picture_name1 = str(t)+'.png'          # 图片名称
driver.save_screenshot(picture_name1)  # 截取登录页面图片

# 获取图片验证码坐标和尺寸
ce = driver.find_element_by_id("captchaimg")
print(ce.location)
left = ce.location['x']
top = ce.location['y']
right = ce.size['width']+left
height = ce.size['height']+top

sleep(2)
# 截取验证码图片
im = Image.open(picture_name1)
img = im.crop((left, top, right, height))

t = time.time()
picture_name2 = str(t)+'.png'              # 验证码图片命名为 picture_name2
img.save(picture_name2)

driver.close()



识别登录页面验证码

from selenium import webdriver
import time
from PIL import Image


def matting():
    # 打开谷歌浏览器
    browser = webdriver.Chrome()
    # 打开网站首页
    # browser.get("https://v3pro.houjiemeishi.com/PC/pages/login/login.html")
    browser.get("http://120.25.209.187:12306/jpress/admin/login")
    # 网页最大化
    browser.maximize_window()
    # 登录页图片
    picture_name1 = 'login1'+'.png'
    # 保存第一张截图
    browser.save_screenshot(picture_name1)
    # 定位元素
    ce = browser.find_element_by_id("captchaImg")
    # ce = browser.find_element_by_xpath('//input[@class="ipt2"]')
    # 打印元素位置、元素尺寸
    print(ce.location, ce.size)
    # 要抠验证码的图,先获取元素参数

    # 坐标有时候要自己调节,参考这篇文章第八点,多试试二三十次,就可以截出来了。
    # https://www.cnblogs.com/mypath/articles/6646858.html

    left = ce.location.get('x') + 210    
    top = ce.location.get('y') + 100      
    r_size = ce.size.get('width') + 15    
    h_size = ce.size.get('height') + 10   
    right = r_size + left
    height = h_size + top
    # 读取刚才截的第一张图
    im = Image.open(picture_name1)
    # 抠图
    img = im.crop((left, top, right, height))
    # 验证码块的图片
    picture_name2 = 'code1'+'.png'
    # 保存图片
    img.save(picture_name2)
    time.sleep(2)
    browser.close()


if __name__ == '__main__':
    matting()

posted @ 2022-03-20 23:02  西瓜_皮  阅读(454)  评论(0编辑  收藏  举报