Big Sur 11.1: AppleScript para cambiar automáticamente las redes Wi-Fi

Entonces, como un usuario informó aquí en Stack Exchange, el comando "networksetup" incorporado en la terminal a veces es bastante poco confiable. Es lento y, por alguna razón, descubrí que dot1x nunca se establece correctamente para algunos tipos de redes Wi-Fi en mi hogar. La solución: cree un AppleScript para simular clics del mouse en la barra de menú para cambiar entre redes Wi-Fi.

¿Por qué la configuración de la red es tan lenta en comparación con el cambio manual de redes Wi-Fi?

El siguiente script me ha funcionado bien hasta Big Sur:

use application "System Events"

property process : a reference to application process "SystemUIServer"
property menu bar : a reference to menu bar 1 of my process
property menu bar item : a reference to (menu bar items of my menu bar ¬
    where the description contains "Wi-Fi")
property menu : a reference to menu 1 of my menu bar item
property menu item : a reference to menu items of my menu


to joinNetwork given name:ssid as text
    local ssid
    
    if not (my menu bar item exists) then return false
    click my menu bar item
    
    repeat until my menu exists
        delay 0.5
    end repeat
    
    set M to a reference to (my menu item where the name contains ssid)
    
    repeat 20 times --> 10 seconds @ 0.5s delay
        if M exists then exit repeat
        delay 0.5
    end repeat
    click M
end joinNetwork

joinNetwork given name:"my network ssid"

La razón por la que se rompió es que Wi-Fi ya no es técnicamente una opción directa en la barra de menú principal. En cambio, está relegado al Centro de control en Big Sur, y creo que incluso puede haber otro submódulo que técnicamente está anidado dentro de la interfaz de usuario. He estado leyendo durante horas sobre personas que intentan superar este desafío en Big Sur, por ejemplo, para automatizar un clic en un dispositivo Bluetooth específico, pero muchas personas de AppleScripts que escribieron aparentemente fallaron en la actualización 11.1, y no tengo un punto de partida fácil aquí. para averiguar cómo lograr lo que estoy tratando de hacer para Wi-Fi.

Cualquier ayuda aquí sería tremendamente apreciada.

Nota al margen: sé que el mismo usuario también publicó un método usando AppleScriptObjC, pero como señalaron las personas, es un gran riesgo de seguridad porque necesita poner su contraseña en algún lugar como texto sin formato. La secuencia de comandos de la interfaz de usuario es, por lo tanto, la mejor opción en mi opinión, por lo que me gustaría que vuelva a funcionar.

En macOS Big Sur , en Preferencias del sistema > Muelle y barra de menús > Wi-Fi , marque la casilla de verificación [√] Mostrar en la barra de menús y luego puede usar para hacer clic en el menú de Wi-Fi en la barra de menús . Una vez que se hace clic en el menú , no es como antes de macOS Big Sur para la estructura jerárquica del menú , es decir, el primer elemento de la interfaz de usuario , Wi-Fi es una casilla de verificación , como puede ver al ejecutar... Continúa en el siguiente comentario. .. tell application "System Events" to click (every menu bar item of menu bar 1 of application process "ControlCenter" whose title starts with "Wi‑Fi")
tell application "System Events" to get properties of checkbox "Wi‑Fi" of group 1 of window "Control Center" of application process "ControlCenter"directamente después de hacer clic en el menú Wi-Fi , que mostrará sus propiedades en el Editor de secuencias de comandos . Prueba también, después de abrir el menú Wi-Fi para que puedas ver qué más hay. A partir de estos consejos, puede intentar desarrollar un nuevo script para lograr su objetivo. get UI elements of group 1 of window "Control Center" of application process "ControlCenter"
Gracias. Lo siguiente funciona si el elemento de la barra de menú Wi-Fi dedicado está habilitado. tell application "System Events" to click (every menu bar item of menu bar 1 of application process "ControlCenter" whose title starts with "Wi‑Fi") tell application "System Events" to click (every UI element of scroll area of group 1 of window "Control Center" of application process "ControlCenter" whose title starts with "YOUR_SSID_HERE")También traté de hacer que funcionara para el elemento de la barra de menú del Centro de control, pero parece que "Wi-Fi" es un tipo de "casilla de verificación" debajo de eso, y todo lo que puede hacer es activarlo y desactivarlo.

Respuestas (1)

La técnica que encontré para trabajar es interactuar con los diálogos del centro de control individualmente. Eso es mediante el análisis de cada cuadro de diálogo (2 en total) utilizando el navegador de interfaz de usuario o el inspector de accesibilidad.

  1. Comience haciendo clic en el elemento de la barra de menú que aparecerá en el primer diálogo.
  2. Active la segunda acción ("mostrar detalles") de la casilla de verificación WIFI.
  3. Para simplificar, ponga un retraso para esperar a que se cargue el segundo cuadro de diálogo, usé 0,8 segundos. Una mejor opción es un bucle de espera para que exista el componente de la interfaz de usuario.
  4. Haga clic en la primera casilla de verificación cuyo nombre coincida con el SSID. Podría ser cualquier SSID WIFI disponible o un punto de acceso personal dentro del alcance.

El código

tell application "System Events" to tell process "ControlCenter"
   click menu bar item "Control Center" of menu bar 1

    -- Following block fixes a strange bug where in subsequent run results in an error
    try
        entire contents of group 1 of group 1 of window "Control Center"
    on error
        click menu bar item "Control Center" of menu bar 1
    end try

    perform action 2 of checkbox "Wi‑Fi" of group 1 of group 1 of window "Control Center"

    delay 0.8
    tell window "Control Center"
        click (first checkbox of group 1 of group 1 whose name starts with "anSSID")
    end tell
end tell

Probado en Mac OS 11.5.2