Bug*_*ter 3 macos javascript-automation
我一直在尝试为自动化脚本创建一个 JavaScript,以通过 Yosemite 10.10.2 上的 Messages 应用程序发送 iMessage(最终目标是编写一个解决方案以允许后台任务到 iMessage 故障状态等)。
脚本在脚本编辑器中执行没有错误,但是没有消息发送,Messages.app 中没有任何显示或发生。虽然我的服务和下面的好友被混淆了,但我的具有真实值的脚本检索了正确的服务和好友(通过对服务和好友名称执行 messages.displayAlert() 进行验证)。我从脚本中得到的唯一输出是 service.send() 的“未定义”,我认为这是正确的,因为该方法具有 void 返回类型)。下面的这个脚本是我一直没有成功尝试开始工作的脚本:
messages = Application('Messages');
service = messages.services["E:foo@bar.com"];
buddy = service.buddies["+61nnnnnnnnn"]
service.send({
send: "Hello World",
to: buddy
});
Run Code Online (Sandbox Code Playgroud)
等效的 AppleScript 脚本(如下)成功运行:
tell application "Messages"
send "Hello World" to buddy "+61nnnnnnnnn" of service "E:foo@bar.com"
end tell
Run Code Online (Sandbox Code Playgroud)
简短回答:JXA 由 Lame 和 Fail 组成。
...
长答案:
当 JXA 运行您的service.send(...)命令时,它应该引发“错误参数”错误,因为该send命令没有名为send. 该"Hello World"字符串应作为send命令的直接参数传递,而不是作为关键字参数传递。[1]
相反,JXA 会忽略该错误,发送一个格式错误的事件,并让您在一切无声无息地失败时挠头。我建议提交错误报告,但我在 WWDC'14 之后向 AS 团队发送了大量问题和几乎完整的参考实现,他们忽略了我们,所以 YMMV。
顺便说一句,elements[NAME]语法是另一个应该劝阻/避免的错误特征。a[b]和a.b在 JavaScript 中是同义词,这意味着 JXA 无法可靠地区分表示元素名称(例如documents['untitled'])的键和表示元素属性(例如documents['text'])的键。要安全地构造按名称说明符,请使用elements.byName(NAME). 或者,见鬼,坚持使用 AppleScript,这是唯一真正正确地说明 Apple 事件的受支持解决方案。
——
[1] 是的,脚本编辑器的字典在这里可能有点误导,因为它仍然以 AppleScript 风格的语法显示命令,而不是为 JS 适当地格式化它们。(整件事是如此的半生不熟和业余,如果我不是因为他们一开始就搞砸了一个已解决的问题而生气的话,我真的会为 AS 团队感到尴尬。)
| 归档时间: |
|
| 查看次数: |
3184 次 |
| 最近记录: |