一、将整个注册流程脚本进行模块化-19

1、D:\imooc\selenium\register_function.py

# 功能:在register_code.py的基础上,进行二次改造。

# 编码格式
#coding=utf-8

# 添加当前项目路径
import sys
sys.path.append('D:/imooc/selenium')

# 浏览器驱动包
from selenium import webdriver

# 时间包
import time

# 引入随机数生成包
import random

# 使用pip库进行图片解析包/取图片的包
from PIL import Image

# 获取api解析图片包
from ShowapiRequest import ShowapiRequest

# 导入FindElement
from find_element import FindElement

class RegisterFunction(object):

    # 将get_driver()中的driver,放入__init__构造函数中。
    def __init__(self,url):
        # get_driver的时候,需要将url放进去。
        self.driver = self.get_driver(url)

    # 获取driver并打开url
    def get_driver(self,url):
        # Chrome浏览器的驱动
        # driver的实例化
        # driver = webdriver.Edge()
        driver = webdriver.Chrome()
        # driver = webdriver.Firefox()
        # 加载指定url界面
        driver.get(url)
        # 最大化窗口
        driver.maximize_window()
        # 返回driver
        return driver
    
    # 输入用户信息
    def send_user_info(self,key,data):
        self.get_user_element(key).send_keys(data)

    # 定位元素位置,获取element元素值
    def get_user_element(self,key):
        # 调用findelement.py
        find_element = FindElement(self.driver)
        user_element = find_element.get_element(key)
        return user_element

    # 获取随机数
    def get_range_user(self):
        user_info = ''.join(random.sample('1234567890abcdefghijklmn',8))
        return user_info

    # 获取图片
    def get_code_image(self,file_name):
        # 保存整个页面的图片
        # 增加self
        self.driver.save_screenshot(file_name)
        # 通过获取验证码的id,计算code_element的元素,通过get_user_element
        code_element = self.get_user_element("code_image")
        # 通过code_element的元素,计算code_element元素的坐标
        # 获取的格式是:{"x":123,"y":345}
        # print(code_element.location)
        # 左边点的坐标
        left = code_element.location['x']*1.75
        top = code_element.location['y']*1.75
        # 右边点的坐标
        right = code_element.size['width']*1.75+left
        height = code_element.size['height']*1.75+top
        # 打开一张图片,并命名为一个对象
        im = Image.open(file_name)
        # 按照一个坐标进行裁剪
        img = im.crop((left,top,right,height))
        # 保存裁剪后的图片
        img.save(file_name)

    # 解析图片,获取验证码
    def code_online(self,file_name):
        self.get_code_image(file_name)
        # 这里的api不变
        # 需要缴费
        # 修改my_appId = 1182042
        # 修改my_appSecret = 523bfa72c8f64177b7a17f7a2f02c462
        # https://www.showapi.com/apiGateway/view/184?tab=1
        r = ShowapiRequest("http://route.showapi.com/184-1","1182042","523bfa72c8f64177b7a17f7a2f02c462" )
        # 图片存放地址
        r.addFilePara("image", file_name)
        # 代表识别几位数的图片,即多少位数的字。
        r.addBodyPara("typeId", "35")
        # r.addBodyPara("convert_to_jpg", "0")
        res = r.post()
        text = res.json()  #['showapi_res_error']['Result']
        # 返回验证码
        return text

    # 设置value值
    def main(self):
        user_name = self.get_range_user()
        user_email = user_name + "@163.com"
        file_name = "D:/imooc/test01.png"
        code_text = self.code_online(file_name)
        self.send_user_info('user_email',user_email)
        self.send_user_info('user_name',user_name)
        self.send_user_info('user_password',"111111")
        self.send_user_info('code_text',"11111")
        self.get_user_element('register_button').click()
        time.sleep(5)
        self.driver.close()

if __name__ == '__main__':
    register_funtion = RegisterFunction('http://www.5itest.cn/register')
    register_funtion.main()

 

2、D:\imooc\selenium\config\LocalElement.ini

# 功能:配置文件夹config中的配置文件LocalElement.ini

# 节点名称
[RegisterElement]

# Element id_name and id_value
user_email=id>register_email
user_name=id>register_nickname
user_password=id>register_password
code_image=id>getcode_num
code_text=id>captcha_code
register_button=id>register-btn

 

