You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hammerspoon脚本异常:执行截图后按钮点击流程中断

Hammerspoon脚本执行异常:截图后按钮点击序列中断

需求说明

  • 对目标应用程序截图
  • 识别截图中的文本内容
  • 执行一系列按钮点击操作
  • 递归重复上述流程

核心问题

代码中调用TakeScreenshot(win, rect, filename)后,脚本在执行完第一个按钮点击后会静默终止,无任何报错信息;若注释该行代码,脚本可正常完成所有流程:识别已保存截图的文本、执行完整按钮点击序列并递归运行。

已做排查

  • 已将计时器存入GlobalTimers,避免被垃圾回收
  • 简化版本可复现问题:仅保留截图+两次按钮点击逻辑,注释截图步骤则功能正常,否则点击第一个按钮后停止
  • 日志输出仅到[DEBUG] Clicking button1,无后续记录
  • 尝试过给TakeScreenshot添加回调、增加操作延迟,问题未解决

解决方案建议

  1. 排查截图操作的阻塞性
    Hammerspoon的截图API若为同步阻塞逻辑,可能打乱后续异步计时器的执行顺序。可将截图操作放入异步队列,或用hs.timer.doAfter延迟执行按钮点击,确保截图完全完成后再启动后续流程。

  2. 确认系统权限
    检查Hammerspoon是否已获得完整的屏幕录制权限(系统设置>隐私与安全性>屏幕录制),权限请求弹窗可能导致脚本上下文静默中断。

  3. 强制捕获错误信息
    在按钮点击的回调逻辑中用pcall包裹,捕获潜在的静默错误:

    local success, err = pcall(function()
        -- 按钮点击的具体代码
    end)
    if not success then
        hs.logger.new("ButtonError"):err(err)
    end
    
  4. 替换递归为定时器循环
    递归调用结合截图操作可能引发内存泄漏或上下文异常,改用定时器循环实现重复流程:

    local function runCycle()
        TakeScreenshot(win, rect, filename)
        -- 文本识别逻辑
        -- 按钮点击序列执行完成后,触发下一轮循环
        hs.timer.doAfter(1, runCycle)
    end
    hs.timer.doAfter(0, runCycle)
    

替代方案

  • 直接读取UI元素文本:若目标应用支持Accessibility,用hs.uielement直接获取窗口元素的文本内容,跳过截图OCR步骤:
    local app = hs.application.find("TargetAppName")
    local targetElement = app:mainWindow():findElement({role = "staticText"})
    local textContent = targetElement:attributeValue("AXValue")
    
  • 系统原生OCR调用:通过hs.osascript.applescript调用系统自带OCR工具,直接处理屏幕区域,无需保存截图文件,减少IO操作风险。
  • 第三方自动化工具:改用Keyboard Maestro或Alfred等工具,其UI交互与OCR集成更成熟,适合这类重复自动化流程。

内容的提问来源于stack exchange,提问作者Touniouk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:12:41