¿Por qué este Applescript falla a menudo la primera vez, pero siempre funciona después de eso?

1

El siguiente Applescript abre una aplicación de barra de menú llamada QuickHue y luego hace clic en un elemento específico en el menú. A menudo, cuando uso el manzano, no hace nada. Pero si espero un momento o dos y vuelvo a intentarlo, funciona perfectamente. Y sigue funcionando. Pero si pasa un tiempo y lo vuelvo a activar, la primera vez fallará. Después de eso, funciona como un campeón. Aquí está la manzana. ¿Alguna idea de lo que está pasando aquí?

ignoring application responses
    tell application "System Events" to tell process "QuickHue"
        click menu bar item 1 of menu bar 1
    end tell
end ignoring
do shell script "killall System\ Events"
delay 0.1
tell application "System Events" to tell process "QuickHue"
    tell menu bar item 1 of menu bar 1
        click menu item 2 of menu 1
    end tell
end tell
    
pregunta 2oh1 08.07.2013 - 06:58

2 respuestas

0

Tal vez pueda escribir un bucle que haga un seguimiento de si el script ha tenido éxito o no y lo sigue intentando hasta que lo haya hecho (o haya transcurrido una cantidad de tiempo límite). Si, de hecho, el problema es que los eventos del sistema no se han iniciado por completo, entonces el bucle podría pedir eventos del sistema si los eventos del sistema de la aplicación se están ejecutando. Aquí hay una función simple que podrías usar:

on appIsRunning(appName)
    tell application "System Events" to (name of processes) contains appName
end appIsRunning

Para asegurarse de que se haya iniciado completamente, puede implementar su retraso después del ciclo.

Así es como se vería la función de bucle:

on startApp(appName)
    set IsRunning to false
    set tries to 20
    repeat until (IsRunning is true or tries is 0)
        set IsRunning to appIsRunning(appName)
        set tries to (tries - 1)
        delay 0.1
    end repeat
end startApp

O, quizás tenga otra forma de determinar la ejecución exitosa del script ... ¿hay algún estado que pueda verificar para determinar el éxito? Si es así, podría realizar un bucle hasta que se cumpla esa condición en lugar de saber si los eventos del sistema se han iniciado.

Otra cosa es que no sé si los eventos del sistema tienen que "registrarse" con applecript antes de que se active un applecript para que funcione. Si lo hace, entonces puedes intentar esto: puedes crear un script de ayuda separado que inicie los eventos del sistema y luego ejecute tu script de esta manera:

startApp("System Events")
set myApp to "/Users/whatever/myScriptAsApp.app"
do shell script "open " & quoted form of POSIX path of myApp & " 2>&1 &"

Déjame saber cómo va. Con frecuencia tengo el mismo problema que tú con un par de mis scripts. Simplemente no he probado esto todavía.

buena suerte, Rob

    
respondido por el hepcat72 13.08.2013 - 15:19
1

Tienes razón, no lo probé lo suficientemente bien. El error se mostraba cuando System Events no se estaba ejecutando. Como otra solución, agregué launch application "System Events" y delay 0.2 al inicio:

launch application "System Events"
delay 0.2
ignoring application responses
    tell application "System Events" to tell process "QuickHue"
        click menu bar item 1 of menu bar 1
    end tell
end ignoring
do shell script "killall System\ Events"
delay 0.1
tell application "System Events" to tell process "QuickHue"
    tell menu bar item 1 of menu bar 1
        click menu item 2 of menu 1
    end tell
end tell

Si aún no funciona, intente aumentar los retrasos.

    
respondido por el user495470 08.07.2013 - 20:01

Lea otras preguntas en las etiquetas