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

news2024/12/23 9:49:25

简介:

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

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

测试数据.xlsx:

路径-D:\test\0627

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'E:\\数据驱动\\测试数据.xlsx'
    sheetName = u"搜索数据表"
    pe = ParseExcel(excelPath, sheetName)
    print pe.getDatasFromSheet()
    for i in pe.getDatasFromSheet():
        print i[0], i[1]

加print调试日志:

#encoding=utf-8
from openpyxl import load_workbook
 
class ParseExcel(object):
    def __init__(self,excelPath,sheetName):
        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=[]
            tmpList.append(line[1].value)
            print "line[1].value",line[1].value
            tmpList.append(line[2].value)
            print "line[2].value",line[2].value
            dataList.append(tmpList)
        print dataList[1:]
        return dataList[1:]
 
if __name__=='__main__':
    excelPath=u"d:\\test\\0627\\测试数据.xlsx"
    sheetName=u"搜索数据表"
    pe=ParseExcel(excelPath,sheetName)
    print pe.getDatasFromSheet()
    for i in pe.getDatasFromSheet():
        print i[0],i[1]
单独运行结果:
D:\test\0627>python  ExcelUtil.py
ExcelUtil.py:7: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  self.sheet=self.wb.get_sheet_by_name(sheetName)
line[1].value 搜索词
line[2].value 期望结果
line[1].value 邓肯
line[2].value 蒂姆
line[1].value 乔丹
line[2].value 迈克尔
line[1].value 库里
line[2].value 斯蒂芬
[[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]
[[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]
line[1].value 搜索词
line[2].value 期望结果
line[1].value 邓肯
line[2].value 蒂姆
line[1].value 乔丹
line[2].value 迈克尔
line[1].value 库里
line[2].value 斯蒂芬
[[u'\u9093\u80af', u'\u8482\u59c6'], [u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14'], [u'\u5e93\u91cc', u'\u65af\u8482\u82ac']]
邓肯 蒂姆
乔丹 迈克尔
库里 斯蒂芬

最后运行的脚本:

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='d:\\test\\0627\\report.log',
    #打开日志文件的方式
    filemode='w'
)
 
excelPath=u"d:\\test\\0627\\测试数据.xlsx"
sheetName=u"搜索数据表"
#创建ParseExcel类的实例对象
excel=ParseExcel(excelPath,sheetName)
 
#数据驱动装饰器
@ddt.ddt
class TestDemo(unittest.TestCase):
    def setUp(self):
        self.driver=webdriver.Firefox(executable_path='c:\\geckodriver')
    
    @ddt.data(*excel.getDatasFromSheet())#对调用函数返回的含列表的列表进行解包,传过来的就是列表中的一个列表
    def test_dataDrivenByFile(self,data):
        print "tuple(data):",tuple(data)#把传过来的一个列表转换成元祖,包含两个元素,搜索值和期望值
        testData,expectData=tuple(data)
        print "testData:",testData#调试用
        print "expectData:",expectData#调试用
        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,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\0627>python test.py
d:\test\0627\ExcelUtil.py:11: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
  self.sheet=self.wb.get_sheet_by_name(sheetName)
tuple(data): (u'\u9093\u80af', u'\u8482\u59c6')
testData: 邓肯
expectData: 蒂姆
搜索-邓肯,期望-蒂姆
.tuple(data): (u'\u4e54\u4e39', u'\u8fc8\u514b\u5c14')
testData: 乔丹
expectData: 迈克尔
搜索-乔丹,期望-迈克尔
.tuple(data): (u'\u5e93\u91cc', u'\u65af\u8482\u82ac')
testData: 库里
expectData: 斯蒂芬
搜索-库里,期望-斯蒂芬
.
----------------------------------------------------------------------
Ran 3 tests in 45.614s
 
OK
 
 
 
report.log:
 
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "邓肯",期望-"蒂姆"-通过
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "乔丹",期望-"迈克尔"-通过
Fri,2018-06-29 11:18:S test.py[line:70] INFO 搜索- "库里",期望-"斯蒂芬"-通过

总结:

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

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

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

在这里插入图片描述

软件测试面试小程序

被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux

6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!   

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之代理模式与外观模式

目录 代理模式 简介 优缺点 角色职责 实现 运用场景 外观模式 简介 角色职责 优缺点 实现 使用场景 代理模式 简介 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为…

京东搜索EE链路演进 | 京东云技术团队

导读 搜索系统中容易存在头部效应,中长尾的优质商品较难获得充分的展示机会,如何破除系统的马太效应,提升展示结果的丰富性与多样性,助力中长尾商品成长是电商平台搜索系统的一个重要课题。其中,搜索EE系统在保持排序…

北美电池测试标准解读:UL 1642、UL 2054、UL 2056、UL 2089 测试报告

在日常生活中人们与各类电子产品的交流和互动越来越多,由于电池与人们的接触日益密切,电池的安全性显得格外重要,因此越来越多商家注重保证电池的安全性,避免因电池安全事故带来的人身伤害和品牌名誉损失。特别是亚马逊今年开年来…

无涯教程-JavaScript - DMIN函数

描述 DMIN函数返回列表或数据库中符合您指定条件的列中的最小数字。 语法 DMIN (database, field, criteria)争论 Argument描述Required/Optionaldatabase 组成列表或数据库的单元格范围。 数据库是相关数据的列表,其中相关信息的行是记录,数据的列是字段。列表的第一行包含…

动辄百万的工业数据处理软件,现在60秒就能用上

刚刚过去的周五,TDengine团队正式发布了新版3.1.1.0, 并上线了新的官网。虽没有发布会,但对涛思数据而言,这是一个“蓄谋已久”的动作。因为新版TDengine里包含了一个核心模块taosX,它具备强大的数据抓取、清洗、转换、加载(ETL)功…

金九银十,软件测试最新面试题整理(超详细~)

1、创建坐席组的功能模块,如何进行测试用例设计? 解答: 功能测试,使用等价类划分法去分析创建坐席的每个输入项的有效及无效类,同步考虑边界值去设计对应的测试用例: 先进行冒烟测试,正常创建…

微信小程序新版canvas2d海报绘制(教你轻松搞定)

效果 说明: canvas官方很早已经发声不再维护了,所以很多方法都已经不再适用。目前官方推荐适用canvas2d来绘制生成海报。 canvas2d来绘制海报: canvas2d的优点: 例如: 不需要先预下载网络图片再绘制,前…

【Hello Algorithm】二叉树相关算法

本篇博客介绍:介绍二叉树的相关算法 二叉树相关算法 二叉树结构遍历二叉树递归序二叉树的交集非递归方式实现二叉树遍历二叉树的层序遍历 二叉树难题二叉树的序列化和反序列化lc431求二叉树最宽的层二叉树的后继节点谷歌面试题 二叉树结构 如果对于二叉树的结构还有…

C#FreeSql分库分表

using FreeSql; using FreeSql.DataAnnotations;namespace FreeSqlMaster {internal class Program{static IFreeSql freeSql null;static void Main(string[] args){// 读写分离// FreeSql 实现了第3种方案,支持一个【主库】多个【从库】,【从库】的查…

MPU6050姿态手势控制:二自由度云台

使用芯片:STM32 F103 C8T6 开源一款 MPU6050姿态手势控制二自由度云台 的设计程序与硬件清单,文章会贴出基本原理所需学习的文章连接,测试效果,元件清单,工程下载。 之前有做过二自由度机械臂的开发,但材…

阿里巴巴新一代SpringCloud学习指南重磅发布,揭示中国特色微服务组件的奥秘

SpringCloud Alibaba 的优势 阿里使用过的组件经历了考验,性能强悍,设计合理,现在开源出来给大家用。成套产品搭配完善的可视化界面给开发运维带来了极大的便利。搭建简单,学习曲线低。 作为国内微服务领域的领军企业&#xff0…

“钉钉官网首页的炫酷动效” 被我用css新特性轻松破解啦~

🌻 前言 其实写本文的初衷只是想分享一个css新特性【scroll-timeline】😂,但是我想要体现出它的强大效果,此时正好想到了之前看到过钉钉的首页动画,就是滚动页面然后进行一系列动画的,所以我决定实现一下这个效果。&am…

ChatGPT AIGC 完成动态堆积面积图实例

先使用ChatGPT AIGC描述一下堆积面积图的功能与作用。 接下来一起看一下ChatGPT做出的动态可视化效果图: 这样的动态图案例代码使用ChatGPT AIGC完成。 将完整代码复制如下: <!DOCTYPE html> <html> <head><meta charset="utf-8"><tit…

为反应系统实现MQTT客户端

MQTT-Reactive的目的是提供一种用C编写的可移植且无阻塞的MQTT客户端&#xff0c;以便在反应式嵌入式系统中使用。首先&#xff0c;本文说明什么是反应系统。然后&#xff0c;它描述了如何为这种系统设计合适的软件结构。最后&#xff0c;本文展示了如何通过使用状态机和事件驱…

【校招VIP】测试技术考点之单元测试集成测试

考点介绍&#xff1a; 单元测试,集成测试的区别是&#xff1a;方式不同、粒度不同、内容不同。单元测试用用于验证编码单元的正确性。集成测试用于验证详细设计。体现了测试由小到大、又内至外、循序渐进的测试过程和分而治之的思想。 测试技术考点之单元测试&集成测试-相…

WIN11有网络但浏览器打不开

打开设置-》网络和INTERNET-》代理&#xff0c;将自动检测设置打开&#xff0c;将手动设置代理中的使用代理服务器关闭。就可以打开浏览器了。 不知道为什么会出现这样的问题

【数据分享】2009-2021年我国省份级别的轨道交通相关指标(30多项指标)

《中国城市建设统计年鉴》中细致地统计了我国城市市政公用设施建设与发展情况&#xff0c;在之前的文章中&#xff0c;我们分享过基于2006-2021年《中国城市建设统计年鉴》整理的2006—2021年我国省份级别的市政设施水平相关指标、2006-2021年我国省份级别的各类建设用地面积数…

vue3 搭配ElementPlus做基础表单校验 自定义表单校验

<script setup> import { ref, reactive } from vue// 表单元素 const dom ref(null) // 校验规则 const rules {name: [{ required: true, message: 请输入活动名称, trigger: blur }],//校验手机号格式phone: [{ required: true, message: "请输入电话", t…

问道管理:证券市场也有中介机构吗?他们具体干什么?

证券市场是一个很大的发行流通生意市场&#xff0c;在这个市场上&#xff0c;有许许多多不同的生意主体。而有生意就会有中介&#xff0c;证券市场上也有中介组织吗&#xff1f;如果有&#xff0c;他们具体又是干什么的&#xff1f;关于这些&#xff0c;问道管理为我们预备了以…

使命召唤中将启用AI检测仇恨言论!

“ToxMod”将自动标记口头骚扰、欺凌和歧视。 周三&#xff0c;动视宣布的它将在即将于11月10日发布的中引入实时人工智能语音聊天调节功能使命召唤:现代战争3。该公司正与调整为了实现这一特性&#xff0c;我们使用了一种叫做托西莫德识别仇恨言论、欺凌、骚扰和歧视并采取行动…