如何使用AppleScript访问子目组下的子菜单项

如何使用AppleScript访问子目组下的子菜单项,applescript,Applescript,我无法访问“库测试”子菜单项(请参见屏幕截图)。我的猜测是,这与以下事实有关:该项与菜单中具有“符号”标题的其他项分组/偏移 我试着把“符号”当作它自己的菜单项,但没有成功 以前有人碰到过这个吗?谢谢 AppleScript: tell application "System Events" tell process "Sketch" set frontmost to true click menu item "Rectangle" of menu of

我无法访问“库测试”子菜单项(请参见屏幕截图)。我的猜测是,这与以下事实有关:该项与菜单中具有“符号”标题的其他项分组/偏移

我试着把“符号”当作它自己的菜单项,但没有成功

以前有人碰到过这个吗?谢谢

AppleScript:

tell application "System Events"
    tell process "Sketch"
        set frontmost to true
        click menu item "Rectangle" of menu of menu item "library-test" of menu "Insert" of menu bar 1
    end tell
end tell
脚本编辑器中的错误消息:

"Can’t get menu item "library-test" of menu "Insert" of menu bar 1 of process "Sketch".
编辑:UI浏览器屏幕阅读器工具建议路径正确:


AppleScript GUI脚本的一个特点是,对象的元素总是一对多的关系,即使我们可能很自然地假定是一对一的关系。你我都知道一个菜单项只能有一个菜单,但是AppleScript没有,所以我们仍然需要为菜单指定一个索引。如果您写下以下内容,事情应该正常运行:

click menu item "Rectangle" of menu 1 of menu item "library-test" [...]

菜单名中可能有一些奇怪的字符,例如软连字符、不间断连字符、不间断空格等。一种解决方案是尝试通过其索引获取特定菜单项,无论名称是什么。执行此操作的处理程序如下所示:

on run -- example
    clickMenu at {"Sketch", "Insert", 18, "Rectangle"}
end run

to clickMenu at menuList -- {application, menu, menu/item/index, menu/item/index, ...}
    try
        set itemCount to (count menuList)
        if itemCount < 3 then error "clickMenu handler:  menu item list contains too few items"
        set {appName, menuName} to items 1 thru 2 of menuList
        set {menuItem, found} to {last item of menuList, false}
        tell application appName to activate
        tell application "System Events" -- set up the menu path
            set appName to (name of application processes whose frontmost is true) as text -- process name might be different
            set menuPath to menu menuName of menu bar item menuName of menu bar 1 of application process appName
            if itemCount > 3 then repeat with i from 3 to (itemCount - 1) -- add sub menu items
                set menuName to item i of menuList
                if class of menuName is integer then set menuName to item menuName of (get name of menu items of menuPath)
                set menuPath to menu menuName of menu item menuName of menuPath
            end repeat
            if class of menuItem is not integer then -- go for a a partial name match of the last item
                repeat with anItem in (get name of menu items of menuPath)
                    if anItem begins with menuItem then -- can also use 'contains', etc
                        set {menuItem, found} to {anItem, true}
                        exit repeat
                    end if
                end repeat
                if not found then error "clickMenu handler:  menu item " & quoted form of menuItem & " not found"
            end if
            if (enabled of menu item menuItem of menuPath) then -- or filter for other desired property
                click menu item menuItem of menuPath
                delay 0.5
                return true -- success
            end if
            return false -- menu item not clicked
        end tell
    on error errorMessage number errorNumber
        -- error errorMessage number errorNumber -- uncomment to pass error up the chain
        log errorMessage
        return false
    end try
