サイトアイコン わんすけに聞いてみる

UIAutomationでCheckboxとRadioButton

WinActorで無理やりUIAutomation制御する企画。

今日は、チェックボックスとラジオボタンの操作にチャレンジ。

 

1.CheckBoxコントロール

最初、普通にClick操作でInvokeしたらいいんじゃね?って思ったんだけども、結局それだとTrue/False状態を任意に制御できない。

チェック状況を取得しようとすると、ちゃんとAutomationElementからTogglePatternとして取得して操作しないといけないみたいですね。

ちなみに、取得されるステータスはON/OFF以外にIndeterminateというステータスが返ってくるみたいなので値のチェックにも注意が必要です。

取得するコードはこんな感じ

' TargetElmにはすでに操作対象のAutomationElementが取得できている状態

Dim TglPtn As TogglePattern = TargetElm.GetCurrentPattern(TogglePattern.Pattern)
Console.WriteLine(TglPtn.Current.ToggleState = ToggleState.On)

対して、設定するコードはこんな感じ

' TargetElmには、すでに操作対象のAutomationElementが取得できている状態

Dim TglPtn As TogglePattern = TargetElm.GetCurrentPattern(TogglePattern.Pattern)
Select Case StrConv(argVal, VbStrConv.Lowercase)
  Case "0", "false"
    If (TglPtn.Current.ToggleState = ToggleState.On) Then
      TglPtn.Toggle()
    End If
  Case "1", "true"
    If (TglPtn.Current.ToggleState <> ToggleState.On) Then
      TglPtn.Toggle()
    End If
  End Select

ToggleStateがIndeterminateで返る可能性があるので、Onかどうかで判定してToggleする感じで考えてみた。

DefaltがTrueのチェックボックスで取得結果がIndeterminateだけどもチェック入ってる状況っていうコントロールがもしあれば、操作が失敗することになる。

 

2.RadioButtonコントロール

内部的には、SelectionItemPatternになってるみたい。

ListViewの時は、SelectionPatternが親でSelectionItemPatternが子になっているツリー構造だったんだけどもUI的にきちんとフレームとかでグルーピングされていないRadioButtonはどのボタン同士がグルーピングされているのか判別できる項目が見当たらなくて、ただSelectionItemPatternが並んでるだけに見える。

てことは、プロパティ値としてはListViewの中で選択されている項目とRadioButtonの選択項目は同じ様にIsSelectedプロパティ見るだけで判定/設定できるってことですね。

前回のListView項目選択のコードを拡張する形で考えるとこうかな。

' TargetElmには、操作対象のAutomationElementが取得されている状態
' ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
' 値の取得
Dim ptnVal As SelectionItemPattern = TargetElm.GetCurrentPattern(SelectionItemPattern.Pattern)
Console.WriteLine(ptnVal.Current.IsSelected)

' ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
' 値の設定
If (TargetElm.GetCurrentPropertyValue(AutomationElement.IsSelectionPatternAvailableProperty)) Then
  Dim itemElm As AutomationElement = TargetElm.FindFirst(TreeScope.Subtree, New PropertyCondition(AutomationElement.NameProperty, argVal))
  Dim ptnVal As SelectionItemPattern = itemElm.GetCurrentPattern(SelectionItemPattern.Pattern)
  ptnVal.Select()
ElseIf (TargetElm.GetCurrentPropertyValue(AutomationElement.IsSelectionItemPatternAvailableProperty)) Then
  Dim ptnVal As SelectionItemPattern = TargetElm.GetCurrentPattern(SelectionItemPattern.Pattern)
  ptnVal.Select()
End If

IsSelectionPatternAvailableがTrueだったら、子要素のIsSelectionItemPatternをSelectするし、IsSelectionItemPatternAvailableがTrueだったらそのままSelectするみたいな感じ。

これで、ComboBox・ListView・RadioButtonは共通的に項目選択ができるハズ。

 

3.本日の成果物

アップロード資材はこちら。

1.UIA_cmd.exeをWinActor.exeと同じフォルダに配置。

2.「スクリプト実行ノード張り付け用.txt」をスクリプト実行ノードに張り付け。

 

今回の更新で、操作の内容にGetToggle,SetToggleと、GetSelectionItemIsSelected,SetSelectionItemValueが追加されました。

今度は、このUIAutomationをVBSめーかーからキックできる様にしてみよう。

モバイルバージョンを終了