6 votos

AppleScript - ¿Cómo puedo _obtener_ los nombres, atributos, propiedades y clases de los elementos de la interfaz de usuario mediante programación sin "adivinar" a través de AccessibilityIns

Cuando empecé a buscar una forma genérica de AppleScript para "hacer clic en el menú contextual de Safari" de un elemento seleccionado, había un montón de preguntas sobre "cómo" en varios niveles de nomenclatura.

¿Cómo puedo, sin tener que utilizar el Inspector de Accesibilidad, investigar qué "categorías" de elementos de interfaz de usuario AppleScript ofrece una aplicación y qué detalles adicionales conoce AppleScript sobre ellos?

0 votos

Desde apple.stackexchange.com/help/on-topic : "Si tiene una pregunta sobre un problema práctico que intenta resolver...". La pregunta anterior tiene su mérito, pero es demasiado amplia para poder responderla fácilmente. Una manera de salir de esto que puedo imaginar es centrarse en "cómo puedo encontrar elementos de la interfaz de usuario", pero esto ya está cubierto en otro Q & A (por lo que la pregunta aquí podría ser reescrito para preguntar cómo se puede resolver sin utilizando el Inspector de Accesibilidad). Para temas más detallados sería mejor preguntar por los elementos de una aplicación específica en el contexto de un problema del mundo real en preguntas separadas.

1 votos

En el pasado teníamos un blog de AD que hubiera sido perfecto para este tipo de post, pero por diversas razones se ha cerrado hace tiempo. Si alguien cree que este tipo de posts de preguntas y respuestas debería ser posible, por favor, cree una solicitud/pregunta en el sitio Meta para discutirlo.

0 votos

@ nohillside: muchas gracias por tu prudente edición (también a mi respuesta). Espero que el tema sea aceptado ahora, así que añadiré respuestas cortas a mis cuestiones restantes más abajo.

5voto

zonble Puntos 2925

Se trata de un "estudio" -un intentar - para encontrar formas pragmáticas de identificar y "utilizar" los elementos de interfaz de usuario de AS:

El código siguiente funciona en principio pero debe adaptarse a cada caso individual (por ejemplo: encontrar segundo imagen ).
Yo soy no es un profesional de la informática por lo que me disculpo por una clara falta de código "en el error" - Lo siento.
ni tampoco pretende ser una "Guía completa" sobre AppleScript, sino un "Diario de viaje".

(Por cierto: AirBook, i7-3740QM, 8GB. Los bucles de repetición en "todo el contenido" pueden tardar más de 70 segundos.
Sistema: MacOS X High Sierra 10.13.6, Applescript 2.7. Los comandos pueden variar con las versiones).

Empecé mi búsqueda aquí en Pregunta diferente mis siguientes "resultados" se aplican sobre todo al hilo:
Cómo saber el nombre de los elementos de la interfaz de usuario mediante el inspector de accesibilidad (o cualquier otra herramienta)

1) Cuantos˜˜˜ nes ¿Existen elementos de la interfaz de usuario en una ventana "Ask Different"?

"Frame":    tell application "System Events" to tell process "Safari"
                set frontmost to true
                set i to 0
Start:          set listItems to (entire contents of window 1 as list)
Next:           repeat with thisItem in listItems
                    set i to i + 1
                end repeat
            end tell
"Result" in
ScriptEditor:   951                -- display dialog ("UIElems:" & i)
               ¯¯¯¯¯

Cuántos elementos de la cadena de suministro hay en los que diferentes clases ?

Classes:    if (class of item i of listItems is static text) then
                set classCount to classCount +1    
            end if
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Results" in ScriptEditor:
static text (376), group˜˜ (337), UI element (166), button (51),
radio button (12), menu button (6), image (2)
(1 inst. each:) toolbar, scroll area, scroll bar, text area, text field, 
tab, checkbox, splitter group, splitter    

(˜˜ El "texto estático" que acaba de leer está al final de esta jerarquía "superior":
Group> WebArea> ScrollArea> Group> Group> TabGroup> SplitterGroup> Window
Varios niveles contienen 400 elementos reales: cada párrafo y viñeta es un StaticText !)

2) Cómo identificar por ejemplo, esas 2 imágenes dentro de 951 elementos de la interfaz de usuario & qué hacer:

  (A partir de aquí, sólo se contabilizan las partes de código diferentes, por ejemplo, "Siguiente"; _/¯ = salto de línea).

Next:       set imgNums to {}
            repeat with thisItem in listItems
                set i to i + 1
Then:           if (class of item i of listItems is image) then
                    set imgNums to imgNums & i
            end repeat
            return imgNums    _/¯    end tell
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Result" in
ScriptEditor:   {111, 255}     ( 70 sec.! Searching 951 items is tedious…)
                ¯¯¯¯¯¯¯¯¯¯

o simplemente "contexto" la primera ( 7 seg.!)

