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

修复因xlsx文件读取失败导致的报错。

上级 df5a1b98
...@@ -468,10 +468,9 @@ def read_csv_data(csv_file_path): ...@@ -468,10 +468,9 @@ def read_csv_data(csv_file_path):
return ddt_cases return ddt_cases
# 读取测试用例xlsx文件中的JSON数据进行数据驱动函数 # 读取测试用例xlsx文件中的JSON数据进行数据驱动函数
import openpyxl
import openpyxl
import json import json
from hytest import INFO from hytest import INFO
def read_xlsx_data(xlsx_file_path, sheet_name=None, case_type=None): def read_xlsx_data(xlsx_file_path, sheet_name=None, case_type=None):
""" """
读取XLSX文件中的数据,并将其转换为一个包含字典的列表,每个字典代表一行测试用例数据。 读取XLSX文件中的数据,并将其转换为一个包含字典的列表,每个字典代表一行测试用例数据。
...@@ -485,80 +484,89 @@ def read_xlsx_data(xlsx_file_path, sheet_name=None, case_type=None): ...@@ -485,80 +484,89 @@ def read_xlsx_data(xlsx_file_path, sheet_name=None, case_type=None):
list: 包含字典的列表,每个字典包含测试用例的名称和参数。 list: 包含字典的列表,每个字典包含测试用例的名称和参数。
""" """
try: try:
# 调试信息:打印文件路径
INFO(f"尝试打开文件路径: {xlsx_file_path}")
if not os.path.exists(xlsx_file_path):
raise FileNotFoundError(f"文件未找到: {xlsx_file_path}")
# 使用 with 语句打开 XLSX 文件,确保文件在读取完成后自动关闭 # 使用 with 语句打开 XLSX 文件,确保文件在读取完成后自动关闭
with openpyxl.load_workbook(xlsx_file_path, read_only=True) as workbook: workbook = openpyxl.load_workbook(xlsx_file_path, read_only=True)
# 选择工作表 INFO("XLSX文件成功打开")
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}")
# 选择工作表
if sheet_name:
try: try:
category_index = headers.index('功能类别') sheet = workbook[sheet_name]
except ValueError as e: INFO(f"成功选择工作表: {sheet_name}")
raise ValueError(f"表头中没有找到所需的列: {e}") except KeyError:
raise KeyError(f"工作表未找到: {sheet_name}")
else:
sheet = workbook.active
INFO("使用活动工作表")
ddt_cases = [] # 读取表头,从第三行开始
# 遍历XLSX文件中的每一行数据,从第四行开始 headers = [cell.value for cell in sheet[3]]
for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4): INFO(f"表头列名: {headers}")
# 获取 JSON 列的数据
json_data = row[json_index]
# 打印 JSON 数据以进行调试 # 找到表头中名为 'JSON' 和 '功能类别' 的列索引
INFO(f"行 {row_num} 的 JSON 数据: {json_data}") try:
json_index = headers.index('JSON')
INFO(f"找到 'JSON' 列索引: {json_index}")
except ValueError as e:
raise ValueError(f"表头中没有找到所需的列: {e}")
# 检查 JSON 数据是否为空 try:
if json_data is None or json_data.strip() == "": category_index = headers.index('功能类别')
# INFO(f"跳过行 {row_num},JSON 数据为空") INFO(f"找到 '功能类别' 列索引: {category_index}")
continue except ValueError as e:
raise ValueError(f"表头中没有找到所需的列: {e}")
# 解析 JSON 字符串 ddt_cases = []
try: # 遍历XLSX文件中的每一行数据,从第四行开始
parsed_json = json.loads(json_data) for row_num, row in enumerate(sheet.iter_rows(min_row=4, values_only=True), start=4):
except json.JSONDecodeError: # 获取 JSON 列的数据
raise ValueError(f"行 {row_num} 的 JSON 数据无法解析: {json_data}") json_data = row[json_index]
INFO(f"行 {row_num} 的 JSON 数据: {json_data}")
# 检查 JSON 数据是否为空
if json_data is None or json_data.strip() == "":
INFO(f"跳过行 {row_num},JSON 数据为空")
continue
# 解析 JSON 字符串
try:
parsed_json = json.loads(json_data)
INFO(f"行 {row_num} 的 JSON 数据解析成功: {parsed_json}")
except json.JSONDecodeError:
raise ValueError(f"行 {row_num} 的 JSON 数据无法解析: {json_data}")
# 获取功能类别 # 获取功能类别
category = row[category_index] category = row[category_index]
INFO(f"行 {row_num} 的功能类别: {category}")
# 检查是否需要过滤测试用例类型 # 检查是否需要过滤测试用例类型
if case_type and category != case_type: if case_type and category != case_type:
continue INFO(f"跳过行 {row_num},功能类别不匹配: {category} != {case_type}")
continue
# 将解析后的 JSON 数据添加到列表中 # 将解析后的 JSON 数据添加到列表中
ddt_cases.append(parsed_json) ddt_cases.append(parsed_json)
INFO(f"行 {row_num} 的 JSON 数据已添加到 ddt_cases")
# 日志记录:XLSX文件已读取 # 日志记录:XLSX文件已读取
INFO("XLSX文件已读取") INFO("XLSX文件已读取")
# 返回包含所有测试用例数据的列表 # 返回包含所有测试用例数据的列表
return ddt_cases return ddt_cases
except FileNotFoundError: except FileNotFoundError:
raise FileNotFoundError(f"文件未找到: {xlsx_file_path}") raise FileNotFoundError(f"文件未找到: {xlsx_file_path}")
except Exception as e: except Exception as e:
raise Exception(f"无法打开文件: {e}") raise Exception(f"无法打开文件: {e}")
# if __name__ == "__main__": # if __name__ == "__main__":
# xlsx_file_path = r"C:\PycharmData\ubains-module-test\预定系统\测试数据\会议预定测试用例.xlsx" # xlsx_file_path = r"D:\GithubData\自动化\ubains-module-test\预定系统\测试数据\会议预定测试用例.xlsx"
# ddt_cases = read_xlsx_data(xlsx_file_path, sheet_name="会议创建", case_type="工商银行项目-25-04-01") # ddt_cases = read_xlsx_data(xlsx_file_path, sheet_name="AI创会", case_type="标准版")
# print(ddt_cases) # print(ddt_cases)
import openpyxl
import openpyxl import openpyxl
def clear_columns_in_xlsx(xlsx_file_path, sheet_name=None, columns_to_clear=None): def clear_columns_in_xlsx(xlsx_file_path, sheet_name=None, columns_to_clear=None):
......
...@@ -287,4 +287,6 @@ ...@@ -287,4 +287,6 @@
- 登录模块增加excel写入函数调用。调试将图片嵌入单元格的功能,验证不可行。 - 登录模块增加excel写入函数调用。调试将图片嵌入单元格的功能,验证不可行。
80. 2025-04-16 80. 2025-04-16
- 修复展厅巡检预约系统因为元素定位失败导致的创建会议失败问题,优化issue_send_and_upload议题上传函数。 - 修复展厅巡检预约系统因为元素定位失败导致的创建会议失败问题,优化issue_send_and_upload议题上传函数。
- 修复因xlsx文件打开读取后没有关闭导致的文件损坏问题,优化read_xlsx_data函数,增加关闭文件操作。 - 修复因xlsx文件打开读取后没有关闭导致的文件损坏问题,优化read_xlsx_data函数,增加关闭文件操作。
\ No newline at end of file 81. 2025-04-17
- 修复因xlsx文件读取失败导致的报错。
\ No newline at end of file
...@@ -125,7 +125,7 @@ class Exhibition_Meeting_Control_0001: ...@@ -125,7 +125,7 @@ class Exhibition_Meeting_Control_0001:
sleep(3) sleep(3)
INFO("尝试定位麦克风按钮") INFO("尝试定位麦克风按钮")
mic_on_button = app_drive.find_element(AppiumBy.XPATH, mic_on_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[6]/android.widget.Button[2]") "/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[2]/android.widget.Button[2]")
INFO("开启麦克风") INFO("开启麦克风")
mic_on_button.click() mic_on_button.click()
sleep(2) sleep(2)
......
...@@ -19,8 +19,8 @@ if __name__ == "__main__": ...@@ -19,8 +19,8 @@ if __name__ == "__main__":
broker_address = "192.168.5.218" broker_address = "192.168.5.218"
port = 1883 port = 1883
num_repeats = 1000 # 重复执行的次数 num_repeats = 2 # 重复执行的次数
interval_between_repeats = 0.1 # 每次重复之间的间隔时间(秒) interval_between_repeats = 30 # 每次重复之间的间隔时间(秒)
# 创建 MQTT 客户端实例 # 创建 MQTT 客户端实例
mqtt_client = Mqtt(broker_address, port) mqtt_client = Mqtt(broker_address, port)
......
topic,action,thirdPartyMeetingId,thirdPartyRoomId,conferenceName,messageName,startTime,endTime,companyNumber,signInBeforeMinutes,signEndTime,enableSignOut,signOutMinutesAfterSignIn,signOutAfterEndMinutes topic,action,thirdPartyMeetingId,thirdPartyRoomId,conferenceName,messageName,startTime,endTime,companyNumber,signInBeforeMinutes,signEndTime,enableSignOut,signOutMinutesAfterSignIn,signOutAfterEndMinutes
/meeting/message/sync,add,9565416702283092156,1,表处办公室1号会议室,人脸长期运行测试4,2025-04-16 17:50:00.0,2025-04-16 18:20:00.0,CN-JHP-UBAINS,10,10,1,10,10 /meeting/message/sync,add,936100702283092182,1,表处办公室1号会议室,人脸长期运行测试30,2025-04-17 11:40:00.0,2025-04-17 12:10:00.0,CN-JHP-UBAINS,5,2,1,5,2
/meeting/message/sync,add,9565416702283092157,1,表处办公室1号会议室,人脸长期运行测试5,2025-04-16 18:40:00.0,2025-04-16 19:10:00.0,CN-JHP-UBAINS,10,10,1,10,10 /meeting/message/sync,add,936100702283092183,1,表处办公室1号会议室,人脸长期运行测试31,2025-04-17 12:20:00.0,2025-04-17 12:50:00.0,CN-JHP-UBAINS,5,2,1,5,2
/meeting/message/sync,add,9565416702283092158,1,表处办公室1号会议室,人脸长期运行测试6,2025-04-16 19:30:00.0,2025-04-16 20:00:00.0,CN-JHP-UBAINS,10,10,1,10,10 /meeting/message/sync,add,936100702283092184,1,表处办公室1号会议室,人脸长期运行测试32,2025-04-17 13:00:00.0,2025-04-17 13:30:00.0,CN-JHP-UBAINS,5,2,1,5,2
/meeting/message/sync,add,9565416702283092159,1,表处办公室1号会议室,人脸长期运行测试7,2025-04-16 20:20:00.0,2025-04-16 20:50:00.0,CN-JHP-UBAINS,10,10,1,10,10 \ No newline at end of file
/meeting/message/sync,add,9565416702283092160,1,表处办公室1号会议室,人脸长期运行测试8,2025-04-16 21:00:00.0,2025-04-16 21:30:00.0,CN-JHP-UBAINS,10,10,1,10,10
/meeting/message/sync,add,9565416702283092161,1,表处办公室1号会议室,人脸长期运行测试9,2025-04-16 21:40:00.0,2025-04-16 22:10:00.0,CN-JHP-UBAINS,10,10,1,10,10
/meeting/message/sync,add,9565416702283092162,1,表处办公室1号会议室,人脸长期运行测试10,2025-04-16 22:20:00.0,2025-04-16 22:50:00.0,CN-JHP-UBAINS,5,5,1,10,5
/meeting/message/sync,add,9565416702283092163,1,表处办公室1号会议室,人脸长期运行测试11,2025-04-16 23:00:00.0,2025-04-16 23:30:00.0,CN-JHP-UBAINS,5,5,1,10,5
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论