Python subprocess.run 使用注意事项,避免出现list index out of range

在执行iOS UI 自动化专项测试的时候,在运行第一遍的时候遇到了这样的错误:

python 复制代码
2024-12-04 20:22:27 ERROR conftest pytest_runtest_makereport 106  Test test_open_stream.py::TestOpenStream::test_xxx_open_stream[iPhoneX-xxx-1-250] failed with error: list index out of range

对应客户端上的状态是:

得出判断应该是:开流失败,对应的状态没有回来,程序中没有获取到。那么当这种情况发生时如何解决上面的bug呢?看下代码:

python 复制代码
def grep_from_sandbox_log(grep_condition, iphone_model):
    # iOS沙盒目录
    log_date = datetime.now().strftime("%Y%m%d")
    mount_path = f"/Users/testmanzhang/ios_sandbox/{iphone_model}/Documents/Logs/"
    log_file_path = f"{mount_path}glazero_app_ios_{log_date}.log"

    result = None

    get_state_cmd = f"grep {grep_condition} {log_file_path}"

    if os.path.isfile(log_file_path):
        result = subprocess.run(get_state_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

        if result.stderr:
            logger.error(f"grep 错误: \n {result.stderr}")
    else:
        logger.error(f"日志文件不存在: {log_file_path}")

    return result
python 复制代码
def get_dev_play_state_result(click_time, iphone_model, sn):
    grep_condition = f"'previewSuccess  deviceId = {sn}'"
    get_result = grep_from_sandbox_log(grep_condition, iphone_model)

    # 分析获取的结果
    if get_result:
        lines = result_get_success.stdout.splitlines()
        last_line = lines[-1]
        logger.info(f"最后一行唤醒成功的结果: {last_line}\n")

问题出现在grep_from_sandbox_log方法中的

python 复制代码
result = subprocess.run(get_state_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

如果结果是空的时候,返回的result是:

python 复制代码
CompletedProcess(args='truncate -s 0 /Users/testmanzhang/ios_sandbox/iPhoneX/Documents/Logs/glazero_app_ios_20241204.log', returncode=0, stdout='', stderr='')

这时候在get_dev_play_state_result方法中,对获取到的返回结果进行判断也是True,这样问题就发生了,lines其实是一个空列表,再去使用[-1]去获取数据就报错了。

python 复制代码
    if get_result:
        lines = result_get_success.stdout.splitlines()
        last_line = lines[-1]

解决这个问题要在grep_from_sandbox_log方法中对result进行处理,即对result.stdout进行处理,把处理完成后的结果返回给其他方法,例如,get_dev_play_state_result,不能直接返回result。

在grep_from_sandbox_log方法中调整一下:

python 复制代码
    if os.path.isfile(log_file_path):
        result = subprocess.run(get_state_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

        if result.stderr:
            logger.error(f"grep 错误: \n {result.stderr}")
        elif result.returncode == 0 and result.stdout == '':
            logger.info(f"返回的return code为'',stdout为''")
        elif result.returncode == 0 and result.stdout != '':
            logger.info(f"返回的内容不为空,返回result.stdout的内容")
            get_result = result.stdout
相关推荐
AI_56783 小时前
Selenium+Python可通过 元素定位→操作模拟→断言验证 三步实现Web自动化测试
服务器·人工智能·python
蒜香拿铁3 小时前
【第三章】python算数运算符
python
heze094 小时前
sqli-labs-Less-18自动化注入方法
mysql·网络安全·自动化
2501_915909064 小时前
如何保护 iOS IPA 文件中资源与文件的安全,图片、JSON重命名
android·ios·小程序·uni-app·json·iphone·webview
52Hz1185 小时前
力扣73.矩阵置零、54.螺旋矩阵、48.旋转图像
python·算法·leetcode·矩阵
weixin_462446236 小时前
Python 使用 openpyxl 从 URL 读取 Excel 并获取 Sheet 及单元格样式信息
python·excel·openpyxl
毕设源码-钟学长6 小时前
【开题答辩全过程】以 基于Python的健康食谱规划系统的设计与实现为例,包含答辩的问题和答案
开发语言·python
百***78757 小时前
Grok-4.1技术深度解析:双版本架构突破与Python API快速集成指南
大数据·python·架构
奔跑的露西ly7 小时前
【HarmonyOS NEXT】ArkUI实现「单格单字符+下划线」手机号/验证码输入框
ui·华为·harmonyos·鸿蒙
2501_942191778 小时前
基于YOLO11-HSFPN的数字检测与识别模型实现详解
python