javascript-automation - 如何使用 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()[0]
是正确的,因为如果我输入i_term.windows()[0].name()
我会得到字符串“zsh”,它是窗口的标题。 - 我不知道文本 UI 元素的方法/变量的名称是什么。
更一般地说,我在这个其他问题中的描述方式(我将很快进行编辑的链接),我尝试以多种方式打印我正在使用的变量的“内容”,但我看不到这些方法/它们包含的值。例如:我希望能够查看 的方法/变量列表i_term
,特别是要知道它包含方法windows()
,但我没有找到获取此信息的方法。能够获得这些信息将使编写代码变得更加容易,即使当前缺乏文档也是如此。
如何获取该文本的字符串值?
解决方案
您为什么要通过 UI 脚本来实现您的目标?这是最难实现的脚本,也是最有可能崩溃的。
我不知道你是否知道,但是Terminal.app和iTerm.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 元素的对象引用(如果存在),您需要:
一个明确的、通畅的像素,仅属于相关的 UI 元素,您可以识别其
(x, y)
相对于屏幕左上角的坐标。的似乎不错"l"
:"login"
授予脚本编辑器和系统事件的访问权限。
然后,当您运行命令时:
tell application id "com.apple.systemevents" to click at {x, y}
并且,如果您在(x, y)
执行命令时在坐标处标识的像素仍然在视图中,那么命令的返回值将是对占据这些坐标处像素的 UI 元素的对象引用。
如果它返回missing value
,则该元素不可访问。
推荐阅读
- excel - 尝试使用偏移和间接从 1 列数据中创建 2 列
- gulp - 在其他任务之后使用 browserSync.stream()
- angular - 在没有 web-pack 和 Angular CLI 的情况下创建 Angular 项目
- tomcat - Apache Commons FileUpload:使用 HTTPS 上传大于 100kb 的文件时出现问题
- asp.net-mvc - 如果我在页面上使用 querystring,navigationurl 在同一页面中重定向
- angular - 在 Angular NGXS 中从不同组件中搜索数据
- shelljs - 重命名目录中的文件(Shelljs)
- c++ - GLUT 只是为小行星游戏画了一艘船,但无法正确移动和旋转船
- vue.js - Vuetify - 如何在滑块刻度标签中添加 html
- r - 编辑日期格式并使用日期对数据框进行排序