ページ

2014-09-20

WindowsアプリのUI自動操作をUI Automation PowerShell Extensionで行う

UI Automation PowerShell Extensionは、.NET Frameworkに付属するUI オートメーションライブラリのPowerShellラッパーで、UI自動操作(UIオートメーション)をPowerShellで記述できる。これにより、GUIしかないアプリの定型作業をスクリプト化したり、UIテストを行ったりすることができる。だいぶ前に書こうと思ったのだけど、思い出したのでようやく書くことにした。

まずは例として、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 件のコメント:

コメントを投稿