【问题标题】:Applescript: Safari "Do Javascript" No Longer Returns Booleans?Applescript:Safari“Do Javascript”不再返回布尔值?
【发布时间】:2021-12-20 17:26:34
【问题描述】:

这用于返回真或假:

tell application "Safari" to do JavaScript "document.querySelector(\"video\") == null" in document 1

但是,现在,在 M1 MBP 上的 macOS 12.0.1 上,它似乎没有返回任何内容(缺失值),并且似乎需要以下复杂的包装器来获得前一个结果:

tell application "Safari"
    set result to do JavaScript "if (document.querySelector(\"video\") == null) {
   1
} else {
   0
}" in document 1
    return result is 1
end tell

另一个奇怪的事情是它只有布尔值不会被返回。以下返回3.0

tell application "Safari" to do JavaScript "3" in document 1

知道发生了什么变化吗?有没有更好的方法来取回布尔结果?

以下是我的 Safari 开发选项卡的外观,以防其中任何设置相关:

【问题讨论】:

  • 我刚刚在 macOS Monterey 12.0.1 中测试了 tell application "Safari" to do JavaScript "document.querySelector(\"video\") == null" in document 1,它返回了一个 boolean
  • 感谢您的检查。奇怪。 @user3439894 你是怎么运行它的?
  • 随着 Safari 打开到默认的 window 只显示 Favorites,我之前从您的问题中复制了它并将其粘贴到 Script Editor 中的新 document 中,然后按 ⌘R。在 Result pane 中它返回了true
  • 脚本编辑器添加到系统偏好设置 > 安全和隐私 > 隐私 >在 Safari 中的 Develop menu 上选中的 AccessibilityAllow JavaScriptSOP 因为没有它的功能太有限了。
  • 我有同样的问题,但我在 12.1。我有提到的权限集。我已经通过将我的通用处理程序分为 2 来解决它。 1. 在 runScriptPlain(scriptText) 上 - 如果没有预期返回,则打算使用 orig 实现,以及 2. 在 runScript(scriptText) set montereyFix to "var jsresult = (" & scriptText & ");if (typeof(jsresult) === 'boolean') { jsresult ? 'true' : 'false'} else jsresult;" runScriptPlain(montereyFix) 上。布尔结果现在是“真”或“假”。

标签: javascript applescript macos-monterey


【解决方案1】:

我仍然不知道为什么会出现此问题,但这里有一个临时解决方法以防万一:

tell application "Safari"
    
    set result to do JavaScript "try {
    var jsResult = document.querySelector(\"video\").paused;

    switch (jsResult) {
    case true:
        jsResult = 'js2as-true';
        break;
    case false:
        jsResult = 'js2as-false';
    }
jsResult
}
catch(err) {
'js2as-error' + err.message
}" in document 1
    
    if (result = "js2as-true") then
        return true
    else if (result = "js2as-false") then
        return false
    else if (result starts with "js2as-error") then
        set errMsg to text 12 thru -1 of result
        error errMsg
    else
        return result
    end if
end tell

一个限制是很难进行通用化,因为您需要显式存储来自适当语句的返回值。另一种方法可能是将脚本插入到匿名函数中,但是您必须明确地return aValue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 2013-01-03
    • 1970-01-01
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2020-07-29
    相关资源
    最近更新 更多