我的问题最好通过一行代码来证明:
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
只有AXRole
,AXRoleDescription
等
我想知道是否有办法让代码返回正确的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"。
答案 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