Simulator.app 中自动切换菜单设置的 Automator 脚本

Automator script to automatic toggle menu setting in Simulator.app

我需要为我的 UITests 自动注册 Face ID 和 Touch ID。为此,我正在编写一个自动化脚本。

我当前的自动化脚本,目前可以自动点击菜单中的"Enrolled":

on run {input, parameters}

if application "Simulator" is running then
    tell application "System Events"
        set theName to name of the first process whose frontmost is true
    end tell
    tell application "Simulator" to activate
    tell application "System Events"
        tell process "Simulator"
            tell menu bar 1
                tell menu bar item "Hardware"
                    tell menu "Hardware"
                        tell menu item "Face ID"
                            tell menu "Face ID"
                                click (menu item "Face ID" where its name starts with "Matching")
                            end tell
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end tell
    tell application theName to activate
end if
return input
end run 

问题如下。我需要确定设备是否已经注册。有一个复选标记,显示当前状态。我试图检查复选标记是否存在。但是我还没有成功。

所以我的问题。我该怎么做,如果复选标记不存在,脚本只会按 'Enrolled' 菜单项?

menu items 有一个名为 AXMenuItemMarkChar 的属性,它要么设置为代表菜单项旁边复选标记的字符(如果选中),要么 missing value

    use application "System Events"

    tell application "Simulator" to activate

    tell process "Simulator" to tell menu bar 1 to ¬
        tell menu bar item "Hardware" to tell menu "Hardware" to ¬
            tell menu item "Face ID" to tell menu "Face ID" to ¬
                tell menu item "Enrolled"

                    if the value of the attribute "AXMenuItemMarkChar" is not "✓" then ¬
                        click it

                    delay 1 -- !important

                    return the value of the attribute "AXMenuItemMarkChar"

                end tell

在我的测试中,如果 Simulator 应用当时处于焦点状态,则属性 return 是正确的值。此脚本的 return 值应始终为“✓”,因为如果菜单项 未被 选中,则脚本会继续单击它并在下一步放置一个复选标记对它;如果菜单项 选中,那么除了通过获取属性的值来确认它之外别无他法。

您的脚本的一个问题是您错误地引用了一个不存在的菜单项 (menu item "Face ID" of menu "Face ID" of menu item "Face ID"),然后继续使用 where 子句过滤它具有不同值的名称;因此它 return 没有任何价值,您也没有可以点击的菜单项。

希望我的脚本对您有用。如果您有任何问题,请告诉我。


此答案中包含的 AppleScript 在 MacOS 10.13 上进行了测试。这是一个示例脚本,用于说明如何满足您的 objective。 delay 命令可能需要根据您的系统进行调整,脚本可能会受益于一些错误处理以使其健壮。