zoukankan      html  css  js  c++  java
  • 自动化测试,破解验证码完整记录

    思路:

      1、根据xpath获取登录页面验证码元素区域的位置坐标

      2、根据位置坐标截取验证码图片

      3、识别验证码文本,再使用UI或者接口登录

    步骤:

    1、安装tesseract,及pytesseract

      参考:https://blog.csdn.net/qq_38900441/article/details/82823312

    2、编写裁剪、识别验证码、登录脚本---station_web_login.py

    # coding:utf-8
    
    from PIL import Image
    from selenium import webdriver
    import pytesseract
    import time
    
    def cut_image():
        # 截图当前页面
        driver.save_screenshot('station_web_login.png')
    
        # 定位到该元素,获取位置信息
        img = driver.find_element_by_xpath('//img[@id="vildateImg"]')
        location = img.location
        size = img.size
        left = location['x']
        top = location['y']
        right = left + size['width']
        bottom = top + size['height']
    
        # 裁剪图片
        img = Image.open('station_web_login.png')
        cropped = img.crop((left, top, right, bottom))
        cropped.save('station_web_login_checkCode.png')
    
        # 识别图片
        text = pytesseract.image_to_string(Image.open('station_web_login_checkCode.png').resize((300, 100)))
    
        # 模拟登录
        driver.find_element_by_xpath('//input[@id="username"]').send_keys('****')
        driver.find_element_by_xpath('//input[@id="password"]').send_keys('*******')
        driver.find_element_by_xpath('//input[@id="rand"]').send_keys(text)
        driver.find_element_by_xpath('//button[@id="submitlogin"]').click()
        # return text
        # 获取页面源码
        global source
        source = driver.page_source
    
    
    def login():
        """
        登录并获取TOKEN和JSESSIONID
        :return:
        """
        global driver
        driver = webdriver.Chrome()
        url = 'http://*******/login'
        driver.maximize_window()
        driver.get(url)
        # 等待两秒截图更清晰
        time.sleep(2)
        # 裁剪图片
        cut_image()
    
        if '验证码不能为空或错误!' in source:
            driver.refresh()
            cut_image()
        if '欢迎使用' in source:
    
            # 获取cookies,用于后续接口访问鉴权
            all_cookies = driver.get_cookies()
            TOKEN = all_cookies[0]['value']
            JSESSIONID = all_cookies[1]['value']
    
            driver.quit()
            return TOKEN, JSESSIONID

    3、将station_web_login.py文件放置到框架中

    然后在需要的地方引入

     就可以使用里面的方法了,主要是login()方法

    有用的博客:

    https://www.sohu.com/a/235364612_729271--综合实现

    https://blog.csdn.net/hfutdog/article/details/82351549 --图片裁剪

  • 相关阅读:
    Codeforces 938G(cdq分治+可撤销并查集+线性基)
    codeforces 938F(dp+高维前缀和)
    寒武纪camp Day6
    寒武纪camp Day5
    寒武纪camp Day4
    bzoj4161 (k^2logn求线性递推式)
    loj10003加工生产调度
    loj10002喷水装置
    loj10001种树
    bzoj1023
  • 原文地址:https://www.cnblogs.com/gcgc/p/11326333.html
Copyright © 2011-2022 走看看