数据驱动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 搜索“探索式软件测试”,期望“惠特克”通过

转载于:https://www.cnblogs.com/xiaxiaoxu/p/9245611.html

python webdriver 测试框架-数据驱动xml驱动方式相关推荐

  1. python数据驱动库_python webdriver测试框架--数据驱动DB驱动

    简介: 数据驱动数据库驱动方式,就是数据配置在数据库里面,主程序调用的时候每次用从数据库里取出的数据作为参数,进行操作, 需要掌握的地方是对数据库的操作,要灵活的找到目标数据 测试数据: 创建数据库. ...

  2. python nose测试框架全面介绍十---用例的跳过

    又来写nose了,这次主要介绍nose中的用例跳过应用,之前也有介绍,见python nose测试框架全面介绍四,但介绍的不详细.下面详细解析下 nose自带的SkipTest 先看看nose自带的S ...

  3. Pytest 测试框架——数据驱动

    引言 前面已经和大家介绍过 Unittest 测试框架的数据驱动框架 DDT,以及其实现原理.今天和大家分享的是 Pytest 测试框架的数据驱动,Pytest 测试框架的数据驱动是由 pytest ...

  4. python api测试框架_python api 测试框架

    python常用框架 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是 ...

  5. Python 各种测试框架简介(三):nose

    摘要 这里将从( pythontesting.net)陆续编译四篇 Python 测试框架的简介,分别为:doctest.unittest.nose 和 pytest.本篇为第三篇:nose 本篇将介 ...

  6. 微服务pact测试框架_消费者驱动的Pact和Spring Boot测试

    微服务pact测试框架 最近,我的一位同事偶然发现了Pact.io ,我们目前的应用程序已扩展到 50多种服务,并且我们开始出现一些集成测试失败和脆弱的开发/验收测试环境. 因此,我们决定研究尝试与此 ...

  7. Python pytest测试框架详解

    pytest介绍: pytest是一个非常成熟的全功能的Python测试框架: 1.简单灵活,容易上手 2.支持参数化 3.测试用例的skip和xfail,自动失败重试等处理 4.能够支持简单的单元测 ...

  8. 「高效程序员的修炼」快速上手python主流测试框架pytest以及单元测试编写

    如果对你有帮助,就点个赞吧~ 本文主要介绍如果编写Python的单元测试,包括如何使用断言,如何考虑测试哪些情况,如何避免外部依赖对测试的影响,如果用数据驱动的方式简化重复测试的编写等等等等 文章目录 ...

  9. python pytest测试框架(一)

    目录 一.安装 二.第一个测试例子 三.pytest参数 1.-K EXPRESSION 3.--maxfail=num 4.-m MARKEXPR 5. -v, --verbose 6.-q, -- ...

最新文章

  1. cmake,gtest单元测试程序
  2. Appium 移动端自动化 - Android SDK的安装与配置,使用安卓SDK连接手机实例演示
  3. LeetCode 202 -- python 计算 happy number
  4. Spark中的键值对操作-scala
  5. 黑马程序员-10 IO流2 File,properties,合并流,对象持久化,管道流,RandomAccessFile...
  6. #6682. 梦中的数论(Min25筛)
  7. 随想录(做自己代码的测试工程师)
  8. console错误合集
  9. VC ODBC使用总结
  10. 不懂技术的小白,使用电商网站建设工具有什么注意事项?
  11. iredmail mysql_iRedmail配置手册
  12. 免费注册Gmail邮箱
  13. OpenCvSharp (C# OpenCV) OCR实现中英文识别 文字识别(附WinForm完整源码)
  14. 谷歌云端硬盘快速下载方法_如何快速搜索Google云端硬盘
  15. Unity—Json1
  16. PHP服务器获取客户端IP地址
  17. 2022-4-4 基于单片机的MQ2烟雾报警(风吹摇铃 奔赴星海)
  18. Android Studio 导出的apk安装时出现解析软件包错误(已解决)
  19. [Editing] TP-LINK740N v5 firmware Crack
  20. 江理工单片机实训(自动窗帘模拟控制系统)

热门文章

  1. 基于RK3288的双屏异显实现
  2. 解决启动tomcat时,一直卡在Deploying web application directory的问题
  3. 【Python学习】各国人口数据爬取
  4. STM32F7 ADC+DMA 目标数组无更新 解决办法
  5. 使用高德地图时添加的权限
  6. 不错的国产动画片《飞机总动员》
  7. 8位并行左移串行转换电路_三菱plc试题及答案
  8. alloc_skb申请函数分析
  9. 21年研究生入学考试(哈尔滨工程大学)复试准备——《网络安全》选择题错题总结
  10. 基于Basys3设计的多功能电子琴