访问"隐藏" AppleScript中的窗口

时间:2014-09-05 14:25:46

标签: macos applescript

我试图设置一个AppleScript,它会为我处理一个稍微恼人的VPN登录过程。我使用Cisco AnyConnect,每次我必须重新登录时,我必须点击连接,接受证书警告,输入我的用户名,密码,然后选择正确的组,并接受另一个证书警告。

第二次证书警告我似乎无法绕过。

一些挖掘表明警告对话框由名为vpndownloader的进程拥有,但奇怪的是 Applescript似乎确信它没有窗口且不存在!

我一直在使用辅助功能检查器获取窗口ID等,以使此脚本正常工作。对于这个特定的对话框,它看起来像这样(我尝试控制的实际对话框后面的辅助功能检查器)

enter image description here

当我试图获取窗口的ID以便我可以用它做事时,这种陌生感就出现了。

tell application "System Events" to windows of process "vpndownloader"

{}

空白。好的,也许这个过程的属性有用吗?

tell application "System Events" to properties of process "vpndownloader"

{has scripting terminology:false
 bundle identifier:"com.yourcompany.vpndownloader"
 file:alias "Macintosh HD:opt:cisco:anyconnect:bin:vpndownloader.app:" of application "System Events"
 creator type:"????"
 subrole:missing value
 entire contents:{}
 selected:missing value
 application file:alias "Macintosh HD:opt:cisco:anyconnect:bin:vpndownloader.app:" of application "System Events"
 orientation:missing value
 role:"AXApplication"
 accepts high level events:true
 file type:"APPL"
 value:missing value
 position:missing value
 id:1212712
 displayed name:"vpndownloader"
 name:"vpndownloader"
 class:application process
 background only:true
 frontmost:false
 size:missing value
 visible:false
 Classic:false
 partition space used:0
 role description:"application"
 maximum value:missing value
 architecture:"i386"
 short name:"vpndownloader"
 focused:missing value
 minimum value:missing value
 help:missing value
 title:"vpndownloader"
 accepts remote events:false
 total partition size:0
 description:"application"
 accessibility description:missing value
 enabled:missing value
 unix id:9053}

(对于咯咯笑,请注意思科没有设置他们的捆绑标识符。)

没有内容,没有可见的窗口。尽管有对话,我还是站在我面前。

所以,一方面它显然有一个窗口(辅助功能检查员可以看到它),但AppleScript确信它没有。

如何以编程方式定位和访问此"幻像"对话框?

没有用的东西:

tell application "vpndownloader" to windows

error "vpndownloader got an error: Can’t get every window." number -1728 from every window

此应用程序的主题再次出现在存在与不存在之间的奇怪状态

tell application "vpndownloader" to properties

error "vpndownloader got an error: Can’t get every property." number -1728 from every property

它有一个菜单栏,但没有窗口。

tell application "System Events" to get UI elements of process "vpndownloader"

{menu bar 1 of application process "vpndownloader" of application "System Events"}

3 个答案:

答案 0 :(得分:1)

你可以只使用击键。例如,当那个窗口出现时,你自己可能会在物理上击中"连接"按钮首先按下"标签"键更改聚焦按钮,然后按"空格键"选择聚焦按钮。

注意:您可能必须通过启用全键盘访问来启用此功能。通过转到系统首选项 - >键盘 - >快捷方式并检查"所有控件"来执行此操作在窗口的底部。

如果可以,那么你可以使用它。只要在发出命令时该窗口位于最前面,以下内容就会起作用。

tell application "System Events"
    keystroke tab
    delay 0.2
    keystroke space
end tell
祝你好运。

答案 1 :(得分:0)

它适用于我(我使用anyconnect 3.1.06073)。

https://gist.github.com/lotreal/ce43f4a85d8ae73781fa

答案 2 :(得分:0)

所以我找到了一个不涉及脚本的问题的有趣解决方法。事实证明vpndownloader完全是可选的,显然only serves the purpose of updating the client when an update is pushed from the upstream server

可以定义本地策略XML以禁用该过程。如果按下更新(连接将中止),这将导致破坏,但它至少允许登录脚本。

在Mac / Linux系统上,此文件位于/opt/cisco/anyconnect/AnyConnectLocalPolicy.xml - I had to create one中,基于同一文件夹中的架构文件AnyConnectLocalPolicy.xsd。如果它已经存在,只需编辑现有的。

关键字是<BypassDownloader>,默认设置为false。将其设置为true意味着下载器根本不运行,这意味着我试图访问的第二个对话框根本就不会出现!