提交 df5a1b98 authored 作者: 陈泽健's avatar 陈泽健

修复因xlsx文件打开读取后没有关闭导致的文件损坏问题,优化read_xlsx_data函数,增加关闭文件操作。

上级 317c152b
......@@ -469,6 +469,9 @@ def read_csv_data(csv_file_path):
# 读取测试用例xlsx文件中的JSON数据进行数据驱动函数
import openpyxl
import openpyxl
import json
from hytest import INFO
def read_xlsx_data(xlsx_file_path, sheet_name=None, case_type=None):
"""
读取XLSX文件中的数据,并将其转换为一个包含字典的列表,每个字典代表一行测试用例数据。
......@@ -482,73 +485,74 @@ def read_xlsx_data(xlsx_file_path, sheet_name=None, case_type=None):
list: 包含字典的列表,每个字典包含测试用例的名称和参数。
"""
try:
# 打开XLSX文件
workbook = openpyxl.load_workbook(xlsx_file_path)
except FileNotFoundError:
raise FileNotFoundError(f"文件未找到: {xlsx_file_path}")
except Exception as e:
raise Exception(f"无法打开文件: {e}")
# 选择工作表
if sheet_name:
try:
sheet = workbook[sheet_name]
except KeyError:
raise KeyError(f"工作表未找到: {sheet_name}")
else:
sheet = workbook.active
# 读取表头,从第三行开始
headers = [cell.value for cell in sheet[3]]
# 使用 with 语句打开 XLSX 文件,确保文件在读取完成后自动关闭
with openpyxl.load_workbook(xlsx_file_path, read_only=True) as workbook:
# 选择工作表
if sheet_name:
try:
sheet = workbook[sheet_name]
except KeyError:
raise KeyError(f"工作表未找到: {sheet_name}")
else:
sheet = workbook.active
# 读取表头,从第三行开始
headers = [cell.value for cell in sheet[3]]
# 打印表头列名
# INFO(f"表头列名: {headers}")
# 找到表头中名为 'JSON' 和 '功能类别' 的列索引
try:
json_index = headers.index('JSON')
except ValueError as e:
raise ValueError(f"表头中没有找到所需的列: {e}")
# 打印表头列名
# INFO(f"表头列名: {headers}")
try:
category_index = headers.index('功能类别')
except ValueError as e:
raise ValueError(f"表头中没有找到所需的列: {e}")
# 找到表头中名为 'JSON' 和 '功能类别' 的列索引
try:
json_index = headers.index('JSON')
except ValueError as e:
raise ValueError(f"表头中没有找到所需的列: {e}")
ddt_cases = []
# 遍历XLSX文件中的每一行数据,从第四行开始
for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4):
# 获取 JSON 列的数据
json_data = row[json_index]
try:
category_index = headers.index('功能类别')
except ValueError as e:
raise ValueError(f"表头中没有找到所需的列: {e}")
# 打印 JSON 数据以进行调试
INFO(f"行 {row_num} 的 JSON 数据: {json_data}")
ddt_cases = []
# 遍历XLSX文件中的每一行数据,从第四行开始
for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4):
# 获取 JSON 列的数据
json_data = row[json_index]
# 检查 JSON 数据是否为空
if json_data is None or json_data.strip() == "":
# INFO(f"跳过行 {row_num},JSON 数据为空")
continue
# 打印 JSON 数据以进行调试
INFO(f"行 {row_num} 的 JSON 数据: {json_data}")
# 解析 JSON 字符串
try:
parsed_json = json.loads(json_data)
except json.JSONDecodeError:
raise ValueError(f"行 {row_num} 的 JSON 数据无法解析: {json_data}")
# 检查 JSON 数据是否为空
if json_data is None or json_data.strip() == "":
# INFO(f"跳过行 {row_num},JSON 数据为空")
continue
# 获取功能类别
category = row[category_index]
# 解析 JSON 字符串
try:
parsed_json = json.loads(json_data)
except json.JSONDecodeError:
raise ValueError(f"行 {row_num} 的 JSON 数据无法解析: {json_data}")
# 检查是否需要过滤测试用例类型
if case_type and category != case_type:
continue
# 获取功能类别
category = row[category_index]
# 将解析后的 JSON 数据添加到列表中
ddt_cases.append(parsed_json)
# 检查是否需要过滤测试用例类型
if case_type and category != case_type:
continue
# 日志记录:XLSX文件已读取
INFO("XLSX文件已读取")
# 返回包含所有测试用例数据的列表
return ddt_cases
# 将解析后的 JSON 数据添加到列表中
ddt_cases.append(parsed_json)
except FileNotFoundError:
raise FileNotFoundError(f"文件未找到: {xlsx_file_path}")
except Exception as e:
raise Exception(f"无法打开文件: {e}")
# 日志记录:XLSX文件已读取
INFO("XLSX文件已读取")
# 返回包含所有测试用例数据的列表
return ddt_cases
# if __name__ == "__main__":
# xlsx_file_path = r"C:\PycharmData\ubains-module-test\预定系统\测试数据\会议预定测试用例.xlsx"
......
......@@ -286,4 +286,5 @@
79. 2025-04-14
- 登录模块增加excel写入函数调用。调试将图片嵌入单元格的功能,验证不可行。
80. 2025-04-16
- 修复展厅巡检预约系统因为元素定位失败导致的创建会议失败问题,优化issue_send_and_upload议题上传函数。
\ No newline at end of file
- 修复展厅巡检预约系统因为元素定位失败导致的创建会议失败问题,优化issue_send_and_upload议题上传函数。
- 修复因xlsx文件打开读取后没有关闭导致的文件损坏问题,优化read_xlsx_data函数,增加关闭文件操作。
\ No newline at end of file
......@@ -136,10 +136,10 @@ class Exhibition_Meeting_Control_0001:
play_cloud_voice(app_id, app_secret, device_sn)
sleep(20)
# 关闭麦克风
mic_off_button = app_drive.find_element(AppiumBy.XPATH,
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[5]/android.widget.Button[3]")
INFO("关闭麦克风")
mic_off_button.click()
# mic_off_button = app_drive.find_element(AppiumBy.XPATH,
# "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[5]/android.widget.Button[3]")
# INFO("关闭麦克风")
# mic_off_button.click()
# 关闭左摄像头
left_camera_off_button = app_drive.find_element(AppiumBy.XPATH,
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论