用途
本技能用于测试运行中 Qt/PySide 应用的桌面集成功能,覆盖系统托盘、桌面通知和音频三类能力。这些能力位于部件树之外,通过 D-Bus 和 PipeWire 工作,而非 AT-SPI,因此不适用于普通窗口部件的交互;部件交互应使用 qt-devtools-app-interaction 技能。所有命令在宿主机或虚拟机中执行方式相同,无需 SSH 包装;仅任意命令需要借助 vm run 执行。
主要能力
系统托盘
要求 SNI(StatusNotifierItem)支持,虚拟机通过 snixembed 将 XEmbed 托盘图标桥接到 SNI,使用 QSystemTrayIcon 的应用可被访问。
tray list:列出所有托盘项,显示名称、总线名和对象路径;--json输出结构化结果。tray click "AppName":按名称子串左键点击(D-Bus Activate)托盘图标;--button right通过 xdotool 打开上下文菜单。tray menu "AppName":显示上下文菜单条目及索引;--json输出结构化结果。tray select "AppName" "Quit":按标签点击指定菜单项。
桌面通知
通过 dbus-monitor 监听 org.freedesktop.Notifications 捕获通知,通知以数字 ID 标识。
notify listen --timeout 10:在 N 秒内捕获通知(默认 5 秒),返回通知 ID、应用名、摘要、正文和可用动作;--json输出结构化结果。notify dismiss 42:按 ID 关闭通知。notify action 42 "action_key":触发通知上的动作按钮,动作键来自监听输出。
注意:QSystemTrayIcon.showMessage() 可能因通知后端不同而不发出标准 D-Bus 通知信号;若未捕获到通知,可先用更长的超时时间配合 notify listen 检查。
音频
基于 PipeWire 提供虚拟麦克风、录制和校验:
audio virtual-mic start:通过 pw-loopback 创建虚拟麦克风,--name自定义节点名称(默认 virtual-mic)。audio virtual-mic stop:停止虚拟麦克风。audio virtual-mic play audio.wav:向虚拟麦克风送入音频文件,--name指定目标节点。audio record --duration 3 -o /tmp/out.wav:从 PipeWire 录制 N 秒(默认 5 秒);--loopback改为捕获输出音频而非输入。audio verify /tmp/out.wav:检查录音是否非静音,返回最大振幅、RMS 振幅和时长,静音时退出码为 1;--threshold调整 RMS 灵敏度(默认 0.001),--json输出结构化结果。audio sources:列出可用音频源(输入);--json输出结构化结果。audio status:列出活动音频流;--json输出结构化结果。
使用方式
典型流程示例:托盘场景先 tray list 列出托盘项,再 tray click "MyApp" 激活,最后用 tree 验证应用窗口出现;菜单场景用 tray menu 查看条目后 tray select 选择并验证对话框;通知场景先点击应用中的触发按钮,再用 notify listen --timeout 10 --json 捕获并解析通知 ID 与动作键,最后 notify action 触发动作;音频场景依次创建虚拟麦克风、播放测试音频、回环录制、校验非静音并停止虚拟麦克风。
适用场景
适用于在 Linux 环境中测试 Qt/PySide 应用的托盘图标激活与菜单操作、桌面通知的捕获/关闭/动作触发,以及麦克风输入与音频输出的端到端验证。
限制
这些是 Linux 专属能力,虚拟机需运行相应服务(托盘依赖 snixembed,通知依赖 dbus-monitor,音频依赖 PipeWire,且需安装 pipewire-utils 以提供 pw-loopback)。若出现“No tray items found”,需检查 snixembed 是否运行、应用是否使用 SNI 而非 XEmbed,并可在应用完全启动后重试;若未捕获到通知,可增大超时并确认应用使用标准通知路径;若录音静音,需检查 PipeWire 状态、虚拟麦克风连接及应用输入源,必要时延长录制时间或降低阈值。