自动化不知如何参数化?xlrd来帮你解决
平时在做自动化测试的时候,一直都是要求数据与业务逻辑分离。把测试数据都写在业务里面的话,比较混杂。为了方便管理测试数据,所以引入了python的一个扩展库--xlrd。该库使用简单,能满足自动化测试的数据分离的需求。
闲语少聊,我们直接来看,xlrd是如何完成数据读取的。
安装
安装很简单,方式①:直接命令pip install xlrd;方式②:在Pycharm中直接安装即可。
基础命令
①打开excel文件并创建对象
excel_object = xlrd.open_workbook(excel_path)
②根据工作表名称获取数据
sheet_object = excel_object.sheet_by_name('Sheet1')
③获取excel文件中所有工作表名称
print(excel_object.sheet_names())
④获取有效行数
row_nrows = sheet_object.nrows
⑤获取有效列数
col_ncols = sheet_object.ncols
⑥获取当前行的单元格长度
row_length = sheet_object.row_len(1)
⑦获取第一行数据
rows_cell_value = sheet_object.row_values(0)
⑧获取坐标为第一行、第一列单元格数据
row_cell_value1 = sheet_object.cell_value(0, 0)# 坐标起始位从0开始
或者
row_cell_value1 = sheet_object.cell(0, 0).value
或者
row_cell_value1 = sheet_object.row(0)[0].value
⑨获取坐标为第二行、第四列单元格数据
row_cell_value2 = sheet_object.cell_value(1, 3)
⑩获取第四列数据
cols_cell_value = sheet_object.col_values(3)
单元格类型
单元格类型区分为六类,读取单元格类型如下所示:
0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
cell_value_type1 = sheet_object.cell_type(2, 0)
或者
cell_value_type1 = sheet_object.cell(2, 0).value
命令实践
我们来写个例子验证下这些命令,示例代码如下:
'''
@author: wenyihuqingjiu
@project: Pytest_Auto_Test
@file: demo
@time: 2020-07-23 21:40
@desc:
''' import xlrd
import os current_path = os.path.dirname(__file__)
excel_path = os.path.join(current_path, '..', 'file/excel/testcase.xlsx')
excel_object = xlrd.open_workbook(excel_path)
sheet_object = excel_object.sheet_by_name('Sheet1')
# 获取第一行数据
rows_cell_value = sheet_object.row_values(0)
print('获取到的第一行数据为:' + str(rows_cell_value))
# 获取第一行、第一列单元格数据
row_cell_value1 = sheet_object.cell_value(0, 0)
print('获取坐标为第一行、第一列单元格的数据为:' + row_cell_value1)
# 获取第二行、第四列单元格数据
row_cell_value2 = sheet_object.cell_value(1, 3)
print('获取坐标为第二行、第四列单元格的数据为:' + row_cell_value2)
# 获取第四列数据
cols_cell_value = sheet_object.col_values(3)
print('获取第四列的数据为:' + str(cols_cell_value))
# 获取单元格类型
# 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
cell_value_type1 = sheet_object.cell_type(2, 0)
print('单元格类型为:' + str(cell_value_type1))
cell_value_type2 = sheet_object.cell_type(1, 0)
print('单元格类型为:' + str(cell_value_type2))
cell_value_type3 = sheet_object.cell_type(1, 7)
print('单元格类型为:' + str(cell_value_type3))
cell_value_type4 = sheet_object.cell_type(1, 8)
print('单元格类型为:' + str(cell_value_type4))
cell_value_type5 = sheet_object.cell_type(2, 8)
print('单元格类型为:' + str(cell_value_type5))
# 获取有效行数
row_nrows = sheet_object.nrows
print('当前sheet页中有效行数为:' + str(row_nrows))
# 获取有效列数
col_ncols = sheet_object.ncols
print('当前sheet页中有效列数为:' + str(col_ncols))
# 获取当前行的单元格长度
row_length = sheet_object.row_len(0)
print('第一行的有效单元格长度为:' + str(row_length))
# 获取所有工作表名称
print('当前excel中的工作表名称为:'+ str(excel_object.sheet_names()))
excel文档内容如下所示:

执行代码,我们结合excel文档内容来对比看下输出结果,如下所示:

