自动化不知如何参数化(一)?xlrd来帮你解决
平时在做自动化测试的时候,一直都是要求数据与业务逻辑分离。把测试数据都写在业务里面的话,比较混杂。为了方便管理测试数据,所以引入了python的一个扩展库--xlrd。该库使用简单,能满足自动化测试的数据分离的需求。
闲语少聊,我们直接来看,xlrd是如何完成数据读取的。
安装
安装很简单,方式①:直接命令pip install xlrd;方式②:在Pycharm中直接安装即可。
基础命令
①打开excel文件并创建对象
1 | excel_object = xlrd.open_workbook(excel_path) |
②根据工作表名称获取数据
1 | sheet_object = excel_object.sheet_by_name( 'Sheet1' ) |
③获取excel文件中所有工作表名称
1 | print (excel_object.sheet_names()) |
④获取有效行数
1 | row_nrows = sheet_object.nrows |
⑤获取有效列数
1 | col_ncols = sheet_object.ncols |
⑥获取当前行的单元格长度
1 | row_length = sheet_object.row_len( 1 ) |
⑦获取第一行数据
1 | rows_cell_value = sheet_object.row_values( 0 ) |
⑧获取坐标为第一行、第一列单元格数据
1 2 3 4 5 | 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 |
⑨获取坐标为第二行、第四列单元格数据
1 | row_cell_value2 = sheet_object.cell_value( 1 , 3 ) |
⑩获取第四列数据
1 | cols_cell_value = sheet_object.col_values( 3 ) |
单元格类型
单元格类型区分为六类,读取单元格类型如下所示:
1 2 3 4 | 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, '': ''}
格式转换后,数据就打印正常了,数据类型错误的问题就解决了。
好了,今天的分享就到此结束啦,希望对博友们有帮助,下期分享获取合并单元格数据问题,敬请期待。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通