Error handling applescript:work";谁的";及;“存在”;同流合污

Error handling applescript:work";谁的";及;“存在”;同流合污,error-handling,applescript,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元素都具有属性“AXTitle”停靠分隔符项仅具有AXRole,AXRoleDescription等 我想知道是否有办法

我的问题最好用一行代码来说明:

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元素
都具有
属性“AXTitle”
<代码>停靠分隔符项仅具有
AXRole
AXRoleDescription

我想知道是否有办法让代码返回正确的
UI元素

以下是我尝试过但失败的地方:

1) 试试block:只需跳过这行代码,继续下一行

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

3) 存在(属性“attributeName”):我能够用UI元素1的
存在(属性“AXTitle”)测试每个
UI元素
,但我无法将
存在
放入
语句中:它应该是这样的:

UI elements whose (exists (attribute "AXTitle") is true)
这是行不通的。现在我必须运行一个
repeat with
循环、一个
if
语句以及一个
exit repeat
,这样我就可以遍历所有内容。这很麻烦

一定有更好的办法

澄清:一些人向我展示了更优雅的方式,让我去
垃圾桶
。我使用了
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”

这对我很有用,而且更好,因为“垃圾”的标题是本地化的,这里是“Papirkurv”。)


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

只需添加另一个类似的条件:
其子例程不是“AXSeparatorDockItem”

--

更新:您可以使用
标题
属性代替属性“AXTitle”
值,这不会给出错误

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

谢谢我的意思是,这个问题是关于循环通过一个属性,即使有些项目缺少这个属性。我真正想要的属性是
AXSelected
。码头分离器没有。我想我应该使用垃圾桶,这样人们就不必延迟和移动光标进行测试了。我认为,只要过滤器遇到不具有该属性的项时会出错,那么WHERS子句就是一个no。我想你必须先得到一个具有所选属性的项目列表,-使用重复循环构建它,然后再次循环,以找到AXSelected=true的项目。这是我见过的最好的解决方案,尽管我确实希望我可以添加一个类似于
的条件,其属性“attributeName”存在
。当有分隔符时,在菜单项之间循环也是一样的。不可能使用
exists
命令。我在我的回答中添加了另一个解决方案
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 
tell application "System Events"
    tell application process "Dock" to tell list 1 to UI elements whose title is "Trash"
end tell