1 votes

Safari - AppleScript ne permet pas de passer à la section suivante d'un livre en ligne (bookdown)

J'écris un script pour imprimer une section d'un bookdown livre en ligne au format PDF, puis passer à la section suivante, et ainsi de suite.

La partie imprimée fonctionne (les codes clés sont ceux de cette page ) :

tell application "Safari"

    activate

    tell application "System Events"
        key code 35 using command down -- activate print menu item
    end tell

    delay 0.5

    set i to 0
    repeat while i < 15
        set i to i + 1
        delay 0.1
        tell application "System Events"
            key code 48 -- press tab 15 times
        end tell
    end repeat

    tell application "System Events"
        key code 49 -- press space
    end tell

    set i to 0
    repeat while i < 2
        set i to i + 1
        delay 0.1
        tell application "System Events"
            key code 125 -- press down key twice
        end tell
    end repeat

    tell application "System Events"
        key code 36 -- enter
    end tell

    set i to 0
    repeat while i < 16
        set i to i + 1
        delay 0.1
        tell application "System Events"
            key code 125 -- press tab to get to "save"
        end tell
    end repeat

    tell application "System Events"
        key code 36 -- enter to cleck on save
    end tell

end tell

Problème

Maintenant que j'ai imprimé la section actuelle et que je suis de retour sur Safari, je peux cliquer manuellement sur la flèche droite et passer à la section suivante, mais je n'arrive pas à avoir le script pour le faire.

J'ai essayé d'ajouter ce qui suit au script ci-dessus :

tell application "System Events"
        key code 124 -- right arrow to enter the next page
    end tell

Ou même de "rouvrir" Safari, mais rien ne se passe.

tell application "Safari"

    activate

    tell application "System Events"
        key code 124 -- right arrow to move to the next section
    end tell

end tell

Comment faire pour qu'AppleScript "tourne la page" et passe à la section suivante ?

Je suis également ouvert aux suggestions d'amélioration du script ! Je me demande s'il serait facile d'éviter de répéter "tab" 15 fois. J'ai consulté l'inspecteur d'accessibilité et j'ai constaté que "PDF" dans le menu d'impression correspond à NSPopUpButtonCell . J'ai essayé d'utiliser select NSPopUpButtonCell of its sheet mais cela n'a pas fonctionné.

1voto

user3439894 Points 52496

Je peux cliquer manuellement sur la flèche de droite et passer à la section suivante, mais je n'arrive pas à avoir le script pour le faire.

Comment faire pour qu'AppleScript "tourne la page" et passe à la section suivante ?

Si vous essayez de cliquer par programme sur le bouton flèche droite comme le montre l'image ci-dessous, puis ce qui suit exemple AppleScript code peut le faire :

tell application "Safari" to ¬
    tell document 1 to ¬
        do JavaScript ¬
            "document.getElementsByClassName('fa fa-angle-right')[0].click();"

Notes :

Pour ce faire, il faut Autoriser le JavaScript dans les événements Apple à vérifier sur le site caché Développer menu.

Pour dévoiler ce qui est caché Développer menu :

  • Safari > Préférences > Avancé > [Afficher le menu Développer dans la barre de menu

enter image description here


Mise à jour de l'adresse :

Les suggestions pour améliorer le script sont également les bienvenues ! Je me demande s'il serait facile d'éviter de répéter "tab" 15 fois.

Voici comment j'utiliserais la fonction JavaScript et codé pour éviter d'utiliser le key code et ou keystroke Événements du système commandes , en particulier tabulation autour de la UI .

Exemple AppleScript code :

tell application "System Events"

    tell application process "Safari"

        set frontmost to true

        set i to 0
        repeat until (its frontmost = true)
            delay 0.1
            set i to i + 1
            if i  20 then return
        end repeat

        click menu item "Print…" of ¬
            menu 1 of ¬
            menu bar item "File" of ¬
            menu bar 1

        tell its front window

            set i to 0
            repeat until (exists menu button "PDF" of sheet 1)
                delay 0.1
                set i to i + 1
                if i  20 then return
            end repeat

            click menu button "PDF" of sheet 1

            set i to 0
            repeat until (exists menu item "Save as PDF" of ¬
                menu 1 of menu button "PDF" of sheet 1)
                delay 0.1
                set i to i + 1
                if i  20 then return
            end repeat

            click menu item "Save as PDF" of ¬
                menu 1 of ¬
                menu button "PDF" of ¬
                sheet 1

            set i to 0
            repeat until (exists button "Save" of sheet 1 of sheet 1)
                delay 0.1
                set i to i + 1
                if i  20 then return
            end repeat

            click button "Save" of sheet 1 of sheet 1

            set i to 0
            repeat while (exists sheet 1)
                delay 0.1
                set i to i + 1
                if i  100 then return
            end repeat

        end tell    
    end tell
end tell

tell application "Safari" to ¬
    tell document 1 to ¬
        do JavaScript ¬
            "document.getElementsByClassName('fa fa-angle-right')[0].click();"

Notes :

Étant donné que ce type de AppleScript script utilise Script de l'interface utilisateur J'ai inclus un traitement des erreurs sous la forme d'un repeat boucle d'attendre jusqu'à deux secondes pour que la cible UI element pour la plupart des objectifs, mais le dernier objectif a été atteint. repeat boucle attend plus longtemps parce qu'il doit attendre que le Enregistrer en PDF à compléter. Un simple delay commande avec un valeur pourrait être utilisé à la place, mais avec un retard d'un dixième de seconde dans la transmission de l'information. repeat boucles Il ne devrait pas avoir à attendre plus longtemps que nécessaire. En d'autres termes, je n'utiliserais que de simples delay commande si je veux ralentir la script de l'histoire des différents événements de l'année UI . Il est peu probable qu'il faille l'ajuster, mais il est évident qu'il faut le faire si nécessaire.

Si le délai d'attente est atteint, le script se termine à ce moment-là sans message d'erreur. La ligne unique if i 20 then return déclarations peut être transformée en une if bloc et inclure un message d'erreur via l'option dialogue d'affichage , afficher l'alerte ou affichage de la notification commande comme souhaité.

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