Python+selenium+PIL实现自动化登录(并通过验证码)


前言

为了更好的巩固web自动化测试的学习,为此找了个线上网站进行自动化且通过验证码的登录。

一、前提准备

1.测试网址(https://www.bazhuayu.com/login)
#自行注册好账号密码以便登录
2.第三方识别验证码(http://www.chaojiying.com/)
#自行注册好账号,关注微信公众号绑定有1000积分足够测试用
3.开发工具pycharm

二、步骤

新建project
新建包
Lib(存放接口文档)
Screenshots(存放截图)
Testcases(存放测试用例)
Util(存放自己集成后的相关功能)
main.py(用于运行)

1.Lib包准备

http://www.chaojiying.com/api-14.html(超级鹰python demo下载)

#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

class Chaojiying_Client(object):

    def __init__(self, username, password, soft_id):
            self.username = username
            password =  password.encode('utf8')
            self.password = md5(password).hexdigest()
            self.soft_id = soft_id
            self.base_params = {
                'user': self.username,
                'pass2': self.password,
                'softid': self.soft_id,
            }
            self.headers = {
                'Connection': 'Keep-Alive',
                'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
            }

    def PostPic(self, im, codetype):
            """
            im: 图片字节
            codetype: 题目类型 参考 http://www.chaojiying.com/price.html
            """
            params = {
                'codetype': codetype,
            }
            params.update(self.base_params)
            files = {'userfile': ('ccc.jpg', im)}
            r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
            return r.json()

    def ReportError(self, im_id):
            """
            im_id:报错题目的图片ID
            """
            params = {
                'id': im_id,
            }
            params.update(self.base_params)
            r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
            return r.json()


if __name__ == '__main__':
    chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')  # 用户中心>>软件ID 生成一个替换 96001
    im = open('a.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    print(chaojiying.PostPic(im, 1902))
#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

2.Util包准备

from PIL import  Image
from Lib.chaojiying import Chaojiying_Client
import  random,string,os,time,pickle
def get_code(drive,id):
    #获取验证码图片
    t=time.time()
    path=os.path.dirname(os.path.dirname(__file__))+'\\Screenshots'
    picture_name1=path+'\\'+str(t)+'.png'

    drive.save_screenshot(picture_name1)
    ce=drive.find_element_by_id(id)



    left = ce.location['x'] * 1.25  # 计算左边界
    top = ce.location['y'] * 1.25  # 计算上边界
    right = (ce.location['x'] + ce.size['width']) * 1.25  # 计算右边界 *1.25是根据电脑的缩放与布局
    botom = (ce.location['y'] + ce.size['height']) * 1.25  # 计算下边界
    # 将上下左右边界值放到元祖中(注意顺序:左 上 右  下)

    im=Image.open(picture_name1)
    img=im.crop((left, top, right, botom))

    t=time.time()

    picture_name2=path+'\\'+str(t)+'.png'
    img.save(picture_name2)

    # 调用第三方库
    chaojiying = Chaojiying_Client('#', '#', '#')  #自己输入账号,密码,和id(超级鹰个人中心生成)
    im = open(picture_name2, 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
    res = chaojiying.PostPic(im, 1902)
    data = res['pic_str']
    return data

3.实现自动化登录

在Testcase包里新建test_login_bzy.py

from  selenium import  webdriver
from  time import  sleep
from  Util import util
class Testlogin(object):
    def __init__(self):
        #实例化浏览器
        self.drive=webdriver.Chrome()
        #测试网址
        self.drive.get('https://www.bazhuayu.com/login')
        sleep(2)
    def test_bzy(self):
        #定位用户名/手机号/邮箱输入框
        self.drive.find_element_by_id('LoginName').send_keys('账号')
        #定位密码框
        self.drive.find_element_by_id('Password').send_keys('密码')
        #第三方Api识别
        captcha=util.get_code(self.drive,'captchaImg')
        #定位验证码框
        self.drive.find_element_by_id('Captcha').send_keys(captcha)
        #点击登录
        self.drive.find_element_by_id('login').click()

if __name__ == '__main__':
    Testlogin().test_bzy()

在main.py运行

from Testcases.test_login_bzy import Testlogin

if __name__=="__main__":
Testlogin().test_bzy()

总结

1.现在第三方的图片识别比较多,也可以搭建相关依赖进行本地训练,但是为了节约时间,可以选择第三方稳定接口
2.规范化尤为重要,后期的迭代可以体现
3.识别验证码其实就是截图后再进行抠图再进行识别返回

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值