一、将整个注册流程脚本进行模块化-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