La jerarquía del objeto menu bar
es así:
menu bar > menu bar item > menu > menu item [ > menu > menu item [...] ]
donde los corchetes indican posibles submenús, en caso de que existan.
Por lo tanto, si cambia 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ú Apple (), que es menu bar item 1 of menu bar 1
para todas las aplicaciones en las que existe la barra de menús y está visible (aunque pertenece a la aplicación que está más adelante, por lo que se intenta preguntar a otro). proceso de solicitud para hacer clic en este elemento producirá un error).
Si desea hacer clic en un elemento de menú arbitrario en la barra de menú para revelar su menú, debe reemplazar el número de índice 1
del menu bar item
con un valor aleatorio, pero uno que no exceda el número de disponible menu bar items
.
Para obtener el número de elementos de la barra de menú, use el comando count
:
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 bloque tell process activeApp
).
Para obtener un número aleatorio entre 1 y N
, usa el comando random number
:
set i to random number from 1 to N
Poniendo todo junto, su nuevo comando tendrá un aspecto similar al siguiente:
tell menu bar item i of menu bar 1 to click
Ahora, cada vez que ejecute el script, se hará clic en un elemento de la barra de menú al azar para que aparezca su menú.
Para ir aún más lejos, y hacer que su script haga clic en un menu item
al azar, puede aplicar exactamente los mismos principios que arriba, teniendo en cuenta la jerarquía que coloqué en la parte superior.
Entonces, después de recuperar un elemento de la barra de menú aleatorio, a continuación, determine el número máximo de menu items
y genere 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
Luego puedes hacer clic en él:
click menu item j of menu 1 of menu bar item i of menu bar 1
Al aplicar los mismos principios a cualquier submenú que exista para ese elemento de menú en particular, terminará con esto:
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, encontrará que esto, con más frecuencia que no, generará 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 que no existe un submenú, pedirle a AppleScript que cuente el número de elementos del menú [en un submenú no existente] no es un comando razonable.
Hay dos maneras de manejar esto. O bien enrolle esas líneas en un bloque de captura de error try...end try
, como este:
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 solo 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, y así sucesivamente ...
Finalmente ...
Es poco probable que sepa exactamente cuántos niveles de profundidad abarca un árbol de menús: ¿cuántos submenús dentro de los submenús existen para un elemento de menú en particular? La respuesta es al menos 0, pero sin un máximo dado, a menos que lo haga con anticipación.
Afortunadamente, podemos hacer que AppleScript haga la comprobación por nosotros. Después de elegir un menu bar item
aleatorio, cada niño que se genera a partir de esto (observando la jerarquía que te mostré en la parte superior) es un menu
seguido de un menu item
. El objeto menu
, como habrás notado, solo viene en un recuento singular, por lo que siempre se hará referencia a menu 1
. Los menu items
vienen en plural, y estos son los elementos que se deben contar.
Entonces, simplemente, habiendo elegido un menu bar item
al azar, conseguimos que AppleScript haga lo siguiente:
-
count
el número de menu items
que contiene;
- Si este valor es 0, entonces no hay submenús, así que solo podemos hacer clic en el elemento que tenemos;
- Si el valor es mayor que 0, elija uno aleatorio;
-
count
la cantidad de menu items
que esta contiene;
- Si este valor es 0, simplemente haz clic en él;
- Si el valor es mayor que 0, elija uno aleatorio;
- etc ...
Este proceso es un bucle que puede continuar en todos los submenús que 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é deshabilitado. Estos, al hacer clic, no hacen nada.
TENGA CUIDADO: Al hacer clic en un elemento del menú de forma aleatoria antes de saber qué hace puede dar lugar a algunos resultados no deseados. Por ejemplo, puede abandonar accidentalmente la aplicación frontal; puede eliminar un archivo o expulsar un disco si el script se ejecuta mientras Finder está al frente; o puede cerrar sesión o apagar su computadora.