AppleScriptでUI Elementsをリストで取得して使う方法


System EventsでUI Elementsを取得する方法はいろんなページに載っていたけど、みんな各所各所で **every UI elements**を使ってターミナルに一覧を表示して求める方法ばかり。
パーツがimageで毎回変わるような時は固定値だとスクリプトが動かなくなる。
プログラムでevery UI elementsで表示された内容を取得して、その中の値を使う方法がやっとわかったのでメモ。

1. System Eventsを使って操作する基本的な方法
2. every UI elementの内容をリストで取得して使う方法


##System Eventsを使って操作する基本的な方法
例えば、システム環境設定で、 **一般**をスクリプトで開きたい場合

``` AppleScript
tell application "System Events"
	tell process "System Preferences"
		every UI element
	end tell
end tell
```
とやると

``` text
{window "システム環境設定" of application process "System Preferences" of application "System Events", menu bar 1 of application process "System Preferences" of application "System Events"}
```
と結果が表示され、Window名が「 **window "システム環境設定"** 」だとわかるので、「 **tell window "システム環境設定"** 」を追記してから、また「 **every UI elements** 」を書いてまた一覧を表示。

``` AppleScript
tell application "System Events"
	tell process "System Preferences"
		tell window "システム環境設定"
		every UI element
		end tell
	end tell
end tell
```

```text
{button 1 of window "システム環境設定" of application process "System Preferences" of application "System Events", button 2 of window "システム環境設定" of application process "System Preferences" of application "System Events", button 3 of window "システム環境設定" of application process "System Preferences" of application "System Events", scroll area 1 of window "システム環境設定" of application process "System Preferences" of application "System Events", 
・・・・
```

「 **tell scroll area 1** 」を追記して、また「 **every UI elements** 」。

``` AppleScript
tell application "System Events"
	tell process "System Preferences"
		tell window "システム環境設定"
			tell scroll area 1
				every UI element
			end tell
		end tell
	end tell
end tell
```
```text
{button "一般" of scroll area 1 of window "システム環境設定" of application process "System Preferences" of application "System Events", button "デスクトップと
スクリーンセーバ" of scroll area 1 of window "システム環境設定" of application process "System Preferences" of application "System Events",
・・・
```
システム環境にあるアイコンの名前がずらっと表示され 「 **button "一般"** 」だとわかるので、「 **click button "一般"** 」を追加することでスクリプトで **一般** を開く事ができる。

```AppleScript
tell application "System Events"
	tell process "System Preferences"
		tell window "システム環境設定"
			tell scroll area 1
				click button "一般"
			end tell
		end tell
	end tell
end tell
```
**of**を付ける事で短く書く事もできる。(下記は同じ挙動)

```AppleScript
tell application "System Events"
	tell process "System Preferences"
		click button "一般" of scroll area 1 of window "システム環境設定"
	end tell
end tell
```
基本的にはこんな感じで各所各所で「 **every UI elements** 」を使ってUI Elementsを取得する。

##every UI elementの内容をリストで取得して使う方法
途中に「 **name of** 」を挟む事でパーツの名前リストを得る事ができる。

```AppleScript
tell application "System Events"
	tell process "System Preferences"
		tell window "システム環境設定"
			tell scroll area 1
				set scroll_List to name of every UI element
			end tell
		end tell
	end tell
end tell
```
```text
{"一般", "デスクトップと
スクリーンセーバ", "Dock", "Mission
Control", "言語と地域", "セキュリティと
プライバシー", "Spotlight", "通知", "CD と DVD", "ディスプレイ", "省エネルギー", "キーボード", "マウス", "トラックパッド", "プリンタと
スキャナ", 
・・・
```
上記の例の場合、リストとして **scroll_List**に入るので、 **to item 1**で呼び出せる

```AppleScript
tell application "System Events"
	tell process "System Preferences"
		tell window "システム環境設定"
			tell scroll area 1
				set scroll_List to name of every UI element
				set button_name to item 1 of scroll_List
				click button button_name
			end tell
		end tell
	end tell
end tell
```