如何用Robot Framework编写终端及CMD中按Ctrl+C自动执行的15秒Android adb日志录制功能
问题分析
原代码的核心问题是Run关键字会阻塞执行,直到adb logcat命令结束才会继续后续步骤,但logcat是持续输出的,所以Sleep和AutoIt的Send操作永远不会触发。
解决方案
需要用非阻塞的方式启动adb logcat命令,再定时终止进程,以下是两种可行方案:
方案一:使用Robot Framework内置Process库(推荐)
Start Process可以异步启动进程,不会阻塞后续步骤,跨终端/CMD环境通用:
*** Settings *** Library Process *** Test Cases *** RecordCrashLog15Seconds # 生成带时间戳的文件名,避免覆盖旧日志 ${timestamp} = Get Time format=%Y%m%d%H%M%S # 异步启动adb logcat进程,将崩溃日志写入文件 ${process_handle} = Start Process adb shell logcat -b crash > log_crash_${timestamp}.txt # 持续录制15秒 Sleep 15s # 终止adb logcat进程 Terminate Process ${process_handle}
- 优势:无需额外依赖第三方库,逻辑简洁稳定
方案二:基于AutoIt的Windows CMD专属方案
如果坚持用AutoIt,需要让adb命令在独立CMD窗口启动,避免阻塞Robot Framework主进程:
*** Settings *** Library AutoItLibrary *** Test Cases *** RecordCrashLogWithAutoIt # 打开新CMD窗口执行adb logcat命令 AutoItLibrary.Run cmd.exe /c adb shell logcat -b crash > log_crash_date.txt # 等待窗口初始化完成 Sleep 2s # 激活目标CMD窗口,确保焦点正确 AutoItLibrary.WinActivate cmd.exe # 录制15秒 Sleep 15s # 发送Ctrl+C终止日志输出 AutoItLibrary.Send {^c}
- 注意:若CMD窗口标题不匹配,可替换
WinActivate的参数为窗口的具体标题文本,比如C:\Windows\system32\cmd.exe
关键注意事项
- 确保adb已加入系统环境变量,或使用adb的完整路径(如
C:\platform-tools\adb.exe) - 文件名建议用时间戳命名,避免重复执行时覆盖原有日志
- 方案一的
Process库是Robot Framework内置组件,无需额外安装
内容的提问来源于stack exchange,提问作者TommasHuang
相关产品推荐
相关产品推荐

