数据驱动:程序不变,数据变
首先自定义一个data.txt文件,下面附data.txt文件内容供参考
data.txt
gloryroad test||光荣之路
摔跤爸爸||阿米尔
超人||电影
data_driven_by_txt_file.py
适合做局部自动化:
#encoding=utf-8
from selenium import webdriver
import time
import traceback
with open(u"E:\\PythonDemo\\Glory\\20190224\\data.txt") as fp:
data=fp.readlines()
driver=webdriver.Ie(executable_path="d:\\chromedriver.exe")
test_result=[]
for i in range(len(data)):
try:
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys(\
data[i].split("||")[0].strip())
driver.find_element_by_id("su").click()
time.sleep(3)
assert data[i].split('||')[1].strip()\
in driver.page_source
test_result.append(data[i].strip()+u"||成功\n")
print (data[i].split('||')[0].strip()+u"搜索测试执行成功")
except AssertionError as e:
print (data[i].split('||')[1].strip()+u"测试断言失败")
test_result.append(data[i].strip()+u"||断言失败\n")
except Exception as e:
print (data[i].split('||')[1].strip()+u"测试执行失败")
test_result.append(data[i].strip()+u"||异常失败\n")
traceback.print_exc()
with open(u"result.txt","w") as fp:
fp.writelines(test_result)
#driver.quit()
优化第2种方法:
换了路径
#encoding=utf-8
from selenium import webdriver
import time
import traceback
with open(os.path.join(os.path.dirname(os.path.abspath(__file__)),"data.txt")) as fp:
data=fp.readlines()
driver=webdriver.Ie(executable_path="e:\\IEDriverServer")
test_result=[]
for i in range(len(data)):
try:
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys(\
data[i].split("||")[0].strip())
driver.find_element_by_id("su").click()
time.sleep(3)
assert data[i].split('||')[1].strip()\
in driver.page_source
test_result.append(data[i].strip()+u"||成功\n")
print (data[i].split('||')[0].strip()+u"搜索测试执行成功")
except AssertionError as e:
print (data[i].split('||')[1].strip()+u"测试断言失败")
test_result.append(data[i].strip()+u"||断言失败\n")
except Exception as e:
print (data[i].split('||')[1].strip()+u"测试执行失败")
test_result.append(data[i].strip()+u"||异常失败\n")
traceback.print_exc()
with open(u"result.txt","w") as fp:
fp.writelines(test_result)
driver.quit()
data_driven_by_xml.py
#encoding=utf-8
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from XmlUtil import ParseXML
from selenium.common.exceptions import NoSuchElementException
#初始化日志对象
logging.basicConfig(
# 日志级别
level = logging.INFO,
# 日志格式
# 时间、代码所在文件名、代码行号、日志级别名字、日志信息
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# 打印日志的时间
datefmt = '%a, %Y-%m-%d %H:%M:%S',
# 日志文件存放的目录(目录必须存在)及日志文件名
filename = 'e:/dataDriveRreport.log',
# 打开日志文件的方式
filemode = 'a'
)
#创建ParseXML类实例对象
xml = ParseXML("TestData.xml")
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Ie(executable_path = "e:\\IEDriverServer")
@ddt.data(*xml.getDataFromXml("book"))
def test_dataDrivenByFile(self, data):
testData, expectData = data["name"], data["author"]
url = "http://www.baidu.com"
# 访问百度首页
self.driver.get(url)
# 将浏览器窗口最大化
self.driver.maximize_window()
print (testData, expectData)
# 设置隐式等待时间为10秒
self.driver.implicitly_wait(10)
try:
# 找到搜索输入框,并输入测试数据
self.driver.find_element_by_id("kw").send_keys(testData)
# 找到搜索按钮,并点击
self.driver.find_element_by_id("su").click()
time.sleep(3)
# 断言期望结果是否出现在页面源代码中
self.assertTrue(expectData in self.driver.page_source)
except NoSuchElementException as e:
logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
+ str(traceback.format_exc()))
except AssertionError as e:
logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
except Exception as e:
logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
else:
logging.info(u"搜索“%s”,期望“%s”通过" %(testData, expectData))
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
解包:
前面加* 是解包,如下面的例子
def print_sth(a,b,*c):
print(a,b)
print(len(c))
print_sth(*[100,200,300,400])
基于XML做数据驱动 程序不变 数据变
涉及到3个例子:
data_driven_by_xml.py
TestData.xml
XmlUtil.py
就是这3个文件 就是一个简单的数据驱动框架 上面如果是txt 那就是基于txt文件做数据驱动
data_driven_by_xml.py
#encoding=utf-8
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from XmlUtil import ParseXML
from selenium.common.exceptions import NoSuchElementException
#初始化日志对象
logging.basicConfig(
# 日志级别
level = logging.INFO,
# 日志格式
# 时间、代码所在文件名、代码行号、日志级别名字、日志信息
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# 打印日志的时间
datefmt = '%a, %Y-%m-%d %H:%M:%S',
# 日志文件存放的目录(目录必须存在)及日志文件名
filename = 'e:/dataDriveRreport.log',
# 打开日志文件的方式
filemode = 'a'
)
#创建ParseXML类实例对象
xml = ParseXML(r"E:\PythonDemo\Glory\20190224\TestData.xml")
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Ie(executable_path = "d:\\chromedriver.exe")
@ddt.data(*xml.getDataFromXml("book"))
def test_dataDrivenByXml(self, data):
testData, expectData = data["name"], data["author"]
url = "http://www.baidu.com"
# 访问百度首页
self.driver.get(url)
# 将浏览器窗口最大化
self.driver.maximize_window()
print (testData, expectData)
# 设置隐式等待时间为10秒
self.driver.implicitly_wait(10)
try:
# 找到搜索输入框,并输入测试数据
self.driver.find_element_by_id("kw").send_keys(testData)
# 找到搜索按钮,并点击
self.driver.find_element_by_id("su").click()
time.sleep(3)
# 断言期望结果是否出现在页面源代码中
self.assertTrue(expectData in self.driver.page_source)
except NoSuchElementException as e:
logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
+ str(traceback.format_exc()))
except AssertionError as e:
logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
except Exception as e:
logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
else:
logging.info(u"搜索“%s”,期望“%s”通过" %(testData, expectData))
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
TestData.xml
<?xml version="1.0" encoding="utf-8"?>
<bookList type="technology">
<book>
<name>Selenium WebDriver实战宝典</name>
<author>吴晓华</author>
</book>
<book>
<name>HTTP权威指南</name>
<author>古尔利</author>
</book>
<book>
<name>探索式软件测试</name>
<author>惠特克</author>
</book>
</bookList>
XmlUtil.py
#encoding=utf-8
from xml.etree import ElementTree
‘’’
步骤:
1 读取xml –init()
2 获取root节点–getroot()
3 获取root节点下的book所有节点 —findNodeByName
4 将book节点下的所有信息放到dict里面—findNodeByName
5 将所有book节点的dict放到datalist,来做数据驱动————getDataFromXml
‘’’
class ParseXML(object):
def __init__(self, xmlPath):
self.xmlPath = xmlPath
def getRoot(self):
# 打开将要解析的xml文件
tree = ElementTree.parse(self.xmlPath)
# 获取xml文件的根节点对象,也就是树的根
# 然后返回给调用者
return tree.getroot()
def findNodeByName(self, parentNode, nodeName):
# 通过节点的名字,获取节点对象
nodes = parentNode.findall(nodeName)
return nodes
def getNodeOfChildText(self, node):
# 获取节点node下所有子节点的节点名作为key,
# 文本节点作为value组成的字典对象,若从0开始,则包含父节点的标签,例如book
childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}
#print( childrenTextDict)
# 上面代码等价于下面代码
'''
childrenTextDict = {}
for i in list(node.iter())[1:]:
childrenTextDict[i.tag] = i.text
'''
return childrenTextDict
def getDataFromXml(self,data_name):
# 获取xml文档树的根节点对象
root = self.getRoot()
# 获取根节点下所有名叫book的节点对象
books = self.findNodeByName(root, data_name)
dataList = []
# 遍历获取到的所有book节点对象,
# 取得需要的测试数据
for book in books:
childrenText = self.getNodeOfChildText(book)
dataList.append(childrenText)
print( dataList)
return dataList
if __name__ == '__main__':
xml = ParseXML(r"TestData.xml")
datas = xml.getDataFromXml("book")
#for i in datas:
# print( i["name"], i["author"]
数据驱动例子3:
基于Excel做数据驱动
结果可以显示了,因为excel经常用
前置条件是 >py -3 -m pip install openpyxl==2.5.4
ExcelUtil.py
data.xlsx
data_drivern_by_excel.py 一个没有用ddt的
data_drivern_by_excel_1.py ddt
这2个data2种文件 2种框架
数据库做数据驱动 主要用在平台:
ExcelUtil.py
#encoding=utf-8
from openpyxl import load_workbook
class ParseExcel(object):
def __init__(self, excelPath, sheetName):
# 将要读取的excel加载到内存
self.wb = load_workbook(excelPath)
# 通过工作表名称获取一个工作表对象
self.sheet = self.wb.get_sheet_by_name(sheetName)
# 获取工作表中存在数据的区域的最大行号
self.maxRowNum = self.sheet.max_row
def getDatasFromSheet(self):
# 用于存放从工作表中读取出来的数据
dataList = []
# 因为工作表中的第一行是标题行,所以需要去掉
for line in self.sheet.rows:
# 遍历工作表中数据区域的每一行,
# 并将每行中各个单元格的数据取出存于列表tmpList中,
# 然后再将存放一行数据的列表添加到最终数据列表dataList中
tmpList = []
tmpList.append(line[1].value)
tmpList.append(line[2].value)
dataList.append(tmpList)
# 将获取工作表中的所有数据的迭代对象返回
return dataList[1:]
if __name__ == '__main__':
excelPath = u'data.xlsx'
sheetName = u"搜索数据表"
pe = ParseExcel(excelPath, sheetName)
print (pe.getDatasFromSheet())
for i in pe.getDatasFromSheet():
print (i[0], i[1])
data.xlsx
序号 搜索词 期望结果 测试时间 测试结果
1 邓肯 蒂姆111
2 乔丹 迈克尔
3 库里 斯蒂芬
data_drivern_by_excel.py
#encoding=utf-8
from selenium import webdriver
import unittest, time
import logging, traceback
import ddt
from ExcelUtil import ParseExcel
from selenium.common.exceptions import NoSuchElementException
#初始化日志对象
logging.basicConfig(
# 日志级别
level = logging.INFO,
# 日志格式
# 时间、代码所在文件名、代码行号、日志级别名字、日志信息
format = '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
# 打印日志的时间
datefmt = '%a, %Y-%m-%d %H:%M:%S',
# 日志文件存放的目录(目录必须存在)及日志文件名
filename = 'e:/dataDriveRreport.log',
# 打开日志文件的方式
filemode = 'w'
)
excelPath = u'data.xlsx'
sheetName = u"搜索数据表"
#创建ParseExcel类的实例对象
excel = ParseExcel(excelPath, sheetName)
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Ie(executable_path = "d:\\chromedriver.exe")
@ddt.data(*excel.getDatasFromSheet())
def test_dataDrivenByFile(self, data):
testData, expectData = tuple(data)
url = "http://www.baidu.com"
# 访问百度首页
self.driver.get(url)
# 将浏览器窗口最大化
self.driver.maximize_window()
print (testData, expectData)
# 设置隐式等待时间为10秒
self.driver.implicitly_wait(10)
try:
# 获取当前的时间戳,用于后面计算查询耗时用
start = time.time()
# 获取当前时间的字符串,表示测试开始时间
startTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 找到搜索输入框,并输入测试数据
self.driver.find_element_by_id("kw").send_keys(testData)
# 找到搜索按钮,并点击
self.driver.find_element_by_id("su").click()
time.sleep(3)
# 断言期望结果是否出现在页面源代码中
self.assertTrue(expectData in self.driver.page_source)
print (u"搜索%s,期望%s" %(testData, expectData))
except NoSuchElementException as e:
logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
+ str(traceback.format_exc()))
except AssertionError as e:
print("断言失败了")
logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
except Exception as e:
logging.error(u"未知错误,错误信息:" + str(traceback.format_exc()))
else:
logging.info(u"搜索“%s”,期望“%s”通过" %(testData, expectData))
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()
data_drivern_by_excel_1.py
#encoding=utf-8
from selenium import webdriver
import time
import datetime
from openpyxl import *
wb=load_workbook(u'E:\\PythonDemo\\Glory\\20190224\\data.xlsx')
ws=wb.active #获取第一个sheet
print (u"最大行号:",ws.max_row)
#excel行是从1开始的,所以我们从2开始迭代遍历
#且使用切片,必须有结束行的索引号,不能写为[1:],这样不行
#列号是从0开始的,列取出来是个元组
driver=webdriver.Ie(executable_path="e:\\IEDriverServer")
test_result=[]
for row in ws[2:ws.max_row]:
print (row[1],row[2])
try:
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys(row[1].value)
driver.find_element_by_id("su").click()
time.sleep(3)
assert row[2].value in driver.page_source
row[3].value=time.strftime('%Y-%m-%d %H:%M:%S')
row[4].value=u"成功"
except AssertionError as e:
row[3].value=time.strftime('%Y-%m-%d %H:%M:%S')
row[4].value=u"断言失败"
except Exception as e:
row[3].value=time.strftime('%Y-%m-%d %H:%M:%S')
row[4].value=u"出现异常失败"
driver.quit()
wb.save(u"E:\\PythonDemo\\Glory\\20190224\\data.xlsx") #注意:将直接覆盖,不是更新。