首页 > 解决方案 > 如何使用 JXA 访问 UI 元素中的文本?

问题描述

当您打开终端或 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 调试器,如此处所述 ,然后我编写了以下代码来调用调试器:

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

现在,在调试器的控制台中,我尝试使用此答案的第一个代码片段中显示的相同变量命名来访问对象,即

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

此时我有两个问题:

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

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

标签: javascript-automation

解决方案


您为什么要通过 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)相对于屏幕左上角的坐标。的似乎不错"l""login"

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

然后,当您运行命令时:

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

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

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


推荐阅读