La jerarquía del menu bar
objeto va así:
menu bar > menu bar item > menu > menu item [ > menu > menu item [...] ]
donde los corchetes indican los posibles submenús, en caso de que existan.
Por lo tanto, si cambias esta línea:
tell menu bar item 1 of menu bar item 1 of menu bar 1
a esto:
tell menu 1 of menu bar item 1 of menu bar 1
funcionará.
Esto, por supuesto, siempre hará clic en el menú de Apple (), que es menu bar item 1 of menu bar 1
para todas las aplicaciones en las que la barra de menú existe y es visible (aunque pertenece a la aplicación que está más adelante, por lo que intentar pedir a otro proceso de aplicación que haga clic en este elemento arrojará un error).
Si desea hacer clic en un elemento de menú arbitrario de la barra de menús para revelar su menú, debe sustituir el número de índice 1
de la menu bar item
con un valor aleatorio, pero que no sobrepase el número de menu bar items
.
Para obtener el número de elementos de la barra de menús, utilice la función count
comando:
set N to count menu bar items of menu bar 1 of activeApp
(Puede omitir of activeApp
si el comando se coloca dentro de un tell process activeApp
bloque).
Para obtener un número aleatorio entre 1 y N
Utiliza el random number
comando:
set i to random number from 1 to N
Si lo unimos todo, el nuevo comando será algo parecido a esto:
tell menu bar item i of menu bar 1 to click
Ahora cada vez que ejecute el script, se hará clic en un elemento aleatorio de la barra de menús haciendo que aparezca su menú.
Para ir más allá, y conseguir que tu script haga clic en un menu item
En este caso, puedes aplicar exactamente los mismos principios que en el caso anterior, teniendo en cuenta la jerarquía que he establecido en la parte superior.
Por lo tanto, después de recuperar un elemento de la barra de menú al azar, a continuación, determinar el número máximo de menu items
y generar un número aleatorio menor o igual a este máximo:
set M to count menu items of menu 1 of menu bar item i of menu bar 1
set j to random number from 1 to M
Entonces puedes hacer clic en él:
click menu item j of menu 1 of menu bar item i of menu bar 1
Aplicando los mismos principios a los submenús que existan para ese elemento de menú en particular, obtendrá lo siguiente:
set L to count menu items of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
set k to random number from 1 to L
click menu item k of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
Sin embargo, verás que esto -la mayoría de las veces- arrojará un error al intentar set L
. Esto se debe a que no todos los elementos del menú tendrán submenús, y en los casos en los que no existe ningún submenú, pedir a AppleScript que cuente el número de elementos del menú [en un submenú inexistente] no es un comando sensato.
Hay dos maneras de manejar esto. O bien envolver esas líneas en un try...end try
bloque de captura de errores, así:
try
set L to count menu items of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
set k to random number from 1 to L
click menu item k of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
end try
o count
el número de (sub)menús de menu item j
y sólo proceder si este número es mayor que 0:
count menus of menu item j of menu 1 of menu bar item i of menu bar 1
if the result > 0 then
set L to count menu items of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
set k to random number from 1 to L
click menu item k of menu 1 of menu item j of menu 1 of menu bar item i of menu bar 1
end if
Y así sucesivamente...
Finalmente...
Es poco probable que sepa con exactitud cuántos niveles de profundidad tiene un determinado árbol de menús: ¿cuántos submenús dentro de submenús existen para un determinado elemento de menú? La respuesta es al menos 0, pero sin un máximo determinado, a menos que lo compruebe usted mismo de antemano.
Por suerte, podemos hacer que AppleScript haga la comprobación por nosotros. Después de elegir un menu bar item
cada hijo que se genera a partir de esto (mirando la jerarquía que te mostré en la parte superior) es un menu
seguido de un menu item
. El menu
como habrás notado, sólo viene en cuenta singular, por lo que siempre será referenciado como menu 1
. El menu items
vienen en plural, y estos son los elementos que hay que contar.
Así que, simplemente, habiendo elegido un menu bar item
, conseguimos que AppleScript haga lo siguiente:
count
el número de menu items
contiene;
- Si este valor es 0, entonces no hay submenús, por lo que sólo podemos hacer clic en el elemento que tenemos;
- Si el valor es mayor que 0, entonces elige uno al azar;
count
el número de menu items
este uno contiene;
- Si este valor es 0, basta con hacer clic en él;
- Si el valor es mayor que 0, entonces elige uno al azar;
- etc.
Este proceso es un bucle que puede continuar por tantos submenús como encuentre. Y eso es lo que hace este código:
tell application "System Events" to ¬
tell (the first application process ¬
whose frontmost is true)
set m to it
set _m to the menu bar items of menu bar 1
repeat
if not (exists _m) then exit repeat
set i to random number from 1 to (count _m)
set m to item i of _m
set _m to a reference to menu items of menu 1 of m
end repeat
click m
end tell
Advertencia: Las líneas horizontales que separan las secciones de un menú también se clasifican como menu items
, al igual que cualquier elemento del menú que esté desactivado. Estos, cuando se hace clic, no hacen nada.
TENGA CUIDADO: Hacer clic en un elemento del menú al azar antes de saber lo que hace puede dar lugar a algunos resultados no deseados. Por ejemplo, puede salir accidentalmente de la aplicación frontal; puede borrar un archivo o expulsar un disco si el scriptse ejecuta mientras Buscador está al frente; o puede cerrar la sesión o apagar el ordenador.