我们从上述简单的命令了解到,读取数据的方式其实很简单,代码中加上逻辑便可获取整个sheet页的数据,如下所示,获取当前sheet页的数据代码:
# 获取有效行数
row_index = sheet_object.nrows
# 获取有效列数
col_index = sheet_object.ncols
# 定义空数组
all_data_list = []
# 获取首行数据
first_row = sheet_object.row_values(0)
for row in range(1, row_index):
# 定义空列表
row_dict = {}
for col in range(col_index):
c_cell = sheet_object.cell_value(row, col)
# 循环每一个有效的单元格,将字段与值对应存储到字典中
row_dict[first_row[col]] = c_cell
# 再将字典追加到列表中
all_data_list.append(row_dict)
print(str(row_dict))
查看控制台,打印出来的数据如下所示:
excel文件内容还是如上截图,可以对比查看下。
{'模块': '搜索测试', '用例编号': '搜索测试01', '输入说明': '1.输入:', '操作输入值': '温一壶清酒 博客园', '按钮操作': '2.点击搜索按钮', '断言': '温一壶清酒 博客园_百度搜索', '预期值': '正确断言', '测试序号': 1.0, '': 44035.0}
{'模块': '', '用例编号': '搜索测试02', '输入说明': '', '操作输入值': '温一壶清酒 抓包', '按钮操作': '', '断言': '', '预期值': '错误断言', '测试序号': 2.0, '': 1}
{'模块': '', '用例编号': '搜索测试03', '输入说明': '', '操作输入值': '温一壶清酒 appium', '按钮操作': '', '断言': '温一壶清酒 博客园', '预期值': '', '测试序号': 3.0, '': ''}
我们从上述的打印数据来看,细心的博友们应该发现问题了。
我们可以看出,合并单元格的数据,只有首个单元格有数据显示;单元格数据类型不正确。
数据转换
今天,我们先来解决单元格数据类型显示不正确的问题。
解决该问题的方式很简单,就是将单元格类型获取后,判断单元格类型并转换格式,示例代码如下所示:
'''
@author: wenyihuqingjiu
@project: Pytest_Auto_Test
@file: demo
@time: 2020-07-23 21:40
@desc:
''' import xlrd
import os
import datetime
from xlrd import xldate_as_tuple current_path = os.path.dirname(__file__)
excel_path = os.path.join(current_path, '..', 'file/excel/testcase.xlsx')
excel_object = xlrd.open_workbook(excel_path)
sheet_object = excel_object.sheet_by_name('Sheet1') # 获取有效行数
row_index = sheet_object.nrows
# 获取有效列数
col_index = sheet_object.ncols
# 定义空数组
all_data_list = []
# 获取首行数据
first_row = sheet_object.row_values(0)
for row in range(1, row_index):
# 定义空列表
row_dict = {}
for col in range(col_index):
c_cell = sheet_object.cell_value(row, col)
# 获取单元格数据类型
c_type = sheet_object.cell(row, col).ctype
if c_type == 2 and c_cell % 1 == 0: # 如果是整形
c_cell = int(c_cell)
elif c_type == 3:
# 转成datetime对象
date = datetime.datetime(*xldate_as_tuple(c_cell, 0))
c_cell = date.strftime('%Y-%m-%d')
elif c_type == 4:
c_cell = True if c_cell == 1 else False
# 循环每一个有效的单元格,将字段与值对应存储到字典中
row_dict[first_row[col]] = c_cell
# 再将字典追加到列表中
all_data_list.append(row_dict)
print(str(row_dict))
运行代码,我们再来看下打印结果,如下所示:
{'模块': '搜索测试', '用例编号': '搜索测试01', '输入说明': '1.输入:', '操作输入值': '温一壶清酒 博客园', '按钮操作': '2.点击搜索按钮', '断言': '温一壶清酒 博客园_百度搜索', '预期值': '正确断言', '测试序号': 1, '': '2020-07-23'}
{'模块': '', '用例编号': '搜索测试02', '输入说明': '', '操作输入值': '温一壶清酒 抓包', '按钮操作': '', '断言': '', '预期值': '错误断言', '测试序号': 2, '': True}
{'模块': '', '用例编号': '搜索测试03', '输入说明': '', '操作输入值': '温一壶清酒 appium', '按钮操作': '', '断言': '温一壶清酒 博客园', '预期值': '', '测试序号': 3, '': ''}
格式转换后,数据就打印正常了,数据类型错误的问题就解决了。
好了,今天的分享就到此结束啦,希望对博友们有帮助,下期分享获取合并单元格数据问题,敬请期待。
自动化不知如何参数化?xlrd来帮你解决的更多相关文章
- 自动化不知如何参数化(二)?xlrd来帮你解决
在昨天的博文中介绍了普通单元格数据的获取,以及单元格数据类型的转换,详细见博文:自动化不知如何参数化(一)?xlrd来帮你解决. 昨天的那篇博文中,还有个获取合并单元格数据的问题没解决,今天就专门来讲 ...
- Zookeeper 到底能帮我们解决哪些问题?
Zookeeper 从设计模式角度来看,是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通 ...
- [转] Win10插入U盘后双击无法打开,无法访问,显示设备未就绪;驱动哥帮你解决
说起U盘,相信大家都不陌生. 这个不起眼的小东西在我们日常生活息息相关,一旦损坏可能就会造成一些不必要的麻烦. 最近驱动哥就收到了一大批用户关于U盘问题的相关咨询,一起来看看到底是什么情况吧! 据其中 ...
- Selenium2+python自动化20-Excel数据参数化【转载】
前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ...
- Selenium2+python自动化20-Excel数据参数化
前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ...
- Selenium2+python自动化21-TXT数据参数化
前言 在17篇我们讲了excel数据的参数化,有人问了txt数据的参数化该怎么办呢,下面小编为你带你txt数据参数化的讲解 一.以百度搜索为例,自动搜索五次不同的关键字.输入的数据不同从而引 ...
- Selenium2+python自动化21-TXT数据参数化【转载】
前言 在17篇我们讲了excel数据的参数化,有人问了txt数据的参数化该怎么办呢,下面小编为你带你txt数据参数化的讲解 一.以百度搜索为例,自动搜索五次不同的关键字.输入的数据不同从而引 ...
- python接口自动化六(参数化也就是把之前敲过的代码封装成方法)
前言 前面一篇实现了参数的关联,那种只是记流水账的完成功能,不便于维护,也没什么可读性,接下来这篇可以把每一个动作写成一个函数,这样更方便了. 参数化的思维只需记住一点:不要写死 (由于博客园登录机制 ...
- python自动化基础(参数化)
一.创建加法类 #定义一个数学加法类 class Mathmethod(): def add(self,a,b): return(a+b) def sub(self,a,b): return(a-b) ...
随机推荐
- QUIC/HTTP3 协议简析
从 HTTP 的进化历史讲起,细说使用协议的变迁,了解原因发现问题,解码 QUIC 在 HTTP3 中的支撑作用,共同探讨 HTTP3 的未来. HTTP.HTTP2 和 HTTP3 先和大家来回顾一 ...
- Vue.js 组件复用和扩展之道
软件编程有一个重要的原则是 D.R.Y(Don't Repeat Yourself),讲的是尽量复用代码和逻辑,减少重复.组件扩展可以避免重复代码,更易于快速开发和维护.那么,扩展 Vue 组件的最佳 ...
- 前端丨如何使用 tcb-js-sdk 实现图片上传功能
前言 tcb-js-sdk 让开发者可以在网页端使用 JavaScript 代码服务访问云开发的服务,以轻松构建自己的公众号页面或者独立的网站等 Web 服务.本文将以实现图片上传功能为例,介绍 tc ...
- node.js/npm升级正确操作(windows和linux均有)
原文地址:https://www.wjcms.net/archives/nodejsnpm升级正确操作windows和linux均有 今天我们总结一下node.js以及npm升级的正确操作方法. 小编 ...
- [译]高性能缓存库Caffeine介绍及实践
概览 本文我们将介绍Caffeine-一个Java高性能缓存库.缓存和Map之间的一个根本区别是缓存会将储存的元素逐出.逐出策略决定了在什么时间应该删除哪些对象,逐出策略直接影响缓存的命中率,这是缓存 ...
- css样式冲突怎么解决?
一个网页有时会使用两种CSS,那发生css样式冲突要怎么解决?下面本篇文章就来给大家介绍一下发生css样式冲突的解决方法,希望对大家有所帮助. css冲突怎么解决? 解决方法有很多,如果可以对html ...
- CSS3动画 相比JS Animation 哪个更快?
CSS vs. JS Animation: 哪个更快? 基于JavaScript的动画竟然已经默默地比CSS的transition动画快了?而且,Adobe和 Google竟然一直在发布可以媲美原生应 ...
- MySQL 事务 异常 事务隔离的级别
MySQL 事务 异常 事务隔离的级别 事务 在你操作数据库的同时,有可能其他用户还会不断地对数据进行增删改查操作.为了避免并行进行时出现混乱,就产生了"事务".事务就是要保证 ...
- 6.22 集训--DP复习一
总结 下午的突击练习完全不在状态 A.拦截导弹简单版 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发 ...
- day47 作业
表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex enum('ma ...