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表格(数据驱动)


到目前为止,我的目录结构是这样的:




阅读全文
0 0
原创粉丝点击