LoginSignup
5
4

More than 5 years have passed since last update.

JXAのUIエレメントのリンクを取得するスクリプト

Last updated at Posted at 2015-09-14

アプリのメニューとかにアクセスするコードを取得します。
一覧からアプリを選んで、検索したいUIエレメントの名前を入力するだけです。
(全てのUIエレメントを調べるのでけっこう時間かかります)

search_ui.scpt
MSG_1 = "どのプロセスを調べますか?"
MSG_2 = [
  "検索するUIの名前を入力してください。(正規表現可)\n",
  "数分かかる可能性があるので気長にお待ちください。",
  "なるべく他の作業はしないでください。"
].join("\n")

app = Application.currentApplication()
app.includeStandardAdditions = true
se = Application("System Events")  

function search_ui(process_name, ui_name){
  var process = se.processes[process_name]
  var ui_rex = new RegExp(ui_name)
  var result = []

  if(process.exists()){
    var all_ui = process.entireContents()
    result = all_ui.filter(function(e){ return ui_rex.test(e.name()) })
    result = result.map(function(e){ return Automation.getDisplayString(e) })
  }
  return result
}

target_app = app.chooseFromList(se.processes.name(), {withPrompt:MSG_1})[0]

if(target_app.length){
  try {
    target_ui = app.displayDialog(MSG_2, {defaultAnswer: ""}).textReturned

    if (target_ui.length){
      result = search_ui(target_app, target_ui)
      msg = result.length + " 件見つかりました。\n\n" + result.join("\n\n")
    }
  } catch(e){}  
}

app.displayDialog(this.msg || "キャンセルされました。", {buttons:["OK"], defaultButton:1})

たとえば「iTunes」「フルスクリーン」と入力すると以下のようなダイアログが表示されます。

2 件見つかりました。

Application("System Events").applicationProcesses.byName("iTunes").menuBars.at(0).menuBarItems.byName("表示").menus.byName("表示").menuItems.byName("ビデオ再生").menus.byName("ビデオ再生").menuItems.byName("フルスクリーン")

Application("System Events").applicationProcesses.byName("iTunes").menuBars.at(0).menuBarItems.byName("表示").menus.byName("表示").menuItems.byName("フルスクリーンにする")

コピペでそのままJXAに使うことができます。

iTunes_fullscreen.js
// 上で作ったメニューアイテム
target = Application("System Events").applicationProcesses.byName("iTunes").menuBars.at(0).menuBarItems.byName("表示").menus.byName("表示").menuItems.byName("フルスクリーンにする")

// .click()で実行 (iTunesがフルスクリーンになる)
target.click()

(けっこう前に似たようなうんこスクリプト書いた気がするけど忘れた)

追記:
全UIエレメントの名前だけ見たいとき用のスクリプトも作りました
下の方はたぶんダイアログに入りきらないので、テキストエディタとかにコピペしてください

reveal_all_ui_names.js
MSG = "どのプロセスを調べますか?"

app = Application.currentApplication()
app.includeStandardAdditions = true
se = Application("System Events")  

function all_ui_names(process_name){
  var process = se.processes[process_name]
  var all_ui = process.entireContents()
  return all_ui.map(function(e){ return e.name() })
}

target_app = app.chooseFromList(se.processes.name(), {withPrompt:MSG})[0]

if(target_app.length){
  elms = all_ui_names(target_app)
  app.displayDialog(elms.join(", "), {buttons:["OK"], defaultButton:1})
}

Macのキーボード入力、マウスクリックをJavaScriptで (JXA)

(2016/01/29追記:console.logでやればいいのに何でダイアログに表示してんだっけこれ)

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4