AppleScript - Come posso _get_I nomi, attributi, proprietà, classi degli elementi dell'interfaccia utente a livello di codice senza "indovinare" tramite AccessibilityInspector?

0

Quando ho iniziato a cercare un modo generico di AppleScript per "fare clic sul menu di scelta rapida di Safari" di un elemento selezionato, c'erano molte domande su "come fare" su diversi livelli di nomenclatura.

Come posso, senza dover utilizzare Accessibility Inspector, indagare su quali "categorie" di elementi dell'interfaccia utente di AppleScript che un'applicazione sta offrendo e quali dettagli aggiuntivi AppleScript ne sa?

    
posta clemsam lang 28.10.2018 - 23:49
fonte

2 risposte

2

Questo è uno "studio" -an tentativo - per trovare modi pragmatici per identificare e "usare" gli elementi dell'interfaccia utente di AS:

Il codice qui sotto funziona in linea di principio ma deve essere adattato ai singoli. caso (es .: trova secondo immagine).
Sono non un professionista IT quindi mi scuso per una netta mancanza di codice "on error" - Scusa!
... né questo significava essere una "guida completa" su AppleScript, piuttosto un "diario di viaggio".

(BTW: AirBook, i7-3740QM, 8 GB. I loop ripetuti su "tutto il contenuto" potrebbero richiedere più di 70 secondi.
Sistema: MacOS X High Sierra 10.13.6, Apple Applescript 2.7. I comandi possono variare con le versioni.)

Ho iniziato la mia ricerca qui a Ask Different , i miei "risultati" qui sotto si applicano principalmente al thread:
Come conoscere il nome degli elementi dell'interfaccia utente utilizzando Accessibility inspector (o qualsiasi altro strumento)

1) How many˜˜ UI elements are there in a "Ask Different" window? …

"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)
               ¯¯¯¯¯

How many˜˜ elements are there in which different classes? …

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    

(~~ Il "testo statico" che stai leggendo è alla fine di questa gerarchia "superiore":
Group> WebArea> ScrollArea> Group> Group> TabGroup> SplitterGroup> Window
Diversi livelli contengono real400 elementi reali: ogni paragrafo & bullet point è uno StaticText!) ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

2) How to identify e.g. those 2 images within 951 UI elements & what to do:

(Da qui in poi solo parti di codice diverse, ad esempio "Successivo" vengono pubblicate; _ / ¯ = interruzione di riga.)

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…)
                ¯¯¯¯¯¯¯¯¯¯

… or just "context" the first … (≈ 7 sec.!)

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) How to get at AppleScript's "verbal description" of a UI element?

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 …]

- che è questa immagine ... ...delladiscussionesopramenzionata.≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

4)Whichattributesarepossibleforanelement,whicharefactualproperties?

Then:if(classofitemioflistItemsisimage)then¬return(nameofattributesofthisItemaslist)¯¯¯¯¯¯¯¯¯¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯¯¯¯¯¯¯¯¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯ ¯¯ ¯ ¯"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"

Which are the factual properties of "image 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"

Ovviamente le proprietà fattuali non corrispondono direttamente agli attributi (da 19 a 32).

But some attributes actually can return values if asked directly:

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

Which property is assigned to which attribute? (For exact "AX…" name, see appendix!)
... easy solution, found on Apple's developer pages:

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"    

Bene, apparentemente le "proprietà" dei comandi semplici di Apple restituiscono anche termini che sono effettivamente di livello superiore, come " classe : immagine" e " intero contenuto : {}" .
Se sei interessato ad apprendere quali proprietà sono assegnate a quali attributi effettivi prova la "soluzione appendice" (ad es. > "AXFrame: {382, 790, 623, 908}"). ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

  1. Which "actions" belong to an element (AXPress, AXShowMenu…) ?

