例
まずは例として、Windowsに付属する「電卓」を使って1 + 2を計算してみるスクリプトを書くと以下のようになる。$process = Start-Process calc -PassThru $window = Get-UiaWindow -ProcessId $process.Id $window | Get-UiaButton -Name '1' | Invoke-UiaButtonClick | Out-Null $window | Get-UiaButton -Name '加算' | Invoke-UiaButtonClick | Out-Null $window | Get-UiaButton -Name '2' | Invoke-UiaButtonClick | Out-Null $window | Get-UiaButton -Name '等号' | Invoke-UiaButtonClick | Out-Null
結構簡単に操作できることがわかると思う。ではここから使い方を見ていく。
準備
まずは準備として、http://uiautomation.codeplex.com/ に行き、Downloadボタンを押してzipをダウンロード、どこかに展開する。本当はこの中身をDocuments\WindowsPowerShell\Modules\UIAutomationに入れるのだけど、お試しなのでとりあえず
Import-Module .\UIAutomation.dllとする。
Get-Moduleして以下のようにでてくればOK。
PS > Get-Module UIA* ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Binary 0.8.7.79 UIAutomation {Add-UiaBannerText...
作り方
作り方は、「UI要素を探す」「UI要素をコントロールする」を繰り返すだけ。UI要素を探す
UIをポイントするとUI要素を表示してくれるSpyツール「UIAutomationSpy.exe」が付属しているので、これを使ってコマンドを生成することができる。UIAutomationSpy.exeを起動すると、ボタンが2つとテキストボックスがいくつかある画面が起動するので「Start」ボタンを押してから、マウスカーソルに適当なウィンドウに持っていくと、テキストボックスにコマンドが表示される。
欲しい部品が見つかったら、素早くStopボタンを押す。
一番下のテキストボックスにホバーしたUI要素を探すためのコマンドが書かれているが、基本的にはこれをそのまま使うのではなく、不要な部分を削ったり、ちょっと加えたりする。例えばさっきの電卓の例であれば、採取したタイミングでは以下のようになっている。
Get-UiaWindow -Class 'CalcFrame' -Name '電卓' | ` Get-UiaPane -Class 'CalcFrame' | ` Get-UiaPane -Class '#32770' | ` Get-UiaButton -AutomationId '81' -Class 'Button' -Name 'クリア'
しかし、Get-Uiaシリーズは基本的に再帰的に要素を探してくれるので、ウィンドウを取得できたら、あとは特定できるのであれば詳しく書く必要はない。上記の例では、以下でもOK.
Get-UiaWindow -Class 'CalcFrame' | Get-UiaButton -Name 'クリア'
なお、Idというだけあって、通常はAutomationIdを使うのがおすすめ。上記の例では適切なものがついていないが、WPFアプリケーションならx:NameやNameに設定したものがついている。
UI要素をコントロールする
上記のGet-~で得られたオブジェクトを、コントロールするコマンドレットにパイプで渡せばコントロールすることができる。例えば、ボタンをクリックするなら以下の通りになる。$button | Invoke-UiaButtonClick
コントロールするコマンドレットは自分で探すしかないが、基本的にSet-UiaやInvoke-Uiaがついているので、補完でだいたい探せる。例えば「Invoke-UiaWindowPattern -PatternName Close」や「Set-UiaTextBoxText」などである。
見つからないときは「Get-Command *uia*」とすれば一覧がでてくるので、これから探す。なお、テキストを取得するGet-UiaTextTextなど、取得する系のコマンドレットもあるので、テストなんかには活用されたし。
上記を組みわせていけば自動操作するスクリプトができる。
もっと詳しく
ほとんど上記で行えているが、歯抜けではあるがドキュメントがあるので、こちらも参考にできる。また、このライブラリはSystem.Windows.Automationのラッパーでしかないので、.NETのUI オートメーションの情報、例えばMSDNのドキュメント(UI オートメーションの概要)や既存の記事なども参考にできる。コマンドレットで不足があれば、.NETのAPIを得られたオブジェクトに対して実行してしまっても動作する。
なお、試してみてはいないが、Metro UIなんて記載もあるので、Windowsストアアプリも操作できそうである。興味があればぜひ。
Tips
UI自動操作は対象によってTips的なものが使うほどにでてくるが、最初から大事そうなものを挙げておく。ウィンドウをプロセスで絞り込む
ウィンドウはプロセスを決めなくても検索できるが、自分で起動している場合など、限定できる場合は-ProcessIdで絞っておくと安全である。Get-UIAWindow -ProcessId $proc.Id -AutomationId hogehoge
UI要素をガイドする赤枠を外す
デフォルトでは選択した要素には赤枠がつくようになっている。しかし、通常は邪魔なので以下で外すことができる。[UIAutomation.Preferences]::Highlight = $false
タイムアウトを変更する
既定でもUI要素が出てくるまである程度待ってくれるが、足りない場合は-Secondsで延長できる。Get-UIAWindow -AutomationId hogehoge -Seconds 60
以上、Happy UI Automation Lifeを。
0 件のコメント:
コメントを投稿