4 votes

Aide AppleScript : Attendre le chargement d'une page Safari

J'essaie de créer un script pour ouvrir l'URL csbsju.instructure.com dans Safari, attendre que la page se charge complètement, cliquer sur le bouton de connexion, puis vérifier deux fois si l'URL est correcte (il y a un bug qui ajoute la barre latérale du tableau de bord, donc je vérifie juste l'URL et si elle est incorrecte, je redirige la page. La saisie des informations d'identification est gérée par la fonction Mot de passe iCloud de Safari, je n'ai donc pas à m'en soucier. Le gros problème que je rencontre est l'attente jusqu'à ce que la page soit chargée. J'ai cherché un peu partout et j'essaie actuellement d'utiliser ce code, mais il ne fonctionne pas :

tell application "Safari"
    activate
    delay 1
    repeat
        if (do JavaScript "document.readyState" in document 1) is "complete" then exit repeat
        delay 1
    end repeat
    delay 1
end tell

J'utilise actuellement ce script pour cliquer sur le bouton de connexion et vérifier si l'URL est correcte :

tell application "Safari"
    set theURL to URL of front document

    tell front document
        do JavaScript "document.getElementById('btnLogin').click()"
    end tell

    set theURL to URL of front document
    if (theURL = "https://csbsju.instructure.com/dashboard-sidebar") then
        tell application "Safari" to set the URL of the front document to "https://csbsju.instructure.com"
    end if
end tell

Avez-vous des suggestions sur la façon d'améliorer le fonctionnement de ce système ? En particulier, la vérification du chargement de la page ?

4voto

OnePablo Points 1

Il y a plusieurs méthodes que vous pouvez utiliser pour vérifier si la page a fini de se charger. En voici une sélection avec laquelle j'ai eu de bons résultats lors de mes tests :

Nom du document

Contrôler l'existence de la Safari document qui a le même nom que le titre de la page web, qui (je crois) n'est attribué qu'une fois que la page a fini de se charger, jusqu'à ce qu'elle conserve le nom qu'elle avait auparavant, ou bien "Sans titre" s'il s'agit d'un document nouvellement créé :

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    repeat until the document named ("Central Authentication Service " & ¬
        "| College of Saint Benedict & Saint John's University") exists
    end repeat

    log "Finished loading"
end tell

El Connexion bouton

Contrôler l'existence de la "Connexion" étant donné que vous ne pouvez pas faire ce que vous devez faire tant que cet élément HTML particulier n'a pas été créé :

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    tell front document to repeat until (do JavaScript ¬
        "document.getElementById('btnLogin').id") as text is not ""
    end repeat

    log "Finished loading"
end tell

Safari 's Rechargez bouton

Surveiller les propriétés particulières de Safari 's Rechargez qui change selon qu'une page est chargement ou a chargé :

Remarque : ce document a été écrit et testé sous MacOS High Sierra ; cependant, pour MacOS Mojave, une modification mineure est nécessaire. Modifier UI element 1 to ¬ à UI element 2 to ¬ dans le code ci-dessous.

tell application "Safari" to ¬
    make new document with properties {URL:"https://csbsju.instructure.com"}

tell ¬
    application "System Events" to tell ¬
    process "Safari" to tell ¬
    window 1 to tell ¬
    toolbar 1 to tell ¬
    groups to tell ¬
    UI element 1 to ¬
    set reload_button to a reference to ¬
        (first button whose name is "Reload this page")

using terms from application "System Events"
    repeat until the accessibility description ¬
        of the reload_button ¬
        contains "Reload this page"
    end repeat
end using terms from

log "Finished loading"

Contenu de la page

Contrôler l'apparition d'un texte spécifique dans le contenu de la page. Dans ce cas, j'ai choisi de surveiller l'ensemble du texte, mais vous pouvez choisir des éléments plus petits à la place. Les éléments qui apparaissent vers la fin de la page sont les plus appropriés :

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    ignoring white space
        tell front document to repeat until its text contains ¬
            "Central Authentication Service Network Username: " & ¬
            "Password: Warn me before logging me into other sites. " & ¬
            "Copyright © 2017 - All Rights Reserved College of Saint " & ¬
            "Benedict and Saint John's University"
        end repeat
    end ignoring

    log "Finished loading"
end tell

Nom d'utilisateur : & Mot de passe champs

Puisque ces champs sont remplis automatiquement par Safari (ce qui ne se produit qu'après le chargement complet de la page), vous pouvez surveiller le contenu textuel de la balise Nom d'utilisateur : y Mot de passe champs :

tell application "Safari"
    make new document with properties {URL:"https://csbsju.instructure.com"}

    tell front document to repeat
        set a to (do JavaScript "document.getElementById('username').value") as text
        set b to (do JavaScript "document.getElementById('password').value") as text

        if length of (a & b) != 0 then exit repeat
    end repeat

    log "Finished loading"
end tell

0 votes

Vous avez bien couvert les bases, j'ai utilisé à la fois le bouton de connexion et de rechargement dans certains de mes scripts et je trouve ces méthodes assez solides pour mon utilisation. Je suggérerais d'ajouter un delay commande au sein de la repeat boucles . Sans cela, des centaines d'appels inutiles peuvent être effectués en gaspillant les cycles du processeur et en faisant tourner les ventilateurs, alors que l'utilisation d'un délai peut les réduire à quelques appels. Le code du bouton de rechargement a tourné en boucle 295 fois tel qu'écrit, et 5 fois avec un retard de delay 1 ajouté. Cela variera bien sûr considérablement en fonction de la charge globale du système, de la vitesse du système et de la vitesse de la connexion.

0 votes

@user3439894 Oui, vous avez raison, et j'en suis conscient. Je pense que je n'ai toujours pas trouvé mon pied en ce qui concerne l'expression d'une clause de non-responsabilité indiquant que ce sont des scripts illustratifs pour démontrer une méthode. Je remarque que vous décrivez toujours vos contributions comme exemple scripts et avoir un solide addendum indiquant que Traitement des erreurs y retards peut être nécessaire à la discrétion de l'utilisateur, etc. Je dois être plus cohérent en faisant de même.

1 votes

CJK, j'ai modifié votre réponse en ajoutant une note dans la section "Bouton de rechargement de Safari" pour une utilisation sous MacOS Mojave.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X