目的
UIAutomation使って自動でボタンポチポチ押すくらいできるようになる
対象
ちょっとUIAutomation使ってみたいなーくらいの人
ざっくりとした手順
- 操作したいオブジェクトを調査する
- 操作したいオブジェクトの
AutomationElement
を取得する - 取得したオブジェクトを操作する
詳細
UIAutomation Tree
について
Desktop
を根とした木構造になっている。
Desktop
-アプリ-アプリが持つボタン、メニュー、etc.-…
これをたどって操作したいオブジェクトのAutomationElement
を取得する。
操作したいオブジェクトを調査する
調査で取得する情報
オブジェクトの検索に使う情報を取得する。ひとまず
Name
,ControlType
,AutomationId
,ClassName
を調べればよい。対象は操作したいオブジェクトとそれの親 or 祖先であるアプリ。
調査方法
以下のツールを使う。
UIAutomationSpy
,Inspect
,Accessibility Insights
など。
操作したいオブジェクトのAutomationElement
を取得する1
まず検索の起点となるAutomationElement
を取得する。
取得したAutomationElement
から条件と方向を指定して検索する。
操作したいオブジェクトを持つアプリのAutomationElement
を取得して検索の起点とするとよい。
アプリのAutomationElement
を取得する方法
方法はいくつかあるがアプリはDesktop
の子要素であることが多いので、Desktop
のAutomationElement
から子要素を対象としてアプリを検索すると楽。
Desktop
の子要素でname
と一致するName
プロパティを持つものを取得。
var cnd = new PropertyCondition(AutomationElement.NameProperty, name);
var apliElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, cnd);
AutomationElement.RootElement
はDesktop
のAutomationElement
。
検索の詳細については次項。
検索方法
起点となるAutomationElement
から検索条件と検索対象範囲を指定して検索する。
検索条件を作成する2
検索対象とするプロパティと一致条件を指定して検索条件を作成する。
検索対象をName
プロパティ、name
と一致することを条件とする場合。
var cnd = new PropertyCondition(AutomationElement.NameProperty, name);
AutomationElement.NameProperty
を変更すればControlType
,AutomationId
,ClassName
を対象にできる。
それぞれAutomationElement.ControlTypeProperty
,AutomationElement.AutomationIdProperty
,AutomationElement.ClassNameProperty
。
ControlType
を対象にする場合、一致条件にControlType
クラスを指定する。他はstring
。
検索する
検索の起点から検索条件と検索対象範囲(自分、子要素、孫要素)を指定して検索する。
起点であるapliElement
から条件cnd
で子要素を検索する場合。
var targetElement = apliElement.FindFirst(TreeScope.Children, cnd);
FindFirst
の場合条件に合った最初のAutomationElement
を返す。
FindAll
を使うと条件に合ったすべてのAutomationElement
を返す。
TreeScope.Children
を変更することで検索対象を変更できる。
オブジェクトを操作する
取得したAutomationElement
から適切なPattern Object
を得てそれを操作する。
適切なPattern Object
を取得する
操作に適切なAutomationPattern
を指定してPattern Object
を取得する。
ボタンを押すのであればInvokePattern.Pattern
。
var btn = targetElement.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
GetCurrentPattern
の返り値はobject
なので変換を忘れずに。
取得したPattern Object
を操作する
取得したPattern Object
のメソッドを実行する。
ボタンを押す場合はInvoke
。
btn.Invoke();
参考資料
AutomationElement
を取得する方法
Obtaining UI Automation Elements - Win32 apps | Microsoft Docs
ControlType
について
ControlType Class (System.Windows.Automation) | Microsoft Docs
検索範囲(TreeScope
)について3
TreeScope Enum (System.Windows.Automation) | Microsoft Docs
ControlType
とPattern
の対応表
Control Pattern Mapping for UI Automation Clients | Microsoft Docs
それぞれのPatter
詳細へのリンク
UI Automation Control Patterns Overview | Microsoft Docs
その他
menuItemとか右クリックメニューとかを操作したい場合
目標とするオブジェクトが描画されてないと検索できないっぽい4。
MenuItem
を操作するには一旦Menu
を取得して展開してから検索・取得・操作する。
右クリックメニューを操作するには右クリックイベントを発生させたりショートカットキーを使って表示させてから検索・取得・操作する。
ショートカットキーを使って右クリックメニューを表示させる例。右クリックメニューを持つオブジェクトにフォーカスしてからショートカットキーを送る。送った後ちょっと待ち時間を入れた方がよい。
automationElement.SetFocus();
SendKeys.SendWait("+{F10}");