Applescript在Safari中大量使用Javascript时缺少值错误

时间:2012-03-07 14:28:34

标签: javascript macos safari applescript

对于可能令人困惑的标题感到抱歉。

我的问题是我想下载Apple的XCode命令行工具,而无需点击单个按钮。我希望使用它来更快地设置与Chef相结合的新开发人员工作站。

脚本和错误如下:

tell application "Safari"
    make new document at end of every document --> document "Ohne Titel"
    set URL of document 1 to "https://developer.apple.com/downloads/index.action"
    get name of document 1 --> "Ohne Titel"
    do JavaScript "var head= document.getElementsByTagName('head')[0];
                   var script= document.createElement('script');
                   script.type= 'text/javascript';
                   script.src= 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
                   head.appendChild(script);" in document 1 --> missing value
    do JavaScript "alert('test')" in document 1 --> missing value
    do JavaScript "document.forms['appleConnectForm']['accountname'].value = 'somename'" in document 1 --> missing value
    do JavaScript "document.forms['appleConnectForm']['accountpassword'].value = 'somepassword'" in document 1 --> missing value
    do JavaScript "document.appleConnectForm.submit();" in document 1 --> missing value
    do JavaScript "var atags = document.getElementsByTagName('a')" in document 1 --> missing value
    do JavaScript "for (var i=0; i<atags.length; i++){ if (atags.textContent=='Command Line Tools for Xcode'){ atags[i].click(); } }" in document 1 --> missing value
    set name of window 1 to "Ohne Titel"
end tell

我在此处遇到的脚本和错误的更新:https://gist.github.com/1993352

第17行的Javascript正确执行,我看到一条警告消息。任何其他行都没有按预期执行。

我怎样才能使这个工作正常,除了这一行之外,当前的Javascript是否未被执行?

1 个答案:

答案 0 :(得分:3)

正如@Jordan所说abovemissing value返回的do JavaScript并不表示错误。但是,您的代码会遇到一些阻止其工作的问题:

  1. 在尝试访问表单之前,它不会等待页面完全加载 - 因此您的value分配和submit()调用将进入无效状态。您可以尝试并尝试等待匹配的窗口名称,但只需要一个简单的delay;
  2. 它会尝试检查所有找到的元素(atags.textContent)的文本内容,而不是当前循环的元素(atags[i].textContent);
  3. 它试图通过调用大多数浏览器拒绝执行的click方法来触发click()事件,表面上是出于安全原因(请参阅this questionanswer of mine)。由于Apple不包含jQuery,因此回答问题并不像我链接的答案那样简单 - 但是,您可以使用Protolicious'event.simulate.js提供一些代码来模拟click事件。
  4. 以下代码将按您的要求执行:

    tell application "Safari"
        set loadDelay to 2 -- in seconds; test for your system
        make new document at end of every document
        set URL of document 1 to "https://developer.apple.com/downloads/index.action"
        delay loadDelay
        do JavaScript "_connectForm = document.forms.appleConnectForm;
                       _connectForm.accountname.value = 'your_accountname';
                       _connectForm.accountpassword.value = 'your_accountpassword';
                       _connectForm.submit();" in document 1
        delay loadDelay
        do JavaScript "var _atags = document.querySelectorAll('a');
                       for (var i=0; i<_atags.length; i++){ 
                           if (_atags[i].innerText.indexOf('Command Line Tools for Xcode') === 0){ 
                               _event = document.createEvent('MouseEvents');
                               _event.initMouseEvent('click', true, true, document.defaultView, 0, 0, 0, 0, 0, false, false, false, false, 0, _atags[i]);
                               _atags[i].dispatchEvent(_event);
                               break;
                           }
                       }" in document 1
    end tell
    

    使用我自己的帐户进行测试;下载最新的Xcode Command Line Tools软件包(确切地说 - 最上面列出的)已成功启动。