3、D:\imooc\selenium\util\read_ini.py

# 功能:进行逻辑处理,读取配置文件

# 编码
# coding=utf-8

# 引入读取配置文件的第三方扩展包
import configparser

# class类 
# 将代码按照一定格式封装起来
# class类_name:ReadIni,继承于object
class ReadIni(object):
        
    # 构造函数,获取load_ini函数中的cf对象。
    # 只要运行程序,就要有cf对象。
    def __init__(self,file_name=None,node=None):
        # file_name为非必须传递
        if file_name == None:
            # 设置默认配置文件
            file_name = "D:/imooc/selenium/config/LocalElement.ini"
        # node为非必须传递
        if node == None:
            # 设置默认配置文件的结点名
            self.node = "RegisterElement"
        else:
            self.node = node
        # 获取load_ini函数中的cf对象
        self.cf = self.load_ini(file_name)
    
    # 加载配置文件的函数
    def load_ini(self,file_name):
        # 调用configparser下的ConfigParser,并将调用的内容,设置为cf对象
        cf = configparser.ConfigParser()
        # 读取配置文件file_name,形参传递进来
        cf.read(file_name,encoding="utf-8-sig")
        # 将cf对象返回出去
        return cf
        
    # 获取配置文件中结点值的函数
    def get_value(self,key):
        data = self.cf.get(self.node,key)
        return data

# 主函数运行     
#if __name__ == '__main__':
    # ReadIni()对象实例化为read_init
#    read_init = ReadIni()
    # 输出结果,将user_name传递到get_value中的key
#   print(read_init.get_value("user_email"))

 

4、D:\imooc\selenium\find_element.py

# 功能:进行逻辑处理,获取配置文件中的元素值

# 编码格式
#coding=utf-8

# 导入util包的读取配置文件代码中的类
from util.read_ini import ReadIni

# 封装class
class FindElement(object):

    # 以构造函数方式传入driver(因为要用,所以必须传)
    def __init__(self,driver):
        self.driver = driver

    # 获取元素值的函数
    def get_element(self,key):

        # 实例化对象
        read_ini = ReadIni()

        # 获取实例化对象指向的值
        data = read_ini.get_value(key)

        # 拆分上述的值,取真正有用的值
        by = data.split('>')[0]
        value = data.split('>')[1]

        # 加容错处理
        try:
            if by == 'id':
                return self.driver.find_element_by_id(value)
            elif by == 'name':
                return self.driver.find_element_by_name(value)
            elif by == 'className':
                return self.driver.find_element_by_class_name(value)
            else:
                return self.driver.find_element_by_xpath(value)
        except:
            return None

 

5、D:\imooc\selenium\ShowapiRequest.py

import requests
from urllib import parse
#全局请求头
files = {}
headers = {}
body = {}
timeouts = {}
resHeader = {}

class ShowapiRequest:
    def __init__(self, url, my_appId, my_appSecret):
        self.url = url
        self.my_appId = my_appId
        self.my_appSecret = my_appSecret
        body["showapi_appid"] = my_appId
        body["showapi_sign"] = my_appSecret
        headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2427.7 Safari/537.36"

    def addFilePara(self, key, value_url):
        files[key] = open(r"%s" % (value_url), 'rb')
        return self

    def addHeadPara(self, key, value):
        headers[key] = value
        return self

    def addBodyPara(self, key, value):
        body[key] = value
        return self
    #设置连接时间和读取时间
    def setTimeout(self, connecttimout, readtimeout):
        timeouts["connecttimout"] = connecttimout
        timeouts["readtimeout"] = readtimeout
        return self


    def get(self):
        get_url = self.url + "?" + parse.urlencode(body)
        if not timeouts:
            res = requests.get(get_url, headers=headers)
        else:
            timeout = (timeouts["connecttimout"], timeouts["readtimeout"])
            res = requests.get(get_url, headers=headers, timeout=timeouts)
        return res

    def post(self):
        if not timeouts:
            res = requests.post(self.url, files=files, data=body, headers=headers)
        else:
            timeout = (timeouts["connecttimout"], timeouts["readtimeout"])
            res = requests.post(self.url, files=files, data=body, headers=headers, timeout=timeout)
        return res

 

posted @ 2022-10-14 14:17  酱汁怪兽  阅读(31)  评论(0编辑  收藏  举报