用于UI元素对象的AppleScript列表项的基于类的选择器失败

时间:2012-05-18 21:30:37

标签: applescript

AppleScript的 list 数据类型对布尔测试说明符的支持非常有限。除了按范围选择项目(使用 item 关键字),指定一个类将起作用:

get every «class furl» of {1, "Test", (POSIX file "/posix/path")} --> {file ":hfs:path"} 

当列表项是引用时,使用 contents 关键字解除引用将起作用:

get every «class furl» of {1, "Test", a reference to (POSIX file "/posix/path")} --> {}
get every «class furl» of contents of {1, "Test", a reference to (POSIX file "/posix/path")} --> {file ":hfs:path"}

那么为什么以下代码将allTextAreas设置为空列表:

tell application "System Events"
    set allUIElements to entire contents of window 1 of someApplication 
    set allTextAreas to every text area of contents of allUIElements --> {}
end tell

鉴于allUIElements UI元素对象的引用列表,并且其中至少有一个属于文本区域

注意我正在寻找如何从列表中检索某种类型的所有UI元素的建议(repeat循环会这样做) - 我想理解为什么选择器模式在这种特定情况下失败。

2 个答案:

答案 0 :(得分:1)

如果我想在Safari中找到前窗的所有按钮,我会怎么做。只需将此逻辑应用于您的情况。

tell application "System Events"
    tell process "Safari"
        set allButtons to UI elements of window 1 whose class is button
    end tell
end tell

答案 1 :(得分:1)

从应用程序获取UI元素会产生对象说明符列表:应用程序对象(嵌套容器的一种形式),其中层次结构中的每个项目都有多个属性,包括类 - {{ 3}}可能会对此有所了解 - 虽然您的第一个示例使用了具有基类的文件URL(一种文件引用)。

因此,在从应用程序获取对象或查询返回对象的所需属性时,您将需要使用应用程序筛选器引用表单,例如:

set allButtons to {}
tell application "System Events" to tell application process "Safari"
    set allUIElements to entire contents of window 1
    repeat with anElement in allUIElements
        try
            if class of anElement is button then set end of allButtons to contents of anElement
        end try
    end repeat
end tell
allButtons