Applescript 使用 Javascript 迭代 UIElements

Applescript Iterate UIElements using Javascript

有人可以帮我制作一个报告 uielement 的所有子项及其属性的脚本吗?它类似于 entireContents() 函数。这是我的递归函数。

function iterate(obj) {
    for (var property in obj) {
        if(obj[property] instanceof Array) {
            console.log("Array: " + property + "," +obj[property])
            iterate(obj[property])
        } else if(obj[property] instanceof Object){
            console.log("Object: " + property + ',' + obj[property])
            iterate(obj[property])
        } else {
            console.log("Unknown: " + property +"," + obj[property]);
        }
    }
}
iterate(app.windows())

我只拿到了第一关。每个项目下都有一堆 UIElements 和数组。我认为这与 Applescript 返回对象说明符有关,但与实际对象无关?我不确定如何调用对象说明符的名称作为函数。我尝试了 obj属性、obj.property()、eval("obj." + 属性 + "()"), 和 none 它们的工作原理。我也试过 iterate(app.windows())[0]
感谢您的帮助。

我假设您想使用“系统事件”的Processes Suite中的命令。

  • 要获得 UIElement 的 属性,您必须使用以下属性之一:

(accessibilityDescription, class, description, enable, entireContents, focused, help, maximumValue, minimumValue, name, orientation, position, role, roleDescription, selected, size, subrole, title, value)

  • 获取名称的示例:obj[i].name().

要从一个 UIElement 中获取所有 UIElement,您必须使用 obj[i].uiElements()

这是“TextEdit”进程的 windows 示例。

function iterate(obj) {
    for (var i in obj) {
        if(obj[i] instanceof Array) {
            iterate(obj[i])
        } else if(obj[i] instanceof Object){
            console.log("Object: " + i + ': name = ' + obj[i].name() + ', value = ' + obj[i].value() + ', class = ' + obj[i].class() + ', description = ' + obj[i].description())
            iterate(obj[i].uiElements())
        }
    }
}
var sysEv = Application('System Events')
var app = sysEv.processes['TextEdit']
iterate(app.windows())