Erreurs de valeur manquantes lorsque vous utilisez fortement JavaScript dans Safari par Applescript

Désolé pour le titre éventuellement confus.

Mon problème est que j'aimerais télécharger les outils de ligne de commande Apple pour XCode sans avoir à cliquer sur les boutons simples. Je souhaite utiliser ceci pour une configuration plus rapide des nouveaux postes de travail de développeur combinés avec Chef.

Le script et l'erreur sont les suivants:

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 

Mises à jour pour le script et les erreurs sur lesquelles je suis impliqué: https://gist.github.com/1993352

Le Javascript sur la ligne 17 est correctement exécuté et je vois un message d'alerte. L'une des autres lignes n'est pas exécutée comme prévu.

Comment puis-je que cela fonctionne et le Javascript actuel n'est-il pas exécuté sauf pour cette ligne?

Comme @Jordan indiqué ci – dessus , la missing value renvoyée par do JavaScript n'indique pas d'erreur. Cependant, votre code souffre de quelques problèmes qui l'empêchent de fonctionner:

  1. Il n'attend pas que la page se charge complètement avant d'essayer d'accéder au formulaire – d'où vos affectations de value et submit() appel dans le vide. Vous pouvez aller à la fantaisie et essayer d'attendre un nom de fenêtre correspondant, mais un delay simple le fera;
  2. Il essaie d'inspecter le contenu du texte de tous les éléments trouvés ( atags.textContent ) au lieu de l'actuel en boucle ( atags[i].textContent );
  3. Il essaie de déclencher un événement de click en appelant la méthode click() , que la plupart des navigateurs refusent de faire, ostensiblement pour des raisons de sécurité (voir cette question et réponse à moi ). Comme Apple n'inclut pas jQuery, le problème n'est pas aussi simple à contourner que dans la réponse à laquelle j'ai lié – vous pouvez, cependant, simuler l'événement de clic avec un peu de code avec la permission de Protolicious ' event.simulate.js .

Le code suivant fera ce que vous avez demandé:

 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 

Testé avec mon propre compte; Le téléchargement du plus récent paquet Xcode Command Line Tools (pour être précis – toplist) a débuté avec succès.