AppleScript 驱动 Safari 和 Chrome 机制不同:Chrome 依赖 execute javascript 操作 DOM 且需开启“允许 Apple 事件中的 JavaScript”,Safari 原生支持 AppleScript 对象模型但需辅助功能授权;两者均需权限、延时判断和语义化元素定位。
applescript 能在 macos 上可靠地驱动 safari 和 chrome,但两者机制不同、权限要求不同、能力边界也不同。直接套用同一套脚本往往失败,关键在于区分对待。
Chrome:靠 JavaScript 执行 + AppleScript 编排
Chrome 不开放原生 AppleScript 对象模型(如 tab 或 document 的完整属性),必须依赖 execute javascript 操作 DOM。所有页面内动作——点击按钮、填表单、取文本、监听加载——都得写 JS 代码,再由 AppleScript 调用。
- 必须提前在 Chrome 设置中开启「允许通过 AppleScript 运行 JavaScript」:菜单栏 → 视图 → 开发者 → 勾选「允许 Apple 事件中的 JavaScript」
- 刷新、新建标签、激活窗口等系统级操作可用 AppleScript 直接完成;但“等待某个元素出现”“等 AJAX 加载完再取值”这类逻辑,需自己加
repeat循环 +delay+ JS 查询判断 - 示例:自动搜索并点第一条结果
tell application "Google Chrome"
activate
make new tab with properties {URL: "https://google.com"}
end tell
delay 2
tell application "Google Chrome"
tell active tab of front window
execute javascript "document.querySelector('textarea[name=\"q\"]').focus()"
delay 0.5
execute javascript "document.querySelector('textarea[name=\"q\"]').value = 'macos applescript'"
execute javascript "document.querySelector('input[name=\"btnK\"]').click()"
end tell
end tell
Safari:原生支持更强,但需辅助功能授权
Safari 提供较完整的 AppleScript 对象模型(document、tab、URL、name 等可直接读写),无需手动注入 JS 就能获取标题、跳转、关闭标签。但部分操作(如滚动、聚焦输入框)仍需 JS 补充。
使用 inotes CLI 从终端管理 Apple Notes。当需要在 macOS 的 Notes.app 中列出、读取、创建、编辑、删除或搜索备忘录时使用。
- 必须在「系统设置 > 隐私与安全性 > 辅助功能」中,允许脚本编辑器或快捷指令控制 Safari
- 支持直接读取
URL、name、text属性,适合做书签同步、页面状态轮询、多标签管理 - 若要执行复杂交互(例如模拟用户点击某段动态渲染的菜单),仍需搭配
do JavaScript
跨浏览器共性注意事项
无论操作哪个浏览器,以下三点绕不开:
- 权限是前提:Chrome 要开「允许 Apple 事件中的 JavaScript」;Safari/Chrome 都需辅助功能授权,否则脚本会静默失败或弹出权限请求
-
延时不可省:页面加载、JS 执行、DOM 渲染都有延迟。硬写
delay 1不够稳,建议用repeat+ 条件判断代替固定等待 -
避免依赖 UI 元素位置:不要用 System Events 模拟鼠标点击坐标(易受分辨率/缩放影响),优先用
execute javascript找 ID/class/role 等语义化标识
实用场景推荐做法
根据目标选路径,少走弯路:
-
自动刷新直到某文字出现 → Chrome 用
execute javascript "document.body.innerText"+repeat;Safari 可直接读text of front document -
导出/导入书签 → Safari 支持
bookmarks list对象,可直接遍历;Chrome 不暴露书签 API,只能靠模拟菜单点击(System Events)+ 用户手动配合 -
全局快捷键打开指定网页 → 两者都可用
open location "https://...",Chrome 更稳定;Safari 若已运行则复用窗口,更省资源

















