python webdriver 测试框架数据驱动json文件驱动的方式

简介:

数据驱动excel驱动方式,就是数据配置在excel里面,主程序调用的时候每次用从excel里取出的数据作为参数,进行操作,

需要掌握的地方是对excel的操作,要灵活的找到目标数据

测试数据.xlsx:

路径-D:\test\0627

ExcelUtil.py:

 
  1. #encoding=utf-8

  2. from openpyxl import load_workbook

  3. class ParseExcel(object):

  4.     def __init__(self, excelPath, sheetName):

  5.         # 将要读取的excel加载到内存

  6.         self.wb = load_workbook(excelPath)

  7.         # 通过工作表名称获取一个工作表对象

  8.         self.sheet = self.wb.get_sheet_by_name(sheetName)

  9.         # 获取工作表中存在数据的区域的最大行号

  10.         self.maxRowNum = self.sheet.max_row

  11.     def getDatasFromSheet(self):

  12.         # 用于存放从工作表中读取出来的数据

  13.         dataList = []

  14.         # 因为工作表中的第一行是标题行,所以需要去掉

  15.         for line in self.sheet.rows:  

  16.             # 遍历工作表中数据区域的每一行,

  17.             # 并将每行中各个单元格的数据取出存于列表tmpList中,

  18.             # 然后再将存放一行数据的列表添加到最终数据列表dataList中

  19.             tmpList = []

  20.             tmpList.append(line[1].value)

  21.             tmpList.append(line[2].value)

  22.             dataList.append(tmpList)

  23.         # 将获取工作表中的所有数据的迭代对象返回

  24.         return dataList[1:]

  25. if __name__ == '__main__':

  26.     excelPath = u'E:\\数据驱动\\测试数据.xlsx'

  27.     sheetName = u"搜索数据表"

  28.     pe = ParseExcel(excelPath, sheetName)

  29.     print pe.getDatasFromSheet()

  30.     for i in pe.getDatasFromSheet():

  31.         print i[0], i[1]