end clickMenu
运行时--示例
单击{“草图”、“插入”、18、“矩形”处的菜单
终点
单击菜单列表中的菜单--{应用程序,菜单,菜单/项/索引,菜单/项/索引,…}
尝试
将itemCount设置为(count菜单列表)
如果itemCount<3,则出现错误“clickMenu handler:菜单项列表包含的项太少”
将{appName,menuName}设置为菜单列表的第1到第2项
将{menuItem,found}设置为{menuList的最后一项,false}
告诉应用程序appName激活
告诉应用程序“系统事件”--设置菜单路径
将appName设置为(最前面为true的应用程序进程的名称)作为文本--进程名称可能不同
将menuPath设置为应用程序进程appName的菜单栏项目菜单栏1的菜单菜单菜单名
如果itemCount>3,则重复i从3到(itemCount-1)——添加子菜单项
将菜单名设置为菜单列表的第i项
若menuName的类为整数,则将menuName设置为的项menuName(获取menuPath菜单项的名称)
将菜单路径设置为菜单项的菜单名称菜单路径的菜单名称
结束重复
若menuItem的类不是整数,那个么——查找最后一项的部分名称匹配
在中使用anItem重复(获取菜单路径菜单项的名称)
如果一个项目以menuItem开头,那么--也可以使用“contains”等
将{menuItem,found}设置为{anItem,true}
退出重复
如果结束
结束重复
如果找不到,则出现错误“clickMenu handler:菜单项”&菜单项的引用形式和“找不到”
如果结束
如果(菜单项menuItem of menuPath已启用),则--或筛选其他所需属性
单击菜单项“菜单路径的菜单项”
延迟0.5
回归真实——成功
如果结束
返回false--未单击菜单项
结束语
关于错误信息编号错误编号
--errorMessage number errorNumber--取消注释以向上传递错误链
日志错误消息
返回错误
结束尝试
结束单击菜单

恐怕这是个坏消息:我刚下载了草图,并对菜单层次结构进行了调整。您的引用是正确的,但它似乎只在菜单关闭后的短时间内有效。无论出于何种原因,Sketch似乎会动态热加载特定的菜单项,并在菜单关闭时再次卸载它们

我显然没有你的exist菜单组合,因为我没有那些特殊的符号,但这里有一个你可能很熟悉的:

menu item "Document" of menu "Insert" of menu bar item "Insert" of menu bar 1 of process "Sketch"
我最初打开了菜单,然后关闭它进入脚本编辑器,然后猛击出
菜单项
引用。它工作得很好,我得到了一堆属性和属性名称:

{UIProperties:{minimum value:missing value ¬
    , orientation:missing value, position:{195, 264} ¬
    , class:menu item, accessibility description:missing value ¬
    , role description:"menu item", focused:missing value ¬
    , title:"Document", size:{173, 19}, help:missing value ¬
    , entire contents:{}, enabled:true, maximum value:missing value ¬
    , role:"AXMenuItem", value:missing value, subrole:missing value ¬
    , selected:true, name:"Document", description:"menu item"} ¬
    , UIAttributes:{"AXEnabled", "AXFrame", "AXParent", "AXChildren", ¬
    "AXSize", "AXMenuItemCmdGlyph", "AXRole", "AXMenuItemPrimaryUIElement", ¬
    "AXServesAsTitleForUIElements", "AXMenuItemCmdModifiers", "AXPosition", ¬
    "AXTitle", "AXHelp", "AXMenuItemCmdChar", "AXRoleDescription", ¬
    "AXSelected", "AXMenuItemCmdVirtualKey", "AXMenuItemMarkChar"} ¬
    , UIActions:{"AXCancel", "AXPress"}}
大约20-30秒后,完全相同的
菜单项
引用抛出错误,报告未找到
菜单项“文档”
。 所以我运行了这个:

name of menu items of menu "Insert" of menu bar item "Insert" of menu bar 1 of process "Sketch"
您可能会推断,这将返回
“插入”
菜单中所有
菜单项的名称,您可能希望
“文档”
位于其中:

{"New Page", missing value, "Shape", "Vector", "Pencil", missing value, "Text", ¬
 "Image…", missing value, "Artboard", "Slice", "Hotspot", missing value, missing value}
没有。为便于比较,以下是屏幕上的菜单:

缺失值
项很好,它们对应于一个水平分隔符,但最后一个除外,它对应于
“Symbol”
小节标题。 奇怪的是,这个列表到此为止;甚至没有其他菜单项的占位符,这些菜单项实际上已经不存在了(直到我再次打开菜单)

我想,访问这样的菜单项的唯一方法是让脚本单击菜单打开它,然后单击菜单项,依此类推。。。 非常不雅观,我个人宁愿把我的电脑扔到太阳底下也不愿那样做,但我看不到其他选择


该应用程序显然是可以编写脚本的,但它没有术语词典,因此我们也没有太多可以做的事情。

谢谢。我在发帖之前就试过了,但没有解决问题。问题是更高的节点,脚本找不到“库测试”。菜单项可以被禁用,这看起来就像他们对组“标题”所做的一样。此标题下的菜单项是缩进的,因此您可能会在项目名称中找到两个前导空格。@red\u nerge这是一个很好的见解。尝试添加前导标签和空格,但没有成功。是的,就是这样!非常感谢您下载草图并进行调查。我试过你关于点击的建议