您的位置:首页 > 编程语言 > Python开发

Python-基于数据驱动模式的自动化测试框架搭建的的逐步实现(二)

2017-10-12 13:43 711 查看
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-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)


1.2 Excel操作的封装-----Excel.py

由于用的是数据驱动框架类型,这里我使用excel来读取测试数据、记录测试结果,那么就避免不了excel的大量操作,所以把excel的大部分操作封装起来,后续调用---我常用的excel操作是查询和插入,见代码:<
125d7
br />

#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


1.3 配置文件的基本操作的封装----GetConf.py

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)

1.4 Driver.py 得到driver

代码如下:

#encoding=utf-8

from selenium import webdriver

driver=webdriver.Chrome(executable_path='c:\\Python27\\chromedriver')


2、ProjectVar

2.1 将工程中用到的已知元素封装起来,在脚本中直接传递变量名称即可---var.py

见代码:
#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'


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::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)

4.2首页,通讯录元素获取---home_page.py
#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)

4.3添加联系人页面元素获取----address_book.py

#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)

5、 TestData ----数据和结果excel表格(数据驱动)

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: