Applescript: espere a que aparezca/desaparezca la ventana/diálogo

Estoy programando iTunes y me encontré con dos problemas cuando, en un paso de mi secuencia de comandos, necesito verificar si se muestran ventanas/diálogos o no.

  1. De acuerdo con ¿Esperando hasta que exista una ventana en Applescript? este debería ser un código válido

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

pero cuando lo compilo, aparece este mensaje de error "Se esperaba el final de la línea pero se encontró """ (" se refiere al " antes de la E en Evernote). ¿Por qué? Esa pregunta tiene 2,5 años, ¿ha cambiado algo desde entonces? Estoy ejecutando OS X 10.11.

  1. Puedo usar este código para verificar si la ventana de información de la canción está abierta en iTunes

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

pero cuando trato de buscar en Abrir diálogo con una línea similar

repeat until (exists window "Open")

la ventana no se detecta. He usado el Inspector de accesibilidad para obtener algunas propiedades de la ventana Información de la canción y el cuadro de diálogo Abrir y las únicas diferencias que he notado son el nombre y el tipo. Información de la canción es una "ventana", mientras que Abrir es un "diálogo". Por lo tanto, también probé estas dos variaciones en el código anterior:

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

pero ninguno de ellos compila.

¿Cómo detecto el cuadro de diálogo Abrir?

Me acabo de dar cuenta de que si inspecciono un cuadro de diálogo Abrir en iTunes, su tipo es "diálogo", pero si inspecciono un cuadro de diálogo Abrir en Script Editor, su tipo es "ventana".
Si el código de ejemplo en mi respuesta no aborda el "Diálogo abierto" al que se refiere, edite su pregunta para reflejar mejor exactamente qué es lo que está tratando de hacer.

Respuestas (1)

La razón por la que está obteniendo " Error de sintaxis esperado al final de la línea pero encontró """." cuando lo usa repeat until window "Print" of process "Evernote" existses porque lo está usando fuera del contexto de la aplicación que llama. Puede decir significado, dentro del contexto de la aplicación que llama, no entiende el comando y el Editor de AppleScript no está tan bien escrito para expresar lo que realmente significa el error.

De todos modos, el código de ejemplo a continuación, cuando se ejecuta en ScriptEditor, por sí mismo, esperará para mostrar "¡Tu espera ha terminado!" cuadro de diálogo hasta que se abra iTunes y presione Oo haga clic en Archivo > Agregar a la biblioteca... en el menú de iTunes .

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
  • Tenga en cuenta el uso del delay comando dentro del repeat bucle . Obviamente, el valor se puede establecer en otra cosa, incluso fracciones de segundo , sin embargo, siempre debe usar un retraso para evitar que los eventos del sistema activen innecesariamente el bucle cientos de veces por segundo hasta que se cumpla la condición .

Como regla general, descubrí que cada vez que estoy usando un código que tiene ... process ...o ... application process ...es una llamada realizada por Eventos del sistema y , como tal, en este caso de uso, el ciclo debe estar dentro de una declaración o bloque de Eventos del sistema en para no obtener el error mencionado en su OP. repeat tell

Gracias y gracias por su regla general. Tiene mucho sentido cuando se señala así. Curiosamente, necesitaba agregar Preferencias del sistema del Editor de secuencias de comandos -> Seguridad y privacidad -> Accesibilidad cuando agregué el bloque "decir eventos del sistema".
Sin embargo, aún no he terminado: esto »repetir hasta (existe la ventana "Agregar a la biblioteca" del proceso de aplicación "iTunes")» funciona bien, pero cuando le agrego un "no": »repetir hasta que (no existe la ventana "Agregar To Library" del proceso de aplicación "iTunes")» el código no se compila con una advertencia y se niega a ejecutarse con la misma advertencia "Can't get not (existe window "Song info"). Acceso no permitido". ¿Qué acceso se requiere para que funcione este caso negativo?
@db, use el formato de código adecuado , un acento grave '`', no '»' al expresar el código en un comentario, ya que facilita la lectura.
@db, en mi código de ejemplo , cambiar repeat until (exists window "Add To Library" of application process "iTunes") a repeat until (not (exists window "Add To Library" of application process "iTunes")) funciona para mí. Dicho esto, cada vez que busque ayuda para depurar el código , siga Cómo crear un ejemplo mínimo, completo y verificable para permitirnos reproducir el problema tal como lo encontró. De lo contrario, tenemos que adivinar el contexto del problema y eso no es propicio para dar respuestas de calidad.
@db, por cierto, en mi código de ejemplo , cambiar el repeat ciclo también repeat until (not (exists window "Song Info" of application process "iTunes"))funciona para mí.
@db, también puede usar, por ejemplo:repeat while not (exists window "Song Info" of application process "iTunes")