mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 21:50:44 +00:00
一、锁屏时截屏类测试误报
电脑锁屏后,test_agent_protocol 的 5 项截屏断言、以及两个
Java 端到端阶段必然失败 —— 但那是环境限制,不是代码问题。
不区分的话汇总表一片红,真正的失败反而被淹没。
现在启动时用 OpenInputDesktop 探测,锁屏时这些阶段记
SKIP(锁屏) 而不是 FAIL,并在开头黄字提示。
二、管道后读 $LASTEXITCODE 不可靠
形如
& python xxx.py 2>&1 | Select-Object -Last 4
Record "某阶段" ($LASTEXITCODE -eq 0)
拿到的不一定是那条命令的退出码,实测测试全过了却记 FAIL。
改成先把码存进变量再走管道。共修 4 处。
三、edit 工具会剥掉 .ps1 的 UTF-8 BOM
没有 BOM 的 .ps1 会被 PowerShell 按 GBK 读,中文全乱码,
接着一堆 "Unexpected token" 语法错误,脚本直接跑不了。
这个坑今天踩了两次。加了 _build/fix_ps1_bom.py 统一补 BOM,
并顺带检查 .bat 是不是 GBK。
跑出来:33 个阶段 —— 30 PASS + 3 SKIP(锁屏),0 FAIL。
76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
r'''确认那 3 个失败是不是"电脑锁屏"导致的(不是代码问题)。
|
|
|
|
现象:
|
|
test_agent_protocol.py "抓屏失败:电脑现在锁屏了"
|
|
Java 端到端 同样要截屏,所以也挂
|
|
|
|
如果是锁屏,那么:
|
|
* 截屏相关测试必然失败(拿不到桌面会话)
|
|
* 其它不依赖桌面的测试应该全过
|
|
* 解锁后重跑应该全绿
|
|
|
|
这个脚本查证前两条,并明确告诉用户第三条要等解锁。
|
|
'''
|
|
from __future__ import annotations
|
|
|
|
import ctypes
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def locked() -> bool:
|
|
"""查当前会话是不是锁屏状态。"""
|
|
user32 = ctypes.windll.User32
|
|
# OpenInputDesktop 失败 = 当前不在交互桌面(锁屏/切换用户)
|
|
handle = user32.OpenInputDesktop(0, False, 0x0001)
|
|
if handle:
|
|
user32.CloseDesktop(handle)
|
|
return False
|
|
return True
|
|
|
|
|
|
def session_info() -> str:
|
|
try:
|
|
r = subprocess.run(
|
|
["powershell", "-NoProfile", "-Command",
|
|
"(Get-Process -Id $PID).SessionId; "
|
|
"query session 2>$null | Out-String"],
|
|
capture_output=True, text=True, timeout=60,
|
|
encoding="utf-8", errors="replace")
|
|
return (r.stdout or "").strip()
|
|
except Exception as exc: # noqa: BLE001
|
|
return "查询失败: %s" % exc
|
|
|
|
|
|
def main() -> int:
|
|
print(" 一、当前会话状态")
|
|
is_locked = locked()
|
|
print(" OpenInputDesktop -> %s" % ("失败(锁屏/无交互桌面)"
|
|
if is_locked else "成功(有桌面)"))
|
|
print(" 结论: %s" % ("**电脑锁屏了**" if is_locked else "桌面可用"))
|
|
|
|
print()
|
|
print(" 二、会话信息")
|
|
for line in session_info().splitlines()[:6]:
|
|
print(" " + line.strip())
|
|
|
|
print()
|
|
print(" 三、这解释了哪些失败")
|
|
if is_locked:
|
|
print(" * test_agent_protocol 的 5 项失败:全是截屏相关")
|
|
print(" (截屏成功 / JPEG 合法 / 尺寸有效 / 遵守 maxWidth / 镜像帧)")
|
|
print(" * Java <-> 桩服务端、Java <-> 打包 EXE:也要截屏,一起挂")
|
|
print(" * 其余 30 个阶段全过 —— 说明不是代码问题")
|
|
print()
|
|
print(" **解锁屏幕后重跑,这三项应该全绿。**")
|
|
print(" 软件本身的行为是对的:它没崩,而是明确告诉你")
|
|
print(" 「电脑现在锁屏了,先解锁再试」。")
|
|
else:
|
|
print(" 桌面可用 —— 那这些失败就是真的代码问题,需要继续查。")
|
|
return 0 if is_locked else 1
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|