Next:           if (class of item i of listItems is image) then exit repeat
            end repeat
Then:       tell thisItem to perform action "AXShowMenu"    _/¯    end tell

3) Cómo llegar a AppleScript "descripción verbal" de un elemento de la interfaz de usuario?

Next:       repeat with thisItem in listItems    _/¯    set i to i + 1
Then:           if (class of item i of listItems is image) then
                    return (item i of listItems as list)
                    exit repeat
                end if    _/¯    end repeat    _/¯    end tell
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Result" for image 1 in ScriptEditor:
image 1 of group 15 of group 6 of UI element 1 of scroll area 1 ¬
of group 1 of group 1 of tab group 1 of splitter group 1 of window ¬
"applescript - How to know the name of UI elements using Accessibility ¬
inspector (or any other tool) - Ask Different" of application process ¬
"Safari" of application "System Events"
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
[Last three lines may be shortened to "window 1" – it's still in front …]

- que es esta imagen enter image description here del hilo mencionado anteriormente.

4) Que atributos son posibles para un elemento, que son de hecho propiedades ?

Then:           if (class of item i of listItems is image) then ¬
                return (name of attributes of thisItem as list)
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Result" for "attributes" in ScriptEditor:
"AXFocused", "AXAccessKey", "AXTitle", "AXElementBusy", "AXPosition", ¬
"AXLinkedUIElements", "AXSelected", "AXLanguage", "AXStartTextMarker", ¬
"AXEnabled", "AXEditableAncestor", "AXHighestEditableAncestor", ¬
"AXVisited", "AXDOMIdentifier", "AXHelp", "AXURL", "AXChildren", "AXRole", ¬
"AXParent", "AXSelectedTextMarkerRange", "AXTopLevelUIElement", ¬
"AXDOMClassList", "AXSubrole", "AXDescription", "AXFocusableAncestor", ¬
"AXValue", "AXBlockQuoteLevel", "AXRoleDescription", "AXSize", "AXWindow", ¬
"AXEndTextMarker", "AXFrame"

¿Cuáles son los propiedades fácticas de la "imagen 1"?

Next:           if (class of item i of listItems is image) then ¬
                return (properties of thisItem as list)
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Result" for "properties" in ScriptEditor:
missing value, m.v, {382, 790}, image, "enter image description here", ¬
"Bild", false, "", {241, 118}, "", {}, true, m.v., "AXImage", "", m.v., ¬
false, m.v., "enter image description here"

  Evidentemente, las propiedades fácticas no se corresponden directamente con los atributos (19 a 32).

Pero algunos atributos realmente puede devolver valores si se le pregunta directamente:

Then:       end repeat
            return value of attribute "AXFrame" of thisItem  _/¯  end tell
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Result" for "AXFrame" in ScriptEditor:   {382, 790, 623, 908}

Que la propiedad es asignado a que atributo? (Para el nombre exacto de "AX ", véase el apéndice)
... solución fácil, que se encuentra en las páginas para desarrolladores de Apple:

Next:       if (class of item i of listItems is image) then
                tell item i of listItems to properties
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
"Result" for "Bild" in ScriptEditor:    
minimum value:missing value, orientation:m. v., position:{382, 790}, ¬
class:image, accessibility description:"enter image description here", ¬
role description:"Bild", focused:false, title:"", size:{241, 118}, ¬
help:"", entire contents:{}, enabled:true, maximum value:m. v., ¬
role:"AXImage", value:"", subrole:m. v., selected:false, name:m. v., ¬
description:"enter image description here"    

Bueno, aparentemente el propio comando simple de Apple "propiedades" también devuelve términos que son realmente de nivel superior, como " clase :imagen" un " contenido completo :{}".
Si está interesado en saber qué propiedades están asignadas a qué atributos reales, pruebe la "solución del apéndice" (por ejemplo, > "AXFrame:{382, 790, 623, 908}").

  1. Que "acciones" pertenecen a un elemento ( AXPress, AXShowMenu ) ?

  Me DuckDuckGo[ogle]'d (DD'went?) y encontré una lista de "AXActionConstants" en el sitio de Apple :

    "AXShowMenu" "AXPress" "AXCancel" "AXConfirm"

    "AXDecrement" "AXIncrement" "AXShowAlternateUI" "AXShowDefaultUI"

    "AXPick" Elegir un UIElement, como elemento de menú

    "AXRaise" Hacer que una ventana sea lo más frontal posible

    "AXZoomWindow" Amplía una ventana a las "dimensiones del escritorio" pero NO a "pantalla completa" .

     ¡NUEVO! acción encontrada "AXZoomWindow" a través de UIElementInspector°° © Apple Inc. 2010

