【问题标题】:Speed up AppleScript UI scripting?加快 AppleScript UI 脚本编写速度?
【发布时间】:2014-01-21 22:20:19
【问题描述】:

我将 NetShade 用作代理服务,并认为我可以尝试自动在不同代理之间切换,作为我的第一个 AppleScript 脚本的良好开端。

NetShade 应用不支持 AppleScript,所以我必须使用 UI 脚本。经过几次尝试(以及此处的一些帖子)后,我设法拥有了一个脚本,该脚本通过菜​​单栏项切换代理(这是其中的picture,因为由于声誉限制,我无法将其内联发布)。

不幸的是,我的代码非常慢(≈6 秒),这使得它作为脚本有点不切实际。第一个菜单会立即打开,但子菜单和代理服务器的选择需要几秒钟的时间。

我正在使用以下代码:

set theProxy to "Netshade US 4"
tell application "System Events" to tell process "NetShade"
    tell menu bar item 1 of menu bar 2
        click
        tell menu item "NetShade Proxy" of menu 1
            click
            tell menu item theProxy of menu 1
                click
            end tell
        end tell
    end tell
end tell

我已经尝试添加 ignoring application responses,就像在另一个线程 (link) 中建议的那样,但这没有帮助。

最后我的问题是: 有没有办法加快这个过程?也许甚至可以在后台执行所有这些操作,而不显示菜单项?

P.S.:我运行的是 OS X 10.9.1

【问题讨论】:

  • NetShade 应用程序是否有任何控制台版本...或通过某种方式从终端访问其命令?
  • @summea 遗憾的是没有!它只有菜单栏项和常规窗口...
  • 如果没有类似的东西,也没有 AppleScript 支持,它可能会暂时离开你当前的 UI 脚本选项(或类似的东西......)......除非,正如你提到的,有一种在后台模拟 GUI 事件的方法(这很酷;我还没有在 Mac OS X 中看到过那种东西……:)
  • @summea 还是谢谢!有其他人知道我当前脚本的调整或其他什么可以加快它的速度吗?
  • 您是否需要连续点击,即只有在您第一次点击祖先菜单时才会填充目标菜单?如果没有,您可以尝试仅使用单击。大型菜单结构通常会导致缓慢的 GUI 脚本编写——是这种情况吗?也许有另一种编写脚本的方法,例如通过菜单栏的额外图标(或者您当前的代码就是这样做的?)。

标签: applescript


【解决方案1】:

修复总结

要消除延迟,您需要做两件事:

(I) 识别导致延迟的点击并仅将该行包含在ignoring application responses 块中,如下所示。在我的例子中,它是click bt,之后执行进入等待模式 5 到 6 秒。

  ignoring application responses
        click bt
  end ignoring

(II) 然后我还必须使用以下命令杀死系统事件并重新启动它。

  do shell script "killall System\\ Events"
  delay 0.1  
  -- Rest of the code to click stuff or send keycodes

这解决了延迟问题。


详情

我在创建脚本以通过 AppleScript 连接/断开蓝牙耳机时遇到了同样的问题。脚本如下。

tell application "System Events" to tell process "SystemUIServer"
    set bt to (first menu bar item whose description is "bluetooth") of menu bar 1
    click bt
    tell (first menu item whose title is "SBH80") of menu of bt
        click
        tell menu 1
            if exists menu item "Disconnect" then
                click menu item "Disconnect"
            else
                click menu item "Connect"
            end if
        end tell
    end tell
end tell

脚本运行良好,但在执行上面的“click bt”后会等待 5 到 6 秒。我修改了代码如下,现在它工作得非常好,没有任何延迟。

tell application "System Events" to tell process "SystemUIServer"

    set bt to (first menu bar item whose description is "bluetooth") of menu bar 1
    ignoring application responses
        click bt
    end ignoring
end tell

do shell script "killall System\\ Events"
delay 0.1
tell application "System Events" to tell process "SystemUIServer"

    tell (first menu item whose title is "SBH80") of menu of bt
        click
        tell menu 1
            if exists menu item "Disconnect" then
                click menu item "Disconnect"
            else
                click menu item "Connect"
            end if
        end tell
    end tell
end tell

【讨论】:

  • 哇。我添加了这个,它神奇地摆脱了延迟。关于为什么的任何想法?我假设它会缓存来自第一个系统事件调用的信息,然后未来的使用会更快?
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 2012-07-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2022-12-03
  • 1970-01-01
相关资源
最近更新 更多