Observando la muestra AppleScript el código que has proporcionado...
-- Haga clic en el botón "Bandera".
set uiScript to "click UI Element \"Flag\" of group 7 of group 8 of ¬
UI Element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of ¬
splitter group 1 of window \"Long long spammy page name\" ¬
of application process \"Safari\""
Me di cuenta de que aquí no había suficiente para identificar cuál era el problema. Yo también he utilizado Automatismos "Mírame hacer" luego copió esos pasos grabados en script Editor.app .
Utilicé Automatismos "Mírame hacer" para generar un AppleScript que haga clic en el botón "Bandera". Luego pegué la "acción grabada" (el siguiente código) en script Editor.app .
-- Click the “Flag” button.
delay 4.881676
set timeoutSeconds to 2.0
set uiScript to "click UI Element \"Flag\" of group 12 of group 9 of UI Element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1 of application process \"Safari\""
my doWithTimeout(uiScript, timeoutSeconds)
on doWithTimeout(uiScript, timeoutSeconds)
set endDate to (current date) + timeoutSeconds
repeat
try
run script "tell application \"System Events\"\n" & uiScript & "\nend tell"
exit repeat
on error errorMessage
if ((current date) > endDate) then
error "Can not " & uiScript
end if
end try
end repeat
end doWithTimeout
El problema es que el código anterior es prolijo y no es fácil de entender. Pero si lo analizamos con detenimiento, podemos ver que, en cierto sentido, se puede reducir.
El siguiente código es mi versión de reescribir el código creado por Automatismos "Mírame hacer" .
tell application "System Events"
tell application process "Safari"
click UI element "Flag" of group 12 of group 9 of ¬
UI element 1 of scroll area 1 of group 1 of group 1 ¬
of tab group 1 of splitter group 1 of window 1
end tell
end tell
Por lo tanto, parece que ha registrado el título exacto de la página, que es completamente inútil. Ni siquiera puedo probar que funciona en la misma página, porque no puedo repetir la acción de marcar.
Lo que necesito averiguar es cómo genericizar esa llamada uiScript a sólo sea "mi ventana actual". Tuve la ingenua idea de que tal vez podría cambiar la referencia a la ventana 1, pero que no funcionó y mi talento limitado corrió en ese punto.
¿Existe un sustituto sencillo de "esta ventana"?
Después de repetidas pruebas de mi versión de cómo intentaba hacer clic en el botón "Bandera", pronto me di cuenta de que el problema no era con la "ventana 1", pero que 1 o más de los números de elemento se cambian (grupo 7) puede ser ahora (grupo 8) ... por ejemplo.
Por ahora, sin embargo, no necesitará usar el código anterior para hacer clic en el botón "Bandera" porque ya le proporcioné una opción alternativa que debería funcionar siempre para eso... Con el siguiente código.
En Safari seleccione "Permitir JavaScript desde eventos de Apple" en el menú Desarrollador.
Lo siguiente AppleScript debería funcionarte.
clickFlag(0) -- 0 = 1st Flag button, 1 = 2nd Flag button, etc.
on clickFlag(theNumber)
tell application "Safari"
do JavaScript "document.getElementsByClassName" & ¬
"('js-flag-post-link s-btn s-btn__link js-gps-track')[" & ¬
theNumber & "].click();" in document 1
end tell
end clickFlag
Lo bueno del método anterior es que Safari ni siquiera necesita ser la aplicación principal y el código funcionará en la pestaña visible en ese momento.
Yendo un paso más allá, lo siguiente AppleScript el código hará clic en el primer botón "Marcar" de la página y, a continuación, intentará hacer clic en la opción "Spam".
NOTA: El siguiente código AppleScript sólo está pensado para el primer mensaje de cualquier tema.
clickFlag(0) -- Clicks the "Flag" button
tell application "System Events"
tell application process "Safari"
set frontmost to true
repeat until frontmost
delay 0.1
end repeat
repeat until UI element 1 of scroll area 1 of group 1 of group 1 of ¬
tab group 1 of splitter group 1 of window 1 exists
delay 0.1
end repeat
delay 0.1 -- can probably be removed
try
click radio button 1 of group 1 of group 1 of group 2 of group 13 ¬
of group 9 of UI element 1 of scroll area 1 of group 1 of ¬
group 1 of tab group 1 of splitter group 1 of window 1
on error from offendingObject
log offendingObject
repeat with i from 1 to 20
try
click radio button 1 of group 1 of group 1 of ¬
group 2 of group i of group 9 of UI element 1 ¬
of scroll area 1 of group 1 of group 1 of ¬
tab group 1 of splitter group 1 of window 1
exit repeat
on error from offendingObject
try
click radio button 1 of group 1 of group 1 of group 2 ¬
of group i of group 8 of UI element 1 of ¬
scroll area 1 of group 1 of group 1 of ¬
tab group 1 of splitter group 1 of window 1
exit repeat
end try
end try
end repeat
end try
end tell
end tell
on clickFlag(theNumber)
tell application "Safari"
do JavaScript "document.getElementsByClassName" & ¬
"('js-flag-post-link s-btn s-btn__link js-gps-track')[" & ¬
theNumber & "].click();" in document 1
end tell
end clickFlag
Si miras mi on error from offendingObject
anterior, utilizo el comando on error from
que registrará el elemento real que desencadena el error. Por ejemplo, el resultado del registro de errores puede ser algo como (*group 2 of group 13 of group 9 of UI element 1 of scroll area 1 of group 1 of group 1 of tab group 1 of splitter group 1 of window 1 of application process Safari*)
. Lo que esto nos está diciendo es que el "grupo 2" provocó el error. Aunque esto es cierto, el problema real está en el segundo elemento "grupo 13". No hay grupo 2 porque no hay grupo 13. Resumiendo, el problema es casi siempre el segundo elemento del registro de errores. Por eso uso los comandos de repetición... Intenta grupo 1, luego grupo 2, etc ... Todo el camino hasta el grupo 20 hasta que encuentre el valor correcto.
Este siguiente .GIF demuestra el uso del código directamente arriba, en 4 pestañas diferentes en 1 ventana de Safari. He probado el código con éxito en 2 macs diferentes con 2 versiones diferentes de MacOS y 2 versiones diferentes de Safari. Lo que hace es hacer clic en el botón "Bandera", a continuación, seleccione "Spam". He omitido los comandos para pulsar automáticamente el botón "Marcar pregunta" para que el código se pueda utilizar con fines de prueba en el primer mensaje de cualquier tema. Puedo añadir esos comandos más adelante. Haciendo eso se automatizaría todo el proceso.