.

  1. ¿Cómo son elementos del menú ¿se dirige mejor?

  (Pronto añadiré mi opinión/conclusiones sobre estas cuestiones restantes).

  1. Cómo "diferente" son clases -y elementos de la interfaz de usuario- en varias aplicaciones ?
  • "TextEdit" es un ejemplo para las "funciones" minimalistas de una ventana de aplicación. (Tenga en cuenta que
    sus herramientas Windows (fuentes, etc.) tienen elementos de interfaz propios, muchos más que la aplicación principal)

  • Su "barra" superior consta de 3 botones de colores, una imagen que representa el documento, su título como texto estático y una pequeña flecha hacia abajo, un botón de menú.

  • Aparte de estos hay (potencialmente) 2 áreas de desplazamiento (derecha y inferior) con barras de desplazamiento, también indicadores de valor (su tamaño), y por último, y no menos importante, su "contenido", un área de texto.

    Classes of window 1 of TextEdit / Finder / iTunes:
    set classNum to classNum & (class of item i of listItems)
    – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – 
    "Result" for "TextEdit" (16):
    button (7), scroll bar (2), scroll area, text area, value indicator, 
    menu button, image, static text
    – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – 
    "Result" for "Finder" window in list view with left area with 
    "devices" etc. , 11 files (208):
    UI element (49), static text (49), image (27), row (26), button (19),
    text field (12), group (6), radio button (4), column (4), ...
    – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – 
    "Result" for "iTunes" (26):
    button (12), radio button (3), static text (3), pop up button (2), 
    radio group (2), slider, value indicator, scroll area, text field
  • "Finder" en la vista de lista muestra iconos y herramientas (= imágenes), los archivos tienen nombres, fecha, etc. (texto estático), las herramientas son también botones, los nombres de los archivos son también campos de texto (renombrar).

  • "iTunes" (sin elementos de TV "instalados") tiene 2 botones emergentes (1: música, películas, TV / 2: siguiente, historial, texto de la canción) además de varios tipos de botones de navegación.

  • Pero todas estas aplicaciones tienen también cientos de elementos de menú: menús, submenús, subsubmenús (TextEdit 350, Finder 430).

    A P E N D I E N T E

Código más antiguo para llegar a las "asignaciones" - pero devuelve ¡el nombre exacto! ... QUE tomó algunos pruebas:*

Next:       if (class of item i of listItems is image) then
                repeat with name in (attributes of thisItem as list)
                    try
                        if value of name is "Bild" then exit repeat
                    end try
                end repeat    _/¯    exit repeat    _/¯    end if
            try
                i & k & item k of (name of attributes of thisItem as list)
            end try
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯        
"Result" for "Bild" in ScriptEditor:    {111, 28, "AXRoleDescription"}
 (Incl.: # of UI element, # of attribute, name of attribute) 
¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯    
 ({382, 790} => AXPosition, {241, 118} => AXSize, "AXImage" => AXRole …)    

  El bloque try es necesario, ya que algunos atributos sin valor, de lo contrario, provocan errores.
  Esta búsqueda en la página de muestra tomó 9s. (#111) en Esta página 135s. ¡(#767) !

3voto

zonble Puntos 2925

Aunque esto es sólo una

Manera[s] alternativa[s] de llegar a la descripción AS de un elemento de interfaz de usuario

Lo considero lo suficientemente importante como para justificar una respuesta propia:

Si los procedimientos "normales" descritos anteriormente no consiguen un resultado satisfactorio (por ejemplo: descripción "rutas") o si tiene prisa, una forma eficaz es utilizar Automator como "agente intermedio". Haga esto:

Open Automator > Click its red-bullet "Record" button > *DO YOUR THING* > 
Stop "Recording" > Copy relevant "action icons" > Open ScriptEditor and
Paste those into a new script.

Tendrá un montón de rutinas de captura de errores y de tiempo de espera, pero también "caminos" hacia los elementos de la interfaz de usuario utilizados etc.

En realidad Automator es más poderoso que ScriptEditor en algunos aspectos; si s.th. funciona a través de Automator scripts/apps it NO necesariamente funciona también si se pega en un applescript "tradicional".
Por ejemplo, al hacer clic en los iconos de la barra de menús (del lado derecho) de las aplicaciones de menús que no se pueden guiar Funcionará si se graba y reproduce con Automator . Lamentablemente NO lo hace en ScriptEditor.
Curiosamente este ejemplo moverá "físicamente" el cursor del ratón al icono del menú algo que los scripts normales no consiguen.

(°° descripción básica por wch1zpink , publicado en "Scripting de interfaz de usuario AppleScript y clic" )

([s]° También recomiendo una versión anterior de Accessibility Inspector llamada UIElementInspector (versión 1.4 de 2010) que funciona con OS 10.13.6 Y, aunque gráficamente es menos atractivo, te da "nombres" además de clases.

0voto

Ultralegend Puntos 14

Navegador UI es realmente útil para encontrar caminos a los elementos. Cuesta 55 dólares pero tiene una prueba gratuita.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X