Applescript: attendere che la finestra / il dialogo compaiano / scompaiono


2

Sto eseguendo script di iTunes e ho riscontrato due problemi quando, in una fase del mio script, ho bisogno di verificare se le finestre / finestre di dialogo sono visualizzate o meno.

  1. Secondo Aspettare fino a quando esiste una finestra in Applescript? questo dovrebbe essere un codice valido

    repeat until window "Print" of process "Evernote" exists

ma quando lo compilo ricevo questo messaggio di errore "La fine della linea prevista si trova" "" "(" si riferisce alla "prima di E in Evernote). Perché? Quella domanda ha 2,5 anni, da allora qualcosa è cambiato? Sto usando OS X 10.11.

  1. Posso usare questo codice per verificare se la finestra delle informazioni sul brano è aperta in iTunes

    repeat until (not (exists window "Song Info"))

ma quando provo a cercare la finestra di dialogo Apri con una linea simile

repeat until (exists window "Open")

la finestra non viene rilevata. Ho utilizzato Accessibility Inspector per ottenere alcune proprietà della finestra Informazioni sul brano e della finestra di dialogo Apri e le uniche differenze che ho notato sono il nome e il tipo. Song Info è una "finestra" mentre Open è una "finestra di dialogo". Quindi, ho anche provato queste due varianti sul codice precedente:

repeat until (exists dialog "Open")
repeat until (exists window dialog "Open")
repeat until (exists dialog window "Open")

ma nessuno di loro è compilato.

Come posso rilevare la finestra di dialogo Apri?


Ho appena realizzato che se ispeziono una finestra di dialogo Apri in iTunes il suo tipo è "dialog", ma se ispeziono una finestra di dialogo Apri in Script Editor, il suo tipo è "window".
d-b

Se l'esempio codice nella mia risposta non affronta la "finestra di dialogo Apri" a cui ti riferisci, quindi modifica la tua domanda per riflettere meglio esattamente cosa stai cercando di fare.
user3439894

Risposte:


2

La ragione per cui stai ricevendo " Errore di sintassi Previsto fine della linea ma trovato "" "." quando si usa repeat until window "Print" of process "Evernote" exists è perché lo stai utilizzando fuori dal contesto dell'applicazione chiamante. Si potrebbe dire il significato, nel contesto dell'applicazione chiamante, non capisce il comando e l'AppleScript Editor non è scritto bene per esprimere cosa significa realmente l'errore.

Ad ogni modo, l'esempio codice di seguito quando viene eseguito in ScriptEditor, da solo, aspetterà di visualizzare "La tua attesa è finita!" la finestra di dialogo fino a iTunes è aperto e tu premi O o clicca File & Gt; Aggiungi alla libreria ... sul iTunes menu .

tell current application
    tell application "System Events"
        repeat until (exists window "Add To Library" of application process "iTunes")
            delay 1
        end repeat
    end tell
    activate
    display dialog "Your wait is over!"
end tell
  • Notare l'uso del delay comando all'interno del repeat ciclo continuo . Ovviamente il valore può essere impostato su qualcos'altro, anche frazioni di secondo , tuttavia si dovrebbe sempre usare un ritardo per evitare Eventi di sistema da innescare inutilmente il ciclo continuo centinaia di volte al secondo fino al condizione è incontrare.

Come regola generale ho scoperto che ogni volta che sto usando codice che ha ... process ... o ... application process ... è un chiamata fatto a o di Eventi di sistema e come tale in questo caso d'uso, il repeat ciclo continuo deve essere all'interno di a tell dichiarazione o bloccare di Eventi di sistema per non ottenere il errore menzionato nel tuo OP.


Grazie e grazie per la tua regola generale. Ha molto senso quando viene indicato in questo modo. È interessante notare che avevo bisogno di aggiungere le Preferenze di Sistema di Script Editor - & gt; Sicurezza e amp; Privacy - & gt; Accessibilità quando ho aggiunto il blocco "tell system events".
d-b

Tuttavia, non ho ancora finito: questo »ripetere fino a (finestra esiste" Aggiungi alla libreria "del processo di applicazione" iTunes ")» funziona bene, ma quando aggiungo un "non" ad esso: »ripetere fino a (non esiste finestra" Aggiungi Alla libreria "del processo di applicazione" iTunes ")» il codice non viene compilato con un avviso e si rifiuta di eseguire con lo stesso avviso "Impossibile ottenere (finestra esistente" Informazioni sul brano "). Accesso non consentito." Quale accesso è necessario affinché questo caso negativo funzioni?
d-b

1
@ d-b, Si prega di usare correttamente formattazione del codice , un apice '`', non '»' quando si esprime codice in un commento in quanto rende più facile la lettura.
user3439894

@ d-b, nel mio esempio codice , mutevole repeat until (exists window "Add To Library" of application process "iTunes") a repeat until (not (exists window "Add To Library" of application process "iTunes")) per me va bene. Detto questo, ogni volta che stai cercando aiuto per il debug codice per favore Segui Come creare un esempio minimo, completo e verificabile in modo da permetterci di riprodurre il problema come lo hai incontrato. Altrimenti, dobbiamo indovinare nel contesto del problema e questo non è favorevole a fornire risposte di qualità.
user3439894

1
@ d-b, BTW Nel mio esempio codice , cambiando il repeat ciclo continuo a repeat until (not (exists window "Song Info" of application process "iTunes")) Funziona anche da me.
user3439894
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.