Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)
------封装走起!!
后续关于
大家好,我们继续 <Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现> 之旅,本篇博客开始我们要进入封装的旅途。
首先我们建一个工程,这里面我用的IDE是pycharm,个人觉得还是比较好用的;
这里给初学语言的小朋友们一点小建议:
开始练习编写的时候不建议使用IDE,因为大部分IDE具备联想功能,这样不利于记忆常用命令。我最开始的时候就用的写字板,着实好用,除了空格要手动敲,没有颜色以外,真心不错,可以强化记忆。
这里我给本次工程取的名字叫:data_driven_framework
在本篇博客中,我们要先封装5个packages出来:Until、Conf、PageObject、ProjectVar、TestData
1、Util(相当于底层工具,复用次数多)U
Util中包括一下文件:读写Excel的方法、获取页面元素的方法、读取配置文件的方法、获得driver的方法、
从Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(一)中我们可以看到,好多代码是重复编写的,比如:driver.find_element_by(LocateType,LocateExpression),那么就可以把这个获取元素的操作封装起来,后面要对元素进行操作的时候,直接调用获取元素的方法就好了,这样就降低了代码的冗余度;
话不多说,上代码:
#encoding=utf-8 from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import Select import time def getEelement(driver,locateType,locateExpression): #获取页面单个元素 try: wait=WebDriverWait(driver,10) return wait.until(lambda x:x.find_element(locateType,locateExpression)) except Exception,e: raise e def 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)
由于用的是数据驱动框架类型,这里我使用excel来读取测试数据、记录测试结果,那么就避免不了excel的大量操作,所以把excel的大部分操作封装起来,后续调用---我常用的excel操作是查询和插入,见代码:
#encoding=utf-8 from openpyxl import Workbook from openpyxl import load_workbook from ProjectVar.Var import * from openpyxl.styles import Border,Side,Font class 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
GetConf.py主要的功能是用来提取页面元素的定位方式locateType和定位表达式locateExpression的;
代码如下:
#encoding=utf-8 import ConfigParser from 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)
代码如下:
#encoding=utf-8 from selenium import webdriver driver=webdriver.Chrome(executable_path='c:\\Python27\\chromedriver')
见代码:
#encoding=utf-8 import 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'
这里将要操作的页面元素的定位路径全都写在这个配置文件,按照页面来写,每个操作页面的写在不同的标签栏里面;
本次例子需要的页面元素如下:
[configparse操作配置文件的时候有坑] [ini中的内容要全部小写,否则读取出来的时候会自动转换成小写,这样就会发生匹配不上的情况] [126mail_login] loginpage.frame=xpath>//iframe[@id='x-URS-iframe'] loginpage.username=xpath>//span[.='@126.com']//preceding-sibling::input loginpage.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/input addcontacts_page.contact_person_email=xpath>//*[@id='iaddress_MAIL_wrap']//input addcontacts_page.star_contacts=xpath>//span[text()='设为星标联系人']/preceding-sibling::span/b addcontacts_page.contact_person_mobile=xpath>//*[@id='iaddress_TEL_wrap']//dd//input addcontacts_page.contact_person_comment=xpath>//textarea addcontacts_page.save_contace_person=xpath>//span[.='确 定'] 4 、PageObject(获取页面元素) 此次例子分为登录、首页-通讯录、添加联系人三个步骤 4.1 登录页面的元素获取----login_page.py
#encoding=utf-8 from 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)
#encoding=utf-8 from 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)
#encoding=utf-8 from 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)
到目前为止,我的目录结构是这样的: