Ошибки недостающего значения при интенсивном использовании Javascript в Safari от Applescript - PullRequest
1 голос
/ 07 марта 2012

Извините за возможно запутанный заголовок.

Моя проблема в том, что я хотел бы загрузить Инструменты командной строки 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

Javascript в строке 17 выполняется правильно, и я вижу сообщение с предупреждением.Любая из других строк не выполняется должным образом.

Как я могу заставить это работать, и текущий Javascript не выполняется, за исключением этой одной строки?

1 Ответ

3 голосов
/ 13 апреля 2012

Как сказал @Jordan выше , missing value, возвращенное из do JavaScript, не указывает на ошибку. Однако ваш код страдает от нескольких проблем, которые мешают ему работать:

  1. он не ждет полной загрузки страницы, прежде чем пытаться получить доступ к форме - следовательно, ваши value назначения и submit() вызов переходят в пустоту. Вы можете придумать и попытаться дождаться соответствующего имени окна, но подойдет простой delay;
  2. пытается проверить текстовое содержимое всех найденных элементов (atags.textContent) вместо текущего зацикленного (atags[i].textContent);
  3. он пытается вызвать событие click, вызывая метод click(), который большинство браузеров отказывается делать, якобы по соображениям безопасности (см. этот вопрос и мой ответ ). Поскольку Apple не включает jQuery, проблема не так проста, как в ответе, с которым я связан - однако вы можете смоделировать событие click с помощью небольшого количества кода, предоставленного Protolicious 'event.simulate.js.

Следующий код сделает то, что вы просили:

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 (если быть точным - самый верхний из перечисленных) началась успешно.

...