2017-02-14 24 views
2

Сводка по одной строке - я ищу способ заставить AppleScript самостоятельно определить имя, которое он ожидает, для определенного содержимого окна (элемент пользовательского интерфейса), который будет упоминаться в заявлении «tell».Используйте AppleScript для отображения имен всех элементов пользовательского интерфейса в окне (GUI-скриптинг)

Как я могу заставить AppleScript указать имя, которое он хочет использовать для ссылки на содержимое окна?

, например, я могу сказать, tell current application to tell its front window's list 1 to ...

Я пытаюсь выяснить, термин, как «список 1» для всех содержимого окна, так что я могу кросс-ссылки на него со списком из Accessibility инспектора ..

Я пробовал этот код, но первая строка генерирует сообщение об ошибке «Ошибка» Невозможно сделать имена «class ects» окна 1 «class prcs» \ «iTunes» приложения \ «Системные события» в тип-строка ". Номер -1700 от имен« классов »окна 1« класса prcs »« iTunes »до строки«

tell application "System Events" to tell process "iTunes" to set elementNames to the names of the entire contents of its front window as string 
tell application "TextEdit" 
    activate 
    make new document at the front 
    set the text of the front document to elementNames 
    set WrapToWindow to text 2 thru -1 of (localized string "&Wrap to Window") 
end tell 

ответ

3

В GUI сценариях, используя entire contents [of] на окне процесса, в контексте System Events приложения возвращает список всех элементов пользовательского интерфейса (контроль GUI) из самого переднего окна в активном приложении (всей иерархия сплющенные к списку):

tell application "System Events" 
    tell front window of (first application process whose frontmost is true) 
    set uiElems to entire contents 
    end tell 
end tell 

Если вы запустите выше Script Editor, панель Результат будет отображаться список объект спецификаторы - например, button 1 of window "Main" of application process "iTunes" of application "System Events" - которые непосредственно не раскрывают конкретной информации, но из которого можно почерпнуть хотя бы типа (класс) UI элемента (button, в данном примере) и положение среди своих братьев и сестер тот же самый тип (1)

Чтобы ориентировать Itunes, например, заменить "iTunes" для whose frontmost is true.

Обратите внимание, что если вы хотите только непосредственных дочерних элементов, вы можете использовать UI elements [of] вместо entire contents [of], и вы можете применять его не только к окну (чтобы получить элементы верхнего уровня пользовательского интерфейса), но любой из элементов пользовательского интерфейса, который он содержит, чтобы получить их детей.


Вы не можете извлечь свойства этих элементов путем преобразования перечисления в строку с as string, как вы уже пробовали, но вы можете извлечь свойства в repeat цикла:

Предполагая, что имена вы имеете в виду имена класса (например, table и button), попробуйте следующее:

set classNames to {} 
tell application "System Events" 
    tell front window of (first application process whose frontmost is true) 
     repeat with uiElem in entire contents as list 
      set classNames to classNames & (class of uiElem as string) 
     end repeat 
    end tell 
end tell 

Обратите внимание, что as list необъяснимо необходимо (с учетом macOS 10.12.3), чтобы сделать эту работу (необязательно с UI elements [of]).

Это вернет список имен классов, таких как {"splitter group", "text field", "button", "scroll area", ... }, что само по себе недостаточно для таргетинга на определенный элемент, однако, поскольку иерархия была сглажена.