python webdriver 测试框架-数据驱动xml驱动方式
数据驱动xml驱动的方式
存数据的xml文件:
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:#用来读取xml的数据
#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文件的根节点对象,也就是树的根
# 然后返回给调用者
print "tree.getroot:",tree.getroot()
return tree.getroot()#获取根节点
def findNodeByName(self, parentNode, nodeName):#子孙节点都可以找到
# 通过节点的名字,获取节点对象
nodes = parentNode.findall(nodeName)
print "nodes:",nodes
return nodes#返回一个list
def getNodeOfChildText(self, node):
# 获取节点node下所有子节点的节点名作为key,
# 文本节点value作为value组成的字典对象,若从0开始,则包含父节点的标签,例如book
#childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}#把0节点排除,就是父节点本身,不要
#print"childrenTextDict:", childrenTextDict
# 上面代码等价于下面代码
childrenTextDict = {}
print " node.iter():",list(node.iter())#node.iter()-包含自己及子孙节点的迭代器,转成list后,每个元素是一个节点信息
for i in list(node.iter())[1:]:#排除父节点本身-book,剩下name和author
childrenTextDict[i.tag] = i.text
print" childrenTextDict:", childrenTextDict
return childrenTextDict#返回一个字典
def getDataFromXml(self):
# 获取xml文档树的根节点对象
root = self.getRoot()
# 获取根节点下所有名叫book的节点对象
books = self.findNodeByName(root, "book")
dataList = []
# 遍历获取到的所有book节点对象,
# 取得需要的测试数据
for book in books:
childrenText = self.getNodeOfChildText(book)
dataList.append(childrenText)
print "dataList:",dataList
return dataList
if __name__ == '__main__':
xml = ParseXML(r"D:\\test\\0629\\TestData.xml")
datas = xml.getDataFromXml()
for i in datas:
print ' i["name"], i["author"]:',i["name"], i["author"]
单独运行结果:
d:\test\0629>python XmlUtil.py
tree.getroot: <Element 'bookList' at 0x591e5b0>
nodes: [<Element 'book' at 0x591e770>, <Element 'book' at 0x591e790>, <Element 'book' at 0x591e910>]
node.iter(): [<Element 'book' at 0x591e770>, <Element 'name' at 0x591e7d0>, <Element 'author' at 0x591e850>]
childrenTextDict: {'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178'}
childrenTextDict: {'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178', 'author': u'\u5434\u6653\u534e'}
node.iter(): [<Element 'book' at 0x591e790>, <Element 'name' at 0x591e8d0>, <Element 'author' at 0x591e8f0>]
childrenTextDict: {'name': u'HTTP\u6743\u5a01\u6307\u5357'}
childrenTextDict: {'name': u'HTTP\u6743\u5a01\u6307\u5357', 'author': u'\u53e4\u5c14\u5229'}
node.iter(): [<Element 'book' at 0x591e910>, <Element 'name' at 0x591e9b0>, <Element 'author' at 0x591e9d0>]
childrenTextDict: {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5'}
childrenTextDict: {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5', 'author': u'\u60e0\u7279\u514b'}
dataList: [{'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178', 'author': u'\u5434\u6653\u534e'}, {'name': u'HTTP\u6743\u5a01\u6307\u5357', 'author': u'\u53e4\u5c14\u5229'}, {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5', 'author': u'\u60e0\u7279\u514b'}]
i["name"], i["author"]: Selenium WebDriver实战宝典 吴晓华
i["name"], i["author"]: HTTP权威指南 古尔利
i["name"], i["author"]: 探索式软件测试 惠特克
修改后代替childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}#:
#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文件的根节点对象,也就是树的根
# 然后返回给调用者
print "tree.getroot:",tree.getroot()
return tree.getroot()#获取根节点
def findNodeByName(self, parentNode, nodeName):#子孙节点都可以找到
# 通过节点的名字,获取节点对象
nodes = parentNode.findall(nodeName)
print "nodes:",nodes
return nodes#返回一个list
def getNodeOfChildText(self, node):
# 获取节点node下所有子节点的节点名作为key,
# 文本节点value作为value组成的字典对象,若从0开始,则包含父节点的标签,例如book
childrenTextDict = {i.tag: i.text for i in list(node.iter())[1:]}#把0节点排除,就是父节点本身,不要
print" childrenTextDict:", childrenTextDict
return childrenTextDict#返回一个字典
#上面代码等价于下面代码
'''
childrenTextDict = {}
print " node.iter():",list(node.iter())#node.iter()-包含自己及子孙节点的迭代器,转成list后,每个元素是一个节点信息
for i in list(node.iter())[1:]:#排除父节点本身-book,剩下name和author
childrenTextDict[i.tag] = i.text
print" childrenTextDict:", childrenTextDict
return childrenTextDict#返回一个字典,每次返回包含一个name,一个author的字典
'''
def getDataFromXml(self):
# 获取xml文档树的根节点对象
root = self.getRoot()
# 获取根节点下所有名叫book的节点对象
books = self.findNodeByName(root, "book")
dataList = []
# 遍历获取到的所有book节点对象,
# 取得需要的测试数据
for book in books:
childrenText = self.getNodeOfChildText(book)
dataList.append(childrenText)
print "dataList:",dataList
return dataList
if __name__ == '__main__':
xml = ParseXML(r"D:\\test\\0629\\TestData.xml")
datas = xml.getDataFromXml()
for i in datas:
print ' i["name"], i["author"]:',i["name"], i["author"]
单独运行结果:
d:\test\0629>python XmlUtil.py
tree.getroot: <Element 'bookList' at 0x532e630>
nodes: [<Element 'book' at 0x532e7f0>, <Element 'book' at 0x532e810>, <Element 'book' at 0x532e990>]
childrenTextDict: {'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178', 'author': u'\u5434\u6653\u534e'}
childrenTextDict: {'name': u'HTTP\u6743\u5a01\u6307\u5357', 'author': u'\u53e4\u5c14\u5229'}
childrenTextDict: {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5', 'author': u'\u60e0\u7279\u514b'}
dataList: [{'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178', 'author': u'\u5434\u6653\u534e'}, {'name': u'HTTP\u6743\u5a01\u6307\u5357', 'author': u'\u53e4\u5c14\u5229'}, {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5', 'author': u'\u60e0\u7279\u514b'}]
i["name"], i["author"]: Selenium WebDriver实战宝典 吴晓华
i["name"], i["author"]: HTTP权威指南 古尔利
i["name"], i["author"]: 探索式软件测试 惠特克
data_drivern_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 = 'd:/dataDriveRreport.log',
# 打开日志文件的方式
filemode = 'a'
)
# 创建ParseXML类实例对象
xml = ParseXML(ur"d:\test\TestData.xml")
@ddt.ddt
class TestDemo(unittest.TestCase):
def setUp(self):
self.driver=webdriver.Firefox(executable_path="c:\\geckodriver")
@ddt.data(*xml.getDataFromXml())
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, e:
logging.error(u"查找的页面元素不存在,异常堆栈信息:"\
+ str(traceback.format_exc()))
except AssertionError, e:
logging.info(u"搜索“%s”,期望“%s”,失败" %(testData, expectData))
except Exception, 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()
结果:
d:\test\0629>python test.py
tree.getroot: <Element 'bookList' at 0x5e771b0>
nodes: [<Element 'book' at 0x5e77370>, <Element 'book' at 0x5e774b0>, <Element 'book' at 0x5e77590>]
childrenTextDict: {'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178', 'author': u'\u5434\u6653\u534e'}
childrenTextDict: {'name': u'HTTP\u6743\u5a01\u6307\u5357', 'author': u'\u53e4\u5c14\u5229'}
childrenTextDict: {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5', 'author': u'\u60e0\u7279\u514b'}
dataList: [{'name': u'Selenium WebDriver\u5b9e\u6218\u5b9d\u5178', 'author': u'\u5434\u6653\u534e'}, {'name': u'HTTP\u6743\u5a01\u6307\u5357', 'author': u'\u53e4\u5c14\u5229'}, {'name': u'\u63a2\u7d22\u5f0f\u8f6f\u4ef6\u6d4b\u8bd5', 'author': u'\u60e0\u7279\u514b'}]
Selenium WebDriver实战宝典 吴晓华
.HTTP权威指南 古尔利
.探索式软件测试 惠特克
.
----------------------------------------------------------------------
Ran 3 tests in 52.651s
OK
dataDriveReport.log:
Fri, 2018-06-29 22:08:20 test.py[line:61] INFO 搜索“Selenium WebDriver实战宝典”,期望“吴晓华”通过
Fri, 2018-06-29 22:08:38 test.py[line:61] INFO 搜索“HTTP权威指南”,期望“古尔利”通过
Fri, 2018-06-29 22:08:54 test.py[line:61] INFO 搜索“探索式软件测试”,期望“惠特克”通过
python webdriver 测试框架-数据驱动xml驱动方式的更多相关文章
- python webdriver 测试框架-数据驱动excel驱动的方式
简介: 数据驱动excel驱动方式,就是数据配置在excel里面,主程序调用的时候每次用从excel里取出的数据作为参数,进行操作, 需要掌握的地方是对excel的操作,要灵活的找到目标数据 测试数据 ...
- python webdriver 测试框架-数据驱动exce驱动,不用ddt的方式
data.xlsx: 脚本: #encoding=utf-8from selenium import webdriverimport timeimport datetimefrom openpyxl ...
- python webdriver 测试框架-数据驱动json文件驱动的方式
数据驱动json文件的方式 test_data_list.json: [ "邓肯||蒂姆", "乔丹||迈克尔", "库里||斯蒂芬", & ...
- python webdriver 测试框架-数据驱动txt文件驱动,带报告的例子
数据驱动txt文件驱动的方式,带报告 data.txt: gloryroad test||光荣之路 摔跤爸爸||阿米尔 超人||电影 data_driven_by_txt_file.py: #enco ...
- python webdriver 测试框架-数据驱动DDT的例子
先在cmd环境 运行 pip install ddt 安装数据驱动ddt模块 脚本: #encoding=utf-8 from selenium import webdriver import un ...
- python webdriver 测试框架-行为驱动例子
安装行为驱动模块lettuce(卷心菜)模块 pip install lettuce Successfully installed argparse-1.4.0 colorama-0.3.9 extr ...
- python nose测试框架全面介绍十---用例的跳过
又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...
- python nose测试框架全面介绍七--日志相关
引: 之前使用nose框架时,一直使用--logging-config的log文件来生成日志,具体的log配置可见之前python nose测试框架全面介绍四. 但使用一段时间后,发出一个问题,生成的 ...
- python nose测试框架全面介绍六--框架函数别名
之前python nose测试框架全面介绍二中介绍了nose框架的基本构成,但在实际应该中我们也会到setup_function等一系列的名字,查看管网后,我们罗列下nose框架中函数的别名 1.pa ...
随机推荐
- Linux dstat 命令
dstat 是一个监控系统资源使用情况的工具,常见用法如下: [root@localhost ~]$ yum install -y dstat [root@localhost ~]$ dstat -- ...
- 上传控件CSS用图片代替
<style type="text/css"> a.btn {width: 120px;height: 42px;overflow: hidden;display: b ...
- Docker源码分析(五):Docker Server的创建
1.Docker Server简介 Docker架构中,Docker Server是Docker Daemon的重要组成部分.Docker Server最主要的功能是:接受用户通过Docker Cli ...
- Docker源码分析(四):Docker Daemon之NewDaemon实现
1. 前言 Docker的生态系统日趋完善,开发者群体也在日趋庞大,这让业界对Docker持续抱有极其乐观的态度.如今,对于广大开发者而言,使用Docker这项技术已然不是门槛,享受Docker带来的 ...
- 【BZOJ4774/4006】修路/[JLOI2015]管道连接 斯坦纳树
[BZOJ4774]修路 Description 村子间的小路年久失修,为了保障村子之间的往来,法珞决定带领大家修路.对于边带权的无向图 G = (V, E),请选择一些边,使得1 <= i & ...
- 补课:PageRank
最近连续听到PageRank算法,久闻其名,不闻其详,心里虚得很,今儿补补课. PageRank算法的网络资料非常全面,毕竟是将近二十年的经典算法,算法细节可以参考文末链接,这里简单说说我的理解. P ...
- Vue 学习顺序
起步: 1.扎实的 JavaScript / HTML / CSS 基本功,ES6 最好过一遍 2.通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script&g ...
- CSS Spritec下载,精灵图,雪碧图,初探之原理、使用
CSS Spritec下载,精灵图,雪碧图,初探之原理.使用 关于CSS Sprite CSSSprites在国内很多人叫css精灵雪碧图,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零 ...
- 虚拟机中CentoOs配置ip且连网
1.修改"VMware Network Adapter VMnet8",配置IP 2.打开虚拟机,"编辑" => "虚拟网络编辑器", ...
- Intellij idea的Dependencies波浪线
昨天在家做项目不知道搞了什么出现了大量波浪线.搞了大半天解决了下面的问题. 1.pom.xml出现波浪线.看右边 maven project-->Profiles 勾选dev 2.上面已勾选还有 ...