I DuckDuckGo [ogle] 'd (DD'went?) e ho trovato un elenco di "AXActionConstants" su Apple sito :

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

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

 "AXPick" Scegli un UIElement, come la voce di menu

 "AXRaise" Fa sì che una finestra diventi il più in primo piano possibile

 "AXZoomWindow" Consente di ingrandire una finestra in "dimensioni del desktop", ma NON in "schermo intero" .

     NEW! … found action "AXZoomWindow" through UIElementInspector°° © Apple Inc. 2010

.

  1. How are menu items addressed best?

(presto aggiungerò la mia opinione / i miei risultati su questi restanti problemi).

≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

  1. How "different" are classes –and UI elements– in various apps?
  • "TextEdit" è un esempio di "funzioni" minimaliste di una finestra dell'applicazione. (Sii consapevole che
    le sue finestre di strumenti (Fonts ecc.) hanno elementi di interfaccia utente propri, molti di più rispetto all'app principale!)
  • La sua "barra" superiore è composta da 3 pulsanti colorati, un'immagine che rappresenta il documento, il titolo come testo statico e una piccola freccia in basso, un pulsante del menu.
  • Oltre a questi ci sono (potenzialmente) 2 aree di scorrimento (destra e amp; in basso) con barre di scorrimento, anche indicatori di valore (la loro dimensione), e non ultimo il suo "contenuto", un'area di testo.

    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" nella visualizzazione elenco mostra icone e amp; strumenti (= immagini), i file hanno nomi, date ecc. (testo statico), gli strumenti sono anche pulsanti, i nomi dei file sono anche campi di testo (rinomina).

  • "iTunes" (senza elementi TV "installati") ha 2 pulsanti di scelta rapida (1: musica, film, TV / 2: successivo, cronologia, testo del brano) più vari tipi di pulsanti di navigazione.
  • Tutte queste applicazioni, tuttavia, hanno anche centinaia di voci di menu: menu, sottomenu, sotto-sotto-menu (TextEdit ≈ 350, Finder ≈ 430).

≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
A P P E N D I X ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

Older code to get at "assignations" – but returns exact name! ... THAT took some testing:*

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 …)    

Il try-block è necessario poiché alcuni attributi senza valore causano altrimenti errori.
Questa ricerca sulla pagina di esempio ha richiesto 9 anni. (# 111) su QUESTA pagina ≈ 135 s. (# 767)! ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈ ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈

    
risposta data 28.10.2018 - 23:49
fonte
0

Anche se questo è solo un

Modo alternativo [s] °° per ottenere una descrizione AS dell'elemento UI

Lo ritengo così importante da giustificare una sua risposta:

Se le procedure "normali" come sopra descritte non ti danno un risultato soddisfacente (es: descrizione "percorsi") o se hai fretta, un modo efficace è usare Automator come "in-between-agent". Fai questo:

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.

Riceverai un sacco di routine di cattura degli errori e di timeout ma anche "percorsi" per gli elementi dell'interfaccia utente usati ecc.

In realtà Automator è più potente di ScriptEditor in qualche modo; se s.th. funziona tramite script / app di Automator che NON funziona necessariamente se incollato in un "applescript" tradizionale.
Ad esempio, facendo clic sulle icone della barra dei menu (a destra) delle app di menu non programmabili FUNZIONERÀ se registrato e riprodotto da Automator . Purtroppo NON lo fa in ScriptEditor.
È interessante notare che questo esempio sposta "fisicamente" il cursore del mouse sull'icona del menu ... qualcosa che i normali script non raggiungono.

(°° descrizione di base di wch1zpink , pubblicato in "Script di interfaccia utente di AppleScript e clic" )

([s] °° Raccomando anche una versione precedente di Accessibility Inspector denominata UIElementInspector (versione 1.4 dal 2010) che funziona con OS 10.13.6 E, sebbene graficamente meno attraente, fornisce "nomi" oltre alle classi.

    
risposta data 20.11.2018 - 10:20
fonte

Leggi altre domande sui tag