如何用Apple Script捕获Mac桌面弹窗以解决iOS E2E测试阻塞
捕获Mac桌面弹窗的AppleScript解决方案
在iOS E2E测试过程中,测试常被Mac桌面弹窗阻塞,涉及的弹窗包括Java Access弹窗、Accessibility权限弹窗、系统属性弹窗及其他类型。原脚本仅能捕获Terminal、Google Chrome等常规窗口,无法检测到目标弹窗,以下是修正后的解决方案:
原脚本问题分析
- 过滤了
background only is false的进程:很多系统/权限弹窗(比如Accessibility请求)属于后台进程,会被排除在外 - 窗口筛选范围过窄:仅匹配
AXStandardWindow和AXDialog,但部分弹窗属于AXSheet类型,或者没有明确的subrole标记
修正后的AppleScript脚本
tell application "System Events" -- 不再过滤后台进程,覆盖所有进程 set allProcesses to processes set dialogInfos to {} repeat with eachProcess in allProcesses try tell eachProcess -- 捕获所有可见的窗口,包括弹窗、表单、对话框 set allWindows to windows where visible is true repeat with eachWindow in allWindows set windowSubrole to subrole of eachWindow -- 匹配常见弹窗类型的subrole,同时兼容无明确subrole的窗口 if windowSubrole is "AXDialog" or windowSubrole is "AXSheet" or windowSubrole is "AXStandardWindow" or windowSubrole is missing value then set windowTitle to name of eachWindow as text -- 排除空标题的系统元素(比如菜单栏图标) if windowTitle is not equal to "" then set the end of dialogInfos to {title:windowTitle, processName:(name of eachProcess as text), subrole:windowSubrole} end if end if end repeat end tell on error errMsg -- 忽略无权限访问的进程(比如系统核心进程) log "Skipped process " & (name of eachProcess as text) & ": " & errMsg end try end repeat end tell return dialogInfos
关键修改说明
- 移除后台进程过滤:覆盖所有进程,确保捕获SecurityAgent、Java相关后台进程弹出的窗口
- 扩展窗口匹配规则:加入
AXSheet类型,并兼容无明确subrole的窗口,覆盖更多弹窗场景 - 增加可见性检查:仅捕获当前显示的窗口,避免记录隐藏的后台窗口
- 错误处理优化:跳过无权限访问的系统进程,避免脚本中断
使用说明
- 确保已给终端(或运行脚本的应用)开启辅助功能权限:
- 打开「系统设置」→「隐私与安全性」→「辅助功能」
- 勾选终端(或你用来执行脚本的应用)
- 执行命令:
执行后会返回所有可见弹窗的标题、所属进程及subrole信息,包含你需要捕获的Java Access、Accessibility权限等弹窗。osascript get_popup_windows.scpt
内容的提问来源于stack exchange,提问作者Will Kuo
相关产品推荐
相关产品推荐

