Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)
来源:互联网 发布:淘宝收购饿了么 编辑:程序博客网 时间:2024/06/05 15:50
Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)
------封装走起!!
后续关于 <Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现> 的博客例子全部基于:126邮箱登录并新建联系人,这个例子来实现的;
大家好,我们继续 <Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现> 之旅,本篇博客开始我们要进入封装的旅途。
首先我们建一个工程,这里面我用的IDE是pycharm,个人觉得还是比较好用的;
这里给初学语言的小朋友们一点小建议:
开始练习编写的时候不建议使用IDE,因为大部分IDE具备联想功能,这样不利于记忆常用命令。我最开始的时候就用的写字板,着实好用,除了空格要手动敲,没有颜色以外,真心不错,可以强化记忆。
这里我给本次工程取的名字叫:data_driven_framework
在本篇博客中,我们要先封装5个packages出来:Until、Conf、PageObject、ProjectVar、TestData
1、Util(相当于底层工具,复用次数多)U
Util中包括一下文件:读写Excel的方法、获取页面元素的方法、读取配置文件的方法、获得driver的方法、1.1 获取页面元素的封装【driver.find_element_by(LocateType,LocateExpression)】-----ObjectMap.py
从Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(一)中我们可以看到,好多代码是重复编写的,比如:driver.find_element_by(LocateType,LocateExpression),那么就可以把这个获取元素的操作封装起来,后面要对元素进行操作的时候,直接调用获取元素的方法就好了,这样就降低了代码的冗余度;
话不多说,上代码:
#encoding=utf-8from selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support.ui import Selectimport timedef getEelement(driver,locateType,locateExpression): #获取页面单个元素 try: wait=WebDriverWait(driver,10) return wait.until(lambda x:x.find_element(locateType,locateExpression)) except Exception,e: raise edef getElements(driver,locateType,locateExpression): #获取页面多个元素 try: wait=WebDriverWait(driver,10) return wait.until(lambda x:x.find_elements(locateType,locateExpression)) except Exception,e: raise e#对于下拉框标签是select的元素的获取特有操作def getSelectElementWithIndex(driver,index_num): #获取select下拉框元素---index select_element=Select(driver.find_element_by_xpath('//select')) #打印已选中的文本 print select_element.all_selected_options[0].text return select_element.select_by_index(index_num)def getSelectElementWithText(driver,text): #获取select下拉框元素----text select_element=Select(driver.find_element_by_xpath('//select')) #打印已选中的文本 print select_element.all_selected_options[0].text return select_element.select_by_visible_text(text)def getSelectElementWithValue(driver,value): #获取select下拉框元素---value select_element=Select(driver.find_element_by_xpath('select')) #打印已选中的文本 print select_element.all_selected_options[0].text return select_element.select_by_value(value)
1.2 Excel操作的封装-----Excel.py
由于用的是数据驱动框架类型,这里我使用excel来读取测试数据、记录测试结果,那么就避免不了excel的大量操作,所以把excel的大部分操作封装起来,后续调用---我常用的excel操作是查询和插入,见代码:
#encoding=utf-8from openpyxl import Workbookfrom openpyxl import load_workbookfrom ProjectVar.Var import *from openpyxl.styles import Border,Side,Fontclass Excel(object): def __init__(self): self.font=Font(color=None) self.colorDict={'red':'FFFF3030','green':'FF008B00'} #test_path表示excel的路径,在另外一个package里面封装的,封装的内容有工程目录的绝对路径,是公用的,该工程目录下的其他文件路径只要在此基础上拼接字符串即可 self.wb=load_workbook(test_path) #表示默认选中的是第一个表格 self.ws=self.wb.active def rename(self,new_name): #给表格重命名 self.ws.title=new_name self.wb.save(test_path) def GetSheetName(self): #获取所有表格名称 return self.wb.get_sheet_names() def GetSheetByName(self,sheet_name): #通过表格名称获取表格 self.ws=self.wb.get_sheet_by_name(sheet_name) return self.ws def GetCurrentSheetName(self): #获取当前表格名称 return self.ws.title def GetCellContent(self,col_num,row_num): #获取单元格内容 return self.ws.cell(row=row_num,column=col_num).value def WriteCellContent(self,col_num,row_num,content): #往指定的单元格里面写入内容 self.ws.cell(row=row_num,column=col_num).value=content self.wb.save(test_path) def GetMaxRow(self): #获取最大行号 return self.ws.max_row def GetMaxColumn(self): #获取最大列号 return self.ws.max_column
1.3 配置文件的基本操作的封装----GetConf.py
GetConf.py主要的功能是用来提取页面元素的定位方式locateType和定位表达式locateExpression的;
代码如下:
#encoding=utf-8import ConfigParserfrom ProjectVar.Var import *class ParsePageObjectRepositoryConfig(object): def __init__(self): self.cf=ConfigParser.ConfigParser() self.cf.read(page_object_repository_path) def getItemsFromSection(self,sectionName): items=self.cf.items(sectionName) return dict(items)
1.4 Driver.py 得到driver
代码如下:
#encoding=utf-8from selenium import webdriverdriver=webdriver.Chrome(executable_path='c:\\Python27\\chromedriver')
2、ProjectVar
2.1 将工程中用到的已知元素封装起来,在脚本中直接传递变量名称即可---var.py
见代码:#encoding=utf-8import os#当前文件路径file_path=__file__#工程路径#os.path.dirname(__file__)当前文件所在路径project_path=os.path.dirname(os.path.dirname(__file__)).decode('utf-8')test_path=project_path+u'//TestData//126邮箱联系人.xlsx'page_object_repository_path=project_path+'//Conf//PageObjectRepository .ini'url='http:\\www.126.com'
3、Conf(配置文件)
3.1 页面元素的路径全部封装在配置文件PageObjectRepository.ini中,这样即使路径变更不会直接修改代码,减少了维护成本;----PageObjectRepository .ini
这里将要操作的页面元素的定位路径全都写在这个配置文件,按照页面来写,每个操作页面的写在不同的标签栏里面;
本次例子需要的页面元素如下:
[configparse操作配置文件的时候有坑][ini中的内容要全部小写,否则读取出来的时候会自动转换成小写,这样就会发生匹配不上的情况][126mail_login]loginpage.frame=xpath>//iframe[@id='x-URS-iframe']loginpage.username=xpath>//span[.='@126.com']//preceding-sibling::inputloginpage.password=xpath>//label[.='密码']//following-sibling::input[2]loginpage.loginbutton=xpath>//a[@id='dologin'][126mail_homepage]home_age.addressbook=xpath>//div[text()='通讯录'][126mail_addcontactspage]addcontacts_page.create_contacts_btn=xpath>//span[text()='新建联系人']addcontacts_page.contact_person_name=xpath>//a[@title='编辑详细姓名']/preceding-sibling::div/inputaddcontacts_page.contact_person_email=xpath>//*[@id='iaddress_MAIL_wrap']//inputaddcontacts_page.star_contacts=xpath>//span[text()='设为星标联系人']/preceding-sibling::span/baddcontacts_page.contact_person_mobile=xpath>//*[@id='iaddress_TEL_wrap']//dd//inputaddcontacts_page.contact_person_comment=xpath>//textareaaddcontacts_page.save_contace_person=xpath>//span[.='确 定']4 、PageObject(获取页面元素)此次例子分为登录、首页-通讯录、添加联系人三个步骤4.1 登录页面的元素获取----login_page.py#encoding=utf-8from ProjectVar.Var import *from Util.GetConf import *from Util.ObjectMap import *from Util.Driver import *class LoginPage(object): def __init__(self): self.cf=ParsePageObjectRepositoryConfig() #section需要修改 self.login_page_items=self.cf.getItemsFromSection('126mail_login')#得到的是字典 def iframe(self): #获取iframe locateType=self.login_page_items['loginpage.frame'].split('>')[0] locateExpression=self.login_page_items['loginpage.frame'].split('>')[1] return getEelement(driver,locateType,locateExpression) def username(self): #获取iframe locateType=self.login_page_items['loginpage.username'].split('>')[0] locateExpression=self.login_page_items['loginpage.username'].split('>')[1] return getEelement(driver,locateType,locateExpression) def password(self): #获取iframe locateType=self.login_page_items['loginpage.password'].split('>')[0] locateExpression=self.login_page_items['loginpage.password'].split('>')[1] return getEelement(driver,locateType,locateExpression) def login_button(self): #获取iframe locateType=self.login_page_items['loginpage.loginbutton'].split('>')[0] locateExpression=self.login_page_items['loginpage.loginbutton'].split('>')[1] return getEelement(driver,locateType,locateExpression)
4.2首页,通讯录元素获取---home_page.py#encoding=utf-8from ProjectVar.Var import *from Util.GetConf import *from Util.ObjectMap import *from Util.Driver import *class HomePage(object): def __init__(self): self.cf=ParsePageObjectRepositoryConfig() #section需要修改 self.login_page_items=self.cf.getItemsFromSection('126mail_homepage') def addressbook(self): #获取addressbook locateType=self.login_page_items['home_age.addressbook'].split('>')[0] locateExpression=self.login_page_items['home_age.addressbook'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression)
4.3添加联系人页面元素获取----address_book.py
#encoding=utf-8from ProjectVar.Var import *from Util.GetConf import *from Util.ObjectMap import *from Util.Driver import *class AddressBook(object): def __init__(self): self.cf=ParsePageObjectRepositoryConfig() #section需要修改 self.login_page_items=self.cf.getItemsFromSection('126mail_addcontactspage') def AddContactsButton(self): #获取addressbook locateType=self.login_page_items['addcontacts_page.create_contacts_btn'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.create_contacts_btn'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression) def PersonName(self): #联系人名字 locateType=self.login_page_items['addcontacts_page.contact_person_name'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.contact_person_name'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression) def Email(self): #联系人邮箱 locateType=self.login_page_items['addcontacts_page.contact_person_email'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.contact_person_email'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression) def Star(self): #星级联系人 locateType=self.login_page_items['addcontacts_page.star_contacts'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.star_contacts'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression) def Mobile(self): #电话 locateType=self.login_page_items['addcontacts_page.contact_person_mobile'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.contact_person_mobile'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression) def Comment(self): #备注 locateType=self.login_page_items['addcontacts_page.contact_person_comment'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.contact_person_comment'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression) def Save(self): #保存 locateType=self.login_page_items['addcontacts_page.save_contace_person'].split('>')[0] locateExpression=self.login_page_items['addcontacts_page.save_contace_person'].split('>')[1] print locateExpression,locateType return getEelement(driver,locateType,locateExpression)
5、 TestData ----数据和结果excel表格(数据驱动)
到目前为止,我的目录结构是这样的:
- Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)
- Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(一)
- 基于python的自动化测试框架搭建
- 基于selenium的自动化测试框架实现
- 自动化测试接口的实现,基于python
- 自动化测试框架的搭建
- 自动化测试框架的搭建
- 基于Sahi和Twist搭建的Web自动化测试框架
- 基于数据驱动的接口自动化测试解决方案
- 基于数据驱动的web UI自动化测试
- Python 基于python+Testlink+Jenkins实现的接口自动化测试框架
- IOS开发-基于WebDriverAgent代理服务,实现iOS手机app自动化测试的框架搭建
- 基于testNg的测试框架设计(一)数据驱动
- 基于Selenium2与Python的自动化测试环境配置搭建
- 基于python的selenium自动化测试环境搭建
- 在Windows搭建基于selenium+python的自动化测试环境
- 自动化测试的数据框架
- 自动化测试的数据框架
- ShaderForge API
- 简单的日夜模式切换
- Spark内核源码深度剖析:宽依赖与窄依赖深度剖析
- js对象的深浅拷贝
- image的尺寸的适配
- Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)
- C# Aspose.Word 操作word文档【五】
- java开发/10.1-10.3/邓聪
- 柱状图,饼状图,报表插件
- [k8s]args指令案例-彻底理解docker entrypoint
- dfs学习之打家劫舍(3)
- java web中监听本地磁盘文件,并进行上传,复制,处理等
- java中的基本数据类型
- 余弦相似度与正规化的欧氏距离的某种等价性