【问题标题】:How to access text in UI element with JXA?如何使用 JXA 访问 UI 元素中的文本?
【发布时间】:2020-07-12 08:37:59
【问题描述】:

当你打开一个终端或 iTerm 窗口时,你会看到一个类似的字符串

Last login: Fri Jul 10 00:00:00 on ttys000
(base) my_username@my_hostname ~ %

我希望能够将此字符串读入 JXA 中的变量中。

这是我到现在为止的距离。

1。无障碍检查员

通过 Accessibility Inspector,我发现了导致我正在寻找的字符串的 UI 元素的层次结构。

2。界面浏览器

我使用 UI 浏览器在层次结构中导航并获取 Apple 脚本代码来访问元素;但我需要 JXA 代码。

3。翻译成代码

为了尝试使用 JXA 访问上述 UI 层次结构,我首先启用了 Safari JavaScript 调试器as explained here 然后我编写了这段代码来调用调试器:

i_term = Application('iTerm')
i_term.quit()
i_term.activate()
delay(0.2)
debugger

现在,在调试器的控制台中,我尝试使用第一个代码 sn -p from this answer 中所示的相同变量命名来访问对象,即

i_term.windows()[0].groups()[0].splitterGroups()[0].scrollAreas()[0]

此时我有两个问题:

  • 我实际上不知道我尝试访问的对象是否存在,因为在控制台中我得到了无信息的输出。我只知道i_term.windows()[0] 是正确的,因为如果我输入i_term.windows()[0].name() 我会得到字符串“zsh”,它是窗口的标题。
  • 我不知道文本 UI 元素的方法/变量的名称是什么。

更一般地说,我在另一个问题中的描述方式(我将很快进行编辑的链接),我尝试以多种方式打印我正在使用的变量的“内容”,但我不能查看它们包含的方法/值。例如:我希望能够看到i_term 的方法/变量列表,特别是要知道它包含方法windows(),但我没有找到获取此信息的方法。能够获得这些信息将使编写代码变得更加容易,即使目前缺乏文档。

如何获取该文本的字符串值?

【问题讨论】:

    标签: javascript-automation


    【解决方案1】:

    您为什么要通过 UI 脚本来实现您的目标?这是最难实现的脚本,也最有可能出错。

    我不知道你是否知道,但是 Terminal.appiTerm.app 中的终端窗口的内容都可以通过它们的 AppleScript 检索属性。

    iTerm:

    Application('com.googlecode.iterm2').windows[0].tabs[0].sessions[0].contents()
    // OR:                              .currentWindow.currentSession.contents()
    

    终端:

    Application('com.apple.Terminal').windows[0].tabs[0].contents()
    // OR:                           .windows[0].selectedTab.contents()
    

    侧边栏:

    要获得对屏幕上任何给定 UI 元素的对象引用如果存在),您需要:

    1. 一个明确的、通畅的像素,仅属于相关 UI 元素,您可以识别其相对于屏幕左上角的 (x, y) 坐标。 "login""l" 看起来不错:

    2. 授予脚本编辑器系统事件的访问权限。

    然后,当你运行命令时:

    tell application id "com.apple.systemevents" to click at {x, y}
    

    并且,如果您在坐标(x, y) 处标识的像素在命令执行时仍然在视图中,那么命令的返回值将是对占据这些坐标处像素的UI 元素的对象引用。

    如果它返回missing value,则该元素不可访问。

    【讨论】:

    • 感谢您的解释。顺便说一句,我不知道该属性来访问内容。我通常使用其他类型的脚本,但有时我觉得 UI 脚本解决方案更灵活,因为它让我可以使用 UI,所以我正在努力学习它。
    猜你喜欢
    • 2015-05-18
    • 2018-03-14
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2022-07-10
    相关资源
    最近更新 更多