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

简介:

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

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

测试数据.xlsx:

路径-D:\test\0627

ExcelUtil.py:

#encoding=utf-8
from openpyxl import load_workbookclass 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_rowdef 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_workbookclass 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_rowdef getDatasFromSheet(self):dataList=[]for line in self.sheet.rows:tmpList=[]tmpList.append(line[1].value)print "line[1].value",line[1].valuetmpList.append(line[2].value)print "line[2].value",line[2].valuedataList.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.614sOKreport.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.rhkb.cn/news/121637.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手写Mybatis:第15章-返回Insert操作自增索引值

文章目录 一、目标:Insert自增索引值二、设计:Insert自增索引值三、实现:Insert自增索引值3.1 工程结构3.2 Insert自增索引值类图3.3 修改执行器3.3.1 修改执行器接口3.3.2 抽象执行器基类 3.4 键值生成器3.4.1 键值生成器接口3.4.2 不用键值…

Milvus以及Web UI 安装

向量数据库懂的都懂 版本数据 [rootiZ7xv7q4im4c48qen2do2bZ project]# cat /etc/redhat-release CentOS Stream release 9 [rootiZ7xv7q4im4c48qen2do2bZ project]# docker version Client: Docker Engine - CommunityVersion: 24.0.5API version: 1.43Go v…

qt文件操作

对话框练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体按钮 void Widget::on_ztbtn_clicked() {//调用QFontDia…

《C++ Primer》第2章 变量(一)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 2.1 基本内置类型(P30) C 定义的基本类型包括算术类型(arithmetic type)和空类型(void),其中算术类型包括字符、整型、布尔…

python实现对excel表中的某列数据进行排序

如下需要对webCms中的B列数据进行升序排序,且不能影响到其他列、工作表中的数据和格式。 import pandas as pd import openpyxl from openpyxl.utils.dataframe import dataframe_to_rows# 读取 Excel 文件 file_path 1.xlsx sheet_name webCms# 读取 Excel 文件并…

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法

不论搭建什么工程,运行什么文件,只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题,以下方法都适用!!! 一、问题描述 我在使用pycharm连接webots,用python控制机…

ToBeWritten之威胁狩猎

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

机器人中的数值优化(十一)——高斯牛顿法、LMF方法、Dogleg方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

三相三线电表和三相四线电表有什么区别

三相三线电表和三相四线电表是两种常见的电能计量仪表,它们在结构、接线方式和使用范围上有所不同。本文将从以下几个方面详细介绍两者之间的区别。 一、结构上的区别 1.三相三线电表:三相三线电表主要由电压线圈、电流线圈、转子、铝盘和外壳等部分组成…

lv3 嵌入式开发-2 linux软件包管理

目录 1 软件包管理 1.1流行的软件包管理机制 1.2软件包的类型 1.3软件包的命名 2 在线软件包管理 2.1APT工作原理 2.2更新软件源 2.3APT相关命令 3 离线软件包管理 1 软件包管理 1.1流行的软件包管理机制 Debian Linux首先提出“软件包”的管理机制---Deb软件包 …

Linux设备驱动程序

一、设备驱动程序简介 图1.1 内核功能的划分 可装载模块 Linux有一个很好的特性:内核提供的特性可在运行时进行扩展。这意味着当系统启动 并运行时,我们可以向内核添加功能( 当然也可以移除功能)。 可在运行时添加到内核中的代码被称为“模块”。Linux内核支持好几…

Linux服务器部署JavaWeb后端项目

适用于:MVVM前后台分离开发、部署、域名配置 前端:Vue 后端:Spring Boot 这篇文章只讲后端部署,前端部署戳这里 目录 Step1:服务器上搭建后端所需环境1、更新服务器软件包2、安装JDK83、安装MySQL4、登录MySQL5、修…

基于FPGA的信号发生器(三角波、方波、正弦波)

目录 DDS实现原理 DDS整体设计框图​ Quartus II 仿真​ modelsim仿真 顶层代码 DDS实现原理 DDS(Direct Digital Frequency Synthesizer)直接数字频率合成器,也可叫DDFS。 DDS是从相位的概念直接合成所需波形的一种频率合成技术。 不仅可以产生不同频率的正弦波,而且可…

Java8实战-总结18

Java8实战-总结18 使用流筛选和切片用谓词筛选筛选各异的元素截短流跳过元素 使用流 流让你从外部迭代转向内部迭代。这样&#xff0c;就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了&#xff1a; List<Dish> vegetarianDishes new ArrayList<>…

ArcGIS美化科研论文地图(利用在线底图)

1.加载在线底图服务 在ArcGIS Desktop中打开Catalog窗口&#xff0c;在GIS Servers中点击Add ArcGIS Server&#xff0c;之后选项全部默认&#xff0c;仅在URL中输入以下网址https://services.arcgisonline.com/arcgis 之后就可以看到底图了 我们在WorldElevation3D中选择Nat…

16-MyCat

一 Mycat概述 1 什么是Mycat 什么是Mycat Mycat是数据库中间件&#xff0c;所谓数据库中间件是连接Java应用程序和数据库中间的软件。 为什么要用Mycat 遇到问题&#xff1a; Java与数据库的紧耦合高访问量高并发对数据库的压力读写请求数据不一致 2 Mycat与其他中间件区别 目…

QT创建可移动点类

效果如图所示&#xff1a; 创建新类MovablePoint&#xff0c;继承自QWidget. MovablePoint头文件: #ifndef MOVABLEPOINT_H #define MOVABLEPOINT_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QStyleOption> #includ…

TS编译选项

自动监控编译 tsc xxx.ts -w 在一个文件夹下&#xff0c;创建 tsconfig.json 文件&#xff0c;在用命令 tsc 就可以自动编译当前文件夹下的ts文件 tsconfig.json文件配置如下&#xff1a; {/*tsconfig.json 是ts编译器的配置文件&#xff0c;ts编译器可以根据它的信息来对代…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

jQuery 层次选择器

jQuery 层次选择器 &#xff08;0&#xff09;测试前的准备工作 A. 定义测试对象 B. 定义测试对象的 CSS 样式 C. 再定义一些测试用的 button。 &#xff08;1&#xff09;所有后代选择器(A B) 所有后代&#xff0c;包括其直接后代及间接后代。 &#xff08;2&#xff09;直…