加print调试日志:

  1. #encoding=utf-8

  2. from openpyxl import load_workbook

  3. class ParseExcel(object):

  4.     def __init__(self,excelPath,sheetName):

  5.         self.wb=load_workbook(excelPath)

  6.         self.sheet=self.wb.get_sheet_by_name(sheetName)

  7.         self.maxRowNum=self.sheet.max_row

  8.     def getDatasFromSheet(self):

  9.         dataList=[]

  10.         for line in self.sheet.rows:

  11.             tmpList=[]

  12.             tmpList.append(line[1].value)

  13.             print "line[1].value",line[1].value

  14.             tmpList.append(line[2].value)

  15.             print "line[2].value",line[2].value

  16.             dataList.append(tmpList)

  17.         print dataList[1:]

  18.         return dataList[1:]

  19. if __name__=='__main__':

  20.     excelPath=u"d:\\test\\0627\\测试数据.xlsx"

  21.     sheetName=u"搜索数据表"

  22.     pe=ParseExcel(excelPath,sheetName)

  23.     print pe.getDatasFromSheet()

  24.     for i in pe.getDatasFromSheet():

  25.         print i[0],i[1]

  26. 单独运行结果:

  27. D:\test\0627>python  ExcelUtil.py

  28. ExcelUtil.py:7: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).

  29.   self.sheet=self.wb.get_sheet_by_name(sheetName)

  30. line[1].value 搜索词

  31. line[2].value 期望结果

  32. line[1].value 邓肯

  33. line[2].value 蒂姆

  34. line[1].value 乔丹

  35. line[2].value 迈克尔

  36. line[1].value 库里

  37. line[2].value 斯蒂芬

  38. [[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]

  39. [[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]

  40. line[1].value 搜索词

  41. line[2].value 期望结果

  42. line[1].value 邓肯

  43. line[2].value 蒂姆

  44. line[1].value 乔丹

  45. line[2].value 迈克尔

  46. line[1].value 库里

  47. line[2].value 斯蒂芬

  48. [[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]

  49. 邓肯 蒂姆

  50. 乔丹 迈克尔

  51. 库里 斯蒂芬

最后运行的脚本:

 
  1. data_drivern_by_excel.py:

  2. #encoding=utf-8

  3. from selenium import webdriver

  4. import unittest,time

  5. import logging,traceback

  6. import ddt

  7. from ExcelUtil import ParseExcel

  8. from selenium.common.exceptions import NoSuchElementException

  9. #初始化日志对象

  10. logging.basicConfig(

  11.     #日志级别

  12.     level=logging.INFO,

  13.     #日志格式

  14.     #时间、代码所在文件名、代码行号、日志级别名称、日志信息

  15.     format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

  16.     #打印日志的时间

  17.     datefmt='%a,%Y-%m-%d %H:%M:S',

  18.     #日志文件存放的目录(目录必须存在)及日志文件名

  19.     filename='d:\\test\\0627\\report.log',

  20.     #打开日志文件的方式

  21.     filemode='w'

  22. )

  23. excelPath=u"d:\\test\\0627\\测试数据.xlsx"

  24. sheetName=u"搜索数据表"

  25. #创建ParseExcel类的实例对象

  26. excel=ParseExcel(excelPath,sheetName)

  27. #数据驱动装饰器

  28. @ddt.ddt

  29. class TestDemo(unittest.TestCase):

  30.     def setUp(self):

  31.         self.driver=webdriver.Firefox(executable_path='c:\\geckodriver')

  32.     

  33.     @ddt.data(*excel.getDatasFromSheet())#对调用函数返回的含列表的列表进行解包,传过来的就是列表中的一个列表

  34.     def test_dataDrivenByFile(self,data):

  35.         print "tuple(data):",tuple(data)#把传过来的一个列表转换成元祖,包含两个元素,搜索值和期望值

  36.         testData,expectData=tuple(data)

  37.         print "testData:",testData#调试用

  38.         print "expectData:",expectData#调试用

  39.         url='http://www.baidu.com'

  40.         #访问百度首页

  41.         self.driver.get(url)

  42.         #讲浏览器窗口最大化

  43.         self.driver.maximize_window()

  44.         #print testData,expectData   

  45.         #设置隐式等待时间为10秒钟    

  46.         self.driver.implicitly_wait(10)

  47.         try:

  48.             #获取当前的时间戳,用于后面计算查询耗时用

  49.             start=time.time()

  50.             #获取当前时间的字符串,表示测试开始时间

  51.             startTime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())

  52.             #找到搜索输入框,并输入测试数据

  53.             self.driver.find_element_by_id('kw').send_keys(testData)

  54.             #找到搜索按钮,并点击

  55.             self.driver.find_element_by_id('su').click()

  56.             time.sleep(3)

  57.             #断言期望结果是否出现在页面源代码中

  58.             self.assertTrue(expectData in self.driver.page_source)

  59.             print u"搜索-%s,期望-%s"%(testData,expectData)

  60.         except NoSuchElementException,e:

  61.             logging.error(u"查找的页面元素不存在,异常堆栈信息:"+str(traceback.format_exc()))

  62.         except AssertionError,e:

  63.             logging.info(u'搜索-"%s",期望-"%s",-失败'%(testData,expectData))

  64.         except Exception,e:

  65.             logging.error(u"未知错误,错误信息:"+str(traceback.format_exc()))

  66.         else:

  67.             logging.info(u'搜索- "%s",期望-"%s"-通过'%(testData,expectData))

  68.     def tearDown(self):

  69.         self.driver.quit()

  70.     

  71. if __name__=='__main__':

  72.     unittest.main() 

结果:

  1. d:\test\0627>python test.py

  2. d:\test\0627\ExcelUtil.py:11: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).

  3.   self.sheet=self.wb.get_sheet_by_name(sheetName)

  4. tuple(data): (u'\u9093\u80af', u'\u8482\u59c6')

  5. testData: 邓肯

  6. expectData: 蒂姆

  7. 搜索-邓肯,期望-蒂姆

  8. .tuple(data): (u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14')

  9. testData: 乔丹

  10. expectData: 迈克尔

  11. 搜索-乔丹,期望-迈克尔

  12. .tuple(data): (u'\u5e93\u91cc', u'\u65af\u8482\u82ac')

  13. testData: 库里

  14. expectData: 斯蒂芬

  15. 搜索-库里,期望-斯蒂芬

  16. .

  17. ----------------------------------------------------------------------

  18. Ran 3 tests in 45.614s

  19. OK

  20.  

  21. report.log:

  22. Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "邓肯",期望-"蒂姆"-通过

  23. Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "乔丹",期望-"迈克尔"-通过

  24. Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "库里",期望-"斯蒂芬"-通过

如果日志logging部分书写格式有问题、或者路径不存在、或者字符等有问题,日志就会输出到屏幕上,如果没有问题,才会打印到日志文件report.log中

数据驱动excel驱动方式和其他方式(txt等)原理大同小异,都是把数据从文件中取出来,用ddt模块进行解包,传进主程序,难点就是对不同的文件类型进行读取可能需要专门的程序包来处理,说白了,都是对基础的运用进行整合,真正项目中用到的肯定比这个要复杂。。。

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/361232.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

产品原型图设计规范大全

目前,市场上许多产品经理或设计师都在使用一些优秀的原型设计规范,这些规范几乎涵盖了原型设计的许多方面。一套好的、完整的原型设计规范可以统一产品设计风格,检验产品的可用性,有效提高产品经理绘制原型图的效率,更…

力扣238. 除自身以外数组的乘积(前后缀和)

Problem: 238. 除自身以外数组的乘积 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1: 1.先求取数组的包括当前下标值得前后缀乘积(利用两个数组记录下来分别为leftProduct和rightProduct) 2.当求取一个下标为i的数组中的元素&#x…

构建基于Flask的跑腿外卖小程序

跑腿外卖小程序作为现代生活中的重要组成部分,其技术实现涉及诸多方面,其中Web开发框架是至关重要的一环。在这篇文章中,我们将使用Python的Flask框架构建一个简单的跑腿外卖小程序的原型,展示其基本功能和实现原理。 首先&…

linux --中断管理 -- irq的自动探测机制

irq自动探测机制 如果一个设备的驱动程序无法确定它说管理的设备的软件中断号irq,此时设备驱动程序可以使用irq的自动探测机制来获取其正在使用的irq。 使用自动探测机制的条件 内核与驱动,必须共同努力才能完成只限于非共享中断的情况 探测前&#…

如何查看某一页面在在谷歌有哪些关键词

随着跨境贸易的不断发展,谷歌SEO也被越来越多的人群所了解,所接受。我们在日常操作SEO的时候,往往都会远见这样的事情,那就是自己网站的某一个页面原本只是简单的承载着某一个关键词,但是随着时间的推移,这…

Shell脚本之 -------------免交互操作

一、Here Document 1.Here Document概述 Here Document 使用I/O重定向的方式将命令列表提供给交互式程序 Here Document 是标准输 入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,而是直接就地 生产出一个文件并用作命令的标准…

Linux——动静态库

在进行开发过程中,我们不可避免地会使用到人家的库,那么库到底是什 么?而库又分为动态库和静态库,那么这两个又是什么?这篇博客由我来 简单介绍动静态库。文章目录 1. 库2. 静态库a. 静态库的制作b. 使用静态库 3. 动态…

打击者H5小游戏

欢迎来到程序小院 打击者 玩法&#xff1a;点击飞机上下左右移动躲过子弹射击&#xff0c;打掉上方敌人飞机&#xff0c; 遇到药包会增加能量&#xff0c;弹药包会升级武器&#xff0c;快去射击吧^^。开始游戏https://www.ormcc.com/play/gameStart/262 html <div id"…

基于矢量控制的交流电机驱动simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 交流电机基础 4.2 矢量控制原理 4.3 矢量控制的实现 5.完整工程文件 1.课题概述 基于矢量控制的交流电机驱动simulink建模与仿真。系统仿真输出电压&#xff0c;电流&#xff0c;电机转速以及扭矩…

语言革命:NLP与GPT-3.5如何改变我们的世界

文章目录 &#x1f4d1;前言一、技术进步与应用场景1.1 技术进步1.2 应用场景 二、挑战与前景三、伦理和社会影响四、实践经验五、总结与展望 &#x1f4d1;前言 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是人工智能领域的一个重要分支…

快速入门存内计算—助力人工智能加速深度学习模型的训练和推理

存内计算&#xff1a;提高计算性能和能效的新技术 传统的计算机架构是将数据存储在存储器中&#xff0c;然后将数据传输到计算单元进行处理。这种架构存在一个性能瓶颈&#xff0c;即数据传输延迟。存内计算通过将计算单元集成到存储器中&#xff0c;消除了数据传输延迟&#…

中国的茶文化:现代生活中的茶文化

中国的茶文化&#xff1a;现代生活中的茶文化 引言 在现代社会的快节奏生活中&#xff0c;茶文化并未随时间流逝而褪色&#xff0c;反而以其独特的方式融入了全球各地人们的日常生活。它超越了饮品本身的范畴&#xff0c;成为一种连接历史、人文与现代生活方式的艺术形式。本文…

Git 介绍 与 配置

Git 介绍 Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改和协作开发。它可以管理项目的版本历史记录&#xff0c;并允许多个开发者在同一时间进行并行开发。 解决上图产生的问题就出现了git 分布式版本控制系统 看下图 Git 配置 Git的基本配置包括用户名和电子邮…

Linux split命令 切割文件

目录 一. 主要配置项二. 按照行数切割文件三. 按照指定大小切割文件 一. 主要配置项 ⏹将文件按照行数或者大小切割为若干份小文件&#xff0c;主要作用就是用来切割文件 -l&#xff1a;表示将文件按照行分割-d&#xff1a;表示使用数字作为分割后的文件名后缀, 而不是默认的…

BUUCTF-Real-[ThinkPHP]5-Rce

1、ThinkPHP检测工具 https://github.com/anx0ing/thinkphp_scan 漏洞检测 通过漏洞检测&#xff0c;我们发现存在rce漏洞&#xff01; 2、漏洞利用 ---- [!] Name: Thinkphp5 5.0.22/5.1.29 Remote Code Execution VulnerabilityScript: thinkphp5022_5129.pyUrl: http://n…

跟着cherno手搓游戏引擎【16】Camera和Uniform变量的封装

相机封装&#xff1a; OrthographicCamera.h: #pragma once #include <glm/glm.hpp> namespace YOTO {class OrthographicCamera{public:OrthographicCamera(float left,float right , float bottom,float top);const glm::vec3& GetPosition()const { return m_Pos…

阿赵UE学习笔记——13、贴花

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次介绍一种特殊的材质类型&#xff0c;贴花。 一、获取贴花资源 在没有分析贴花的原理之前&#xff0c;可以先去获得一些免费的贴花资源来使用&#xff0c;比如在Quixel上面就有专门的一个资源…

rp-bf:一款Windows下辅助进行ROP gadgets搜索的Rust库

关于rp-bf rp-bf是一款Windows下辅助进行ROP gadgets搜索的Rust库&#xff0c;该工具可以通过模拟Windows用户模式下的崩溃转储来爆破枚举ROP gadgets。 在很多系统安全测试场景中&#xff0c;研究人员成功劫持控制流后&#xff0c;通常需要将堆栈数据转移到他们所能够控制的…

iZotope RX 10.4.2 mac激活版 音频修复和增强工具

iZotope RX 10 for Mac是一款专业的音频修复软件&#xff0c;旨在提供强大、精确的工具&#xff0c;让用户能够清晰、纯净地处理音频。以下是其主要功能和特点&#xff1a; 软件下载&#xff1a;iZotope RX 10.4.2 mac激活版下载 强大的降噪功能&#xff1a;iZotope RX 10采用了…

P1228 地毯填补问题

地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里&#xff0c;有一座宫殿。宫殿里有个四四方方的格子迷宫&#xff0c;国王选择驸马的方法非常特殊&#xff0c;也非常简单&#xff1a;公主就站在其中一个方格子上&#xff0c;只要谁能用地毯将除公主站立的地方外的所有地…