AppleScript执行do JavaScript返回missing value问题求助
问题原因及修复方案
- 语法错误:
do JavaScript命令需要将待执行的JS代码作为参数直接跟在命令后,原代码中将JS字符串单独拆成了一行,AppleScript将其识别为完全无关的独立语句,导致do JavaScript实际没有执行任何有效代码,返回默认的missing value。 - JS代码存在语法错误:原代码在JS注释里用了
#,而JS的单行注释应为//,非法的注释符号会导致JS执行失败,无返回值。 - 全局变量作用域问题:在自定义处理器
isEmptyDue中修改全局变量doJavaStuff,需要在处理器内部先声明该变量为全局变量,否则AppleScript会将其识别为局部变量,外部的全局变量不会被赋值。 - DOM更新延迟问题:点击按钮触发日期加载是异步操作,点击后立即读取日期输入框的值,可能页面还没完成赋值,会读到空值。
修正后代码(兼容性更强,适配所有Safari版本)
global emptyDue, serviceDate, doJavaStuff set emptyDue to " " set doJavaStuff to " " set serviceDate to "2021-11-30" on isEmptyDue() -- 声明要修改的是全局变量 global doJavaStuff tell application "Safari" to tell document 1 -- 先执行点击操作加载日期 do JavaScript "document.getElementById('trgUseNext').click();" -- 延迟0.1秒等待DOM更新,若加载较慢可适当调大数值 delay 0.1 -- 单独执行读取操作获取日期值 set doJavaStuff to do JavaScript "document.getElementById('inspDate').value;" return doJavaStuff end tell end isEmptyDue set emptyDate to isEmptyDue() display dialog emptyDate log doJavaStuff log emptyDate
注意事项
运行前请确认Safari已开启AppleScript执行JS的权限:打开Safari设置→高级→勾选「在菜单栏中显示开发」,再点击开发菜单→勾选「允许Apple事件中的JavaScript」即可。
内容的提问来源于stack exchange,提问作者improbablyconfused
相关产品推荐
相关产品推荐

