300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Python3+Selenium3自动化测试框架——②流程梳理及代码封装

Python3+Selenium3自动化测试框架——②流程梳理及代码封装

时间:2019-02-17 02:00:25

相关推荐

Python3+Selenium3自动化测试框架——②流程梳理及代码封装

Python3+Selenium3自动化测试框架——①基本步骤

对之前的步骤进行

一、流程梳理以及功能封装

register_code.py

# coding=utf-8import jsonimport randomimport timeimport requestsfrom PIL import Imagefrom selenium import webdriverdriver = webdriver.Chrome()# 浏览器初始化def driver_init():driver.get("/register")driver.maximize_window()time.sleep(5)# 获取element信息def get_element(id):element = driver.find_element_by_id(id)return element# 获取随机数def get_range_user():user_info = ''.join(random.sample('1234567890abcdefghijklmn', 8))return user_info# 获取图片def get_code_image(file_name):driver.execute_script('document.body.style.zoom="0.8"') # 根据电脑缩放比例缩小窗口比例driver.save_screenshot(file_name)code_element = driver.find_element_by_id("getcode_num")left = code_element.location['x'] # 获取左上角点x值top = code_element.location['y'] # 获取左上角点y值right = code_element.size['width'] + left # 获取元素宽度height = code_element.size['height'] + top # 获取元素高度im = Image.open(file_name)img = im.crop((left, top, right, height)) # 截取图片img.save(file_name)# 解析图片获取验证码def code_online(file_name):data = {'token': 'free','type': 'local'}files = {'file': open(file_name, 'rb')} # binary上传文件response = requests.post('/imgcode/', files=files, data=data)result = json.loads(response.text)if result['code'] == 200:return result['data']else:return 'error'# 运行主程序def run_main():user_name_info = get_range_user()user_email = user_name_info + "@"file_name = "D:/Users/Richard Young/Desktop/imooc.png"driver_init()get_element("register_email").send_keys(user_email)get_element("register_nickname").send_keys(user_name_info)get_element("register_password").send_keys("11111111")get_code_image(file_name)text = code_online(file_name)get_element("captcha_code").send_keys(text)# get_element("register-btn").click()button=get_element("register-btn")driver.execute_script("arguments[0].click();", button)driver.close()run_main()

出现过问题:ElementClickInterceptedException 不可点击

解决:

get_element("captcha_code").click(text)

改为

button=get_element("register-btn")driver.execute_script("arguments[0].click();", button)

使用js操作进行点击

二、配置文件实现定位设计

1.创建.ini格式的配置文件

记录需要定位的元素

[RegisterElement]user_email=id>register_emailuser_name=id>register_nicknamepassword=id>register_passwordcode_image=id>getcode_numcode_text=id>captcha_codecode_text_error=id>captcha_code-errorregister_button=id>register-btn

2.封装读取配置文件的方法

read_ini.py

# coding=utf-8import configparser # 读取ini工具类文件packageclass ReadIni(object):def __init__(self, file_name=None, node=None):if file_name is None:file_name = r"D:\Users\User\PycharmProjects\selenium_demo\config\LocalElement.ini"if node is None:self.node = "RegisterElement"else:self.node = nodeself.cf = self.load_ini(file_name)# 加载文件def load_ini(self, file_name):cf = configparser.ConfigParser()cf.read(file_name)return cf# 获取value值def get_value(self, key):data = self.cf.get(self.node, key)return dataif __name__ == '__main__':read_init = ReadIni()print(read_init.get_value('user_name'))

3.根据配置文件寻找元素

find_element.py

# coding=utf-8from util.read_ini import ReadIniclass FindElement(object):def __init__(self, driver):self.driver = driverdef 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

4.完整流程封装

register_function.py 对前面的register_code.py进一步封装,加入:对注册失败进行截图,多个浏览器测试

# coding = utf-8import jsonimport randomimport timeimport requestsfrom PIL import Imagefrom find_element import FindElementfrom selenium import webdriverclass RegisterFunction(object):def __init__(self, url,i):self.driver = self.get_driver(url,i)# 获取driver并打开urldef get_driver(self, url,i):if i ==0:driver = webdriver.Chrome()else:driver = webdriver.Edge()driver.get(url)driver.maximize_window()return driver# 输入用户信息def send_user_info(self, key, data):self.get_user_element(key).send_keys(data)# 定位用户信息,获取elementdef get_user_element(self, key):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.driver.execute_script('document.body.style.zoom="0.8"') # 根据电脑缩放比例缩小窗口比例self.driver.save_screenshot(file_name)code_element = self.get_user_element("code_image")left = code_element.location['x'] # 获取左上角点x值top = code_element.location['y'] # 获取左上角点y值right = code_element.size['width'] + left # 获取元素宽度height = code_element.size['height'] + 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)data = {'token': 'free','type': 'local'}files = {'file': open(file_name, 'rb')} # binary上传文件response = requests.post('/imgcode/', files=files, data=data)result = json.loads(response.text)if result['code'] == 200:return result['data']else:return 'error'def main(self,i):user_name_info = self.get_range_user()user_email = user_name_info + "@"file_name = "D:/imooc.png"code_text = self.code_online(file_name)self.send_user_info('user_email', user_email)self.send_user_info('user_name', user_name_info)self.send_user_info('password', '111111111111')self.send_user_info('code_text', code_text)button =self.get_user_element('register_button')self.driver.execute_script("arguments[0].click();", button)code_error=self.get_user_element('code_text_error')if code_error is None:print("注册成功")else:self.driver.save_screenshot(r"D:\error"+str(i)+".png")time.sleep(5)self.driver.close()if __name__ == '__main__':for i in range(2):register_function = RegisterFunction("/register",i)register_function.main(i)

文档结构:

下一篇:

Python3+Selenium3自动化测试框架——③po模型设计_u011282197的博客-CSDN博客通过设计po模型,对页面定位和页面操作进行分离封装,实现多用例的测试。总体结构:case(用例)→business(业务层)→handle(操作层)→page(页面层)→base(公用)/u011282197/article/details/122852471?spm=1001..3001.5501

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。