【Selenium项目实战】实现工具类:设计获得坐标、复杂验证码识别、随机字符串、cookie操作工具类

前言

一直想学习自动化测试,但是都没行动,业余时间学习零零碎碎并记录20210417。

【Selenium项目实战】包含以下内容:

  1. 项目环境搭建:安装JDK、mysql、Tomcat和测试系统
  2. 需求分析和用例设计
  3. 项目架构设计
  4. 完成项目基本测试
  5. 解决验证码问题
  6. 完成项目测试用例
  7. (补充)实现工具类:设计获得坐标、复杂验证码识别、随机字符串、cookie操作工具类

把前面几个代码都封装在util这个目录下,这样后面用到直接调用就行了


1、util.py代码如下:

import os
import pickle
import random
import string
from time import sleep, time, strftime, localtime

import pyautogui
from PIL import Image
from pytesseract import pytesseract
from selenium import webdriver

from lib.ShowapiRequest import ShowapiRequest


# 1、定位坐标
def test_agree_radiobutton():
    driver=webdriver.Chrome()
    driver.get('http://www.jpress.io/user/register')
    sleep(1)
    el =driver.find_element_by_id('agree')
    # el.click()  虽然找到了但是还是定位不到
    print(el.rect)   #找到该坐标打印一下
    rect=el.rect
    pyautogui.moveTo(rect['x']+10,rect['y']+130)  #10,130 就是移动像素
    pyautogui.click()
    sleep(3)


# 2、抠图获取验证码
def test_yzm():
    path = os.path.abspath('screenshots')
    print(path)
    # image1 = Image.open(path + '/' + 'yzm1.png')
    # image1 = Image.open(path + '/' + 'yzm2.png')
    image1 = Image.open(path + '/' + 'yzm3.png')

    str = pytesseract.image_to_string(image1)
    print(str)


# 3、调用AI库识别复杂验证码
def test_yzmPro():
    # 先把验证码图片扣取下来
    # 打开谷歌
    browser = webdriver.Chrome()
    browser.get('http://localhost:8080/jpress/user/register')
    sleep(3)
    # browser.maximize_window()

    # 获取http://localhost:8080/jpress/user/register图片
    path = '/Users/zhengxiaofang/PycharmProjects_py3/Selenium_project/'
    path = os.path.join(path, 'screenshots')
    if not os.path.exists(path):  # 如果找不到/Users/ff/PycharmProjects_py3/Selenium_project/screenshots就创建
        os.mkdir(path)
    # 设置要截图的文件名:自定义名称+系统时间命名+后缀.png
    picture_name1 = '验证码未切' + strftime('%Y_%m_%d_%H_%M_%S', localtime()) + '.png'
    path = os.path.join(path, picture_name1)   #截图1的路径+名称
    browser.get_screenshot_as_file(path)  # 截图保存
    print(path)

    # 找到验证码坐标,利用pil模块中的抠图方法crop,把图片抠出来,保存为picture_name2
    # yzm_img = browser.find_element_by_xpath('//*[@id="captchaimg"]')
    yzm_img = browser.find_element_by_id("captchaimg")
    print(yzm_img.location) # 打印左上角坐标{'x': 547, 'y': 447}

    left = yzm_img.location['x']
    top = yzm_img.location['y']
    width =yzm_img.size['width'] + left
    height =yzm_img.size['height'] + top

    dpr = browser.execute_script('return window.devicePixelRatio')  # execute_script():执行js,使devicePixelRatio 能够返回当前显示设备的物理像素分辨率与 CSS 像素分辨率的比率
    print(dpr)

    # # 打开截图1
    im = Image.open(path)
    # 把图片抠出来,保存为picture_name2
    img = im.crop((left * dpr, top * dpr, width * dpr, height * dpr))
    picture_name2 = '验证码切图' + strftime('%Y_%m_%d_%H_%M_%S', localtime()) + '.png'
    print(picture_name2)
    img.save(picture_name2) # 这种方式图片默认是保存到main.py当前路径下

    # 这里是复杂验证码获取

    r = ShowapiRequest("http://route.showapi.com/184-4","602469","cff386bf98294645ab8c1acf2fc2c385") # 密钥和密码用自己的

    r.addFilePara("image", picture_name2)
    r.addBodyPara("typeId", "34")
    r.addBodyPara("convert_to_jpg", "0")
    r.addBodyPara("needMorePrecise", "0")
    res = r.post()
    print(res.text)  # 返回信息
    # 取showapi_res_body中的result
    body = res.json()['showapi_res_body']
    print(body)

    # 取出验证码
    print(body['Result'])

    browser.close()


# 4、生成随机字符串
def gen_random_str():
    rand_str = ''.join(random.sample(string.ascii_letters + string.digits, 8))
    return rand_str


def save_cookie(driver, path):
    with open(path, 'wb') as filehandler:
        cookies = driver.get_cookies()
        print(cookies)
        pickle.dump(cookies, filehandler)   #保存


def load_cookie(driver, path):
    with open(path, 'rb') as cookiesfile:
        cookies = pickle.load(cookiesfile)
        for cookie in cookies:
            driver.add_cookie(cookie)

# 获取验证码图片-借鉴他人,仅供学习参考,我用这种方法打印出来的图片路径不太对劲
def get_code(driver):
    # 获取验证码图片
    path = os.path.dirname(os.path.dirname(__file__)) + '\\screenshots'
    # 解析上面代码含义:
    # os.path.dirname(__file__):获得当前文件所在路径
    # os.path.dirname():上级目录
    # '\\screenshots':切换到该目录下,也就是截图路径
    picture_name1 = path + '\\' + str(time()) + '.png'

    driver.save_screenshot(picture_name1)

    ce = driver.find_element_by_xpath('//*[@id="captchaimg"]')

    left = ce.location['x']
    top = ce.location['y']
    right = ce.size['width'] + left
    height = ce.size['height'] + top

    dpr = driver.execute_script('return window.devicePixelRatio')

    print(dpr)
    im = Image.open(picture_name1)
    img = im.crop((left*dpr, top*dpr, right*dpr, height*dpr))

    picture_name2 = path + '\\' + str(time()) + '.png'
    img.save(picture_name2)  # 这里就是截取到的验证码图片

    #这里是复杂验证码获取

    r = ShowapiRequest("http://route.showapi.com/184-4","602469","cff386bf98294645ab8c1acf2fc2c385")    # 需要花点点钱
    r.addFilePara("image", picture_name2)
    r.addBodyPara("typeId", "34")
    r.addBodyPara("convert_to_jpg", "0")
    r.addBodyPara("needMorePrecise", "0")
    res = r.post()
    print(res.text)  # 返回信息
    # 取showapi_res_body中的result
    body = res.json()['showapi_res_body']
    print(body)

    # 取出验证码
    print(body['Result'])

2、main.py代码如下:

# 这个文件是专门用来测试的
from selenium import webdriver
from util import util


if __name__ == '__main__':
    # ----测试util工具类----
    # 定位坐标
    # util.test_agree_radiobutton()
    # 抠图获取验证码
    # util.test_yzm()
    # 调用AI库识别复杂验证码
    # util.test_yzmPro()
    # 随机获取字符串
    # print(util.gen_random_str())

    # 获取某个页面的验证码
    driver = webdriver.Chrome()
    driver.get('http://localhost:8080/jpress/user/register')
    driver.maximize_window()
    util.get_code(driver)
    print(util.get_code(driver))
    driver.quit()

“永不放弃,总有希望在前面等待!”送给自己,也送给正在阅读文章的博友们~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小慌慌

感谢博友的鼓励,快乐分享~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值