9

我不确定这是否可以通过 AppleScript 和/或 Automator 实现……但我希望能够:

a) 启动一个应用程序(我知道这可以通过 AppleScript 或 Automator 轻松完成)

b) 应用程序启动后,使用 AppleScript 或 Automator 选择特定菜单项。

例如,我想启动 Excel 2008(我有没有为 Automator 预配置的家庭/学生版),然后单击“文件”菜单并单击“打开”。

关于去哪里/寻找如何选择这样的菜单项的任何指针(或者是否有可能)?

您可以使用 Automator 的 Record 功能“某种程度上”做到这一点,但 Record 非常脆弱。

我宁愿能够使用 AppleScript 来简单地抓取一个包含应用程序每个菜单项的“数组”,然后以编程方式单击数组中的第 0 个菜单项……等等。等等

这可能吗?

TIA

4

5 回答 5

6
tell application "###"

activate

end tell


tell application "System Events"

tell process "###"

click menu item "^^^" of menu "$$$" of menu bar 1

end tell

end tell

将您的应用程序放入### 并将您的菜单项放入 ^^^ 并将您的菜单(文件、编辑、查看等)放入 $$$。资本化问题。

顺便说一句,把它放在applescript中

例子:

tell application "iTunes"

activate

end tell


tell application "System Events"

tell process "iTunes"

click menu item "as list" of menu "view" of menu bar 1

end tell

end tell

删除双空格EXCEPT BETWEEN END TELL AND TELL APPLICATION "SYSTEM EVENTS"

于 2012-06-29T20:50:53.107 回答
3

我经常需要创建一个 GUI 脚本来访问应用程序中的菜单项,这些应用程序的 AppleScript 库不提供对菜单项所代表的对象或功能的直接访问。为了便于重用代码,我使用变量来表示应用程序、菜单和菜单项名称。然后我只需要更改顶部的变量,而不是从代码体中挑选名称。

set targetApp to "app_name"
set theMenu to "menu_name"
set theItem to "menu_item_name"

tell application targetApp
    activate
    tell application "System Events"
        tell application process targetApp
            tell menu bar 1
                tell menu bar item theMenu
                    tell menu theMenu
                        click menu item theItem
                    end tell
                end tell
            end tell
        end tell
    end tell
end tell

子菜单

当涉及子菜单和子子菜单时,它会涉及更多一点,因为具有子菜单的菜单项既是其父菜单的菜单项,又是其子菜单的菜单父项。请注意,文本变量“theItem”用于指定菜单项和菜单;“targetApp”字符串变量用于引用应用程序和进程,因此在重用代码时不必在 2 个位置编辑 2 个名称。我使用此脚本运行语音命令以快速访问菜单项,而不必说,例如,“单击编辑菜单”...“单击转换”...“单击制作大写”...我添加了另一个变量对于子菜单项:

set targetApp to "app_name"
set theMenu to "menu_name"
set theItem to "menu_item_name"
set theSubItem to "sub_item_name"

tell application targetApp
    activate
    tell application "System Events"
        tell application process targetApp
            tell menu bar 1
                tell menu bar item theMenu
                    tell menu theMenu
                        tell menu item theItem
                            tell menu theItem
                                click menu item theSubItem
                            end tell
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end tell
end tell

例如:

set targetApp to "TextEdit"
set theMenu to "Edit"
set theItem to "Transformations"
set theSubItem to "Make Upper Case"

tell application targetApp
    activate
    tell application "System Events"
        tell application process targetApp
            tell menu bar 1
                tell menu bar item theMenu
                    tell menu theMenu
                        tell menu item theItem
                            tell menu theItem
                                click menu item theSubItem
                            end tell
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end tell
end tell

如果有另一个级别的子菜单,则需要一个额外的变量(例如,“theSubSubItem”),并且系统事件过程中的行告诉块将有另一个层
......

                            tell menu item theItem
                                tell menu theSubItem
                                    click menu item theSubSubItem
                                end tell
                            end tell

...
正如本线程其他地方所述,建议在 API 中包含应用程序的对象和函数时直接寻址它们,但当 API 不提供直接访问时,寻址 GUI 作为最后的手段是有用的。缺点是 GUI 脚本可能会变得更加繁琐,并且可能必须在每次应用程序更新时进行修改。

于 2019-12-13T23:12:23.790 回答
2

确实,UI 脚本是脆弱和挑剔的,但你可以看看 Apple 的AppleScript GUI 脚本页面

于 2011-02-16T21:35:07.297 回答
1

UI 脚本是一个善变的野兽。它很脆弱,而且通常对您无法控制的许多事情很敏感,例如意外对话框(来自其他应用程序)、系统字体或语言的更改、用户活动。更不用说跨版本的应用程序 UI 的变化了。

通过 AppleScript API 直接与应用程序对话会更加健壮。这正是 AppleScript 的目的。您始终可以通过 AppleScript Editor.app 中的“打开字典...”菜单项查看应用程序可以通过 AppleScript 提供的操作和数据(在文件对话框中选择要编写脚本的应用程序)。您无需模拟鼠标单击菜单,而是通过 AppleScript 直接调用菜单项触发的操作。

当然,并非所有应用程序都有完整的(甚至任何)AppleScript API。但是,如果您的目标是 Excel,则它具有出色的 AppleScript 支持。

如果您真的想进行 UI 测试,我建议您从其他选项开始:

  1. 测试模型(类似于通过 AppleScript 编写应用程序模型的脚本)。事实上,如果您在应用程序中包含 AppleScript API,您也可以自动测试该 API。
  2. 使用Google Toolbox for Mac 的单元测试添加(或滚动您自己的)以编程方式将鼠标或键盘事件发送到您的应用程序。
  3. 使用 Instruments.app 记录 UI 序列。Instruments 的录音很可靠(我没有使用 Automator 的 Record 功能),而且您还可以获得 Instruments 的所有其他优点。
于 2010-01-21T18:46:21.260 回答
-1

我不知道如何抓取一个数组,但这看起来可能适用于发送鼠标点击等:

虚拟输入

于 2010-01-21T18:31:27.490 回答