applescript:将“which”和“exists”放在同一行

时间:2015-04-18 11:31:30

标签: error-handling applescript

我的问题最好通过一行代码来证明:

tell application "System Events" to tell application process "Dock" ¬
to tell list 1 to first UI element whose value of attribute "AXTitle" ¬
is "Trash"

这样做会以错误结束,因为Dock中的每个UI element都不会attribute "AXTitle"dock separator item只有AXRoleAXRoleDescription

我想知道是否有办法让代码返回正确的UI element,尽管如此。

以下是我尝试过的内容:

1)尝试阻止:这只是跳过这行代码并继续下一行

2)忽略应用程序响应块:同上。

3)存在(属性" attributeName"):我能够测试每个人UI element,例如exists (attribute "AXTitle") of UI element 1,但我无法将exists用于whose语句:它应该看起来像这样:

UI elements whose (exists (attribute "AXTitle") is true)

这不起作用。现在我必须运行一个repeat with循环,一个if语句和一个exit repeat,这样我就可以遍历所有内容。这很麻烦。

必须有更好的方法。

澄清:有些人向我展示了更优雅的方式来Trash。我使用Trash作为示例,但意味着问题更广泛,即如果列表中的项目缺少此属性,如何根据属性查找列表的第一项。另一个例子是:

delay 5
tell application "System Events" to tell application process "Dock" ¬
to tell list 1 to first UI element whose value of attribute ¬
"AXSelected" is true

将光标移动到Dock中的任何项目。此示例失败,因为Dock Separator没有公共字段" AXSelected"。

2 个答案:

答案 0 :(得分:0)

这对我有用,而且也更好,因为" Trash"是本地化的,这是" Papirkurv"。 :)

tell application "System Events" to tell process "Dock"
    tell list 1
        get first UI element whose value of attribute "AXSubrole" is "AXTrashDockItem"
    end tell
end tell

如果你安装了Xcode,那么你应该有一个名为UIElementInspector的应用程序,它允许你读取UI元素的不同值。

答案 1 :(得分:0)

只需添加其他条件:whose subrole is not "AXSeparatorDockItem"

tell application "System Events"
    tell application process "Dock" to tell list 1 to (first UI element whose subrole is not "AXSeparatorDockItem" and its selected is true)
end tell 

-

更新:您可以使用title属性而不是value of attribute "AXTitle",这不会出错。

tell application "System Events"
    tell application process "Dock" to tell list 1 to UI elements whose title is "Trash"
end tell