속성 조건을 기반으로 UI 자동화 요소 찾기
참고 |
---|
이 문서는 System.Windows.Automation 네임스페이스에 정의된 관리되는 UI Automation 클래스를 사용하려는 .NET Framework 개발자를 위해 작성되었습니다.UI Automation에 대한 최신 정보는 Windows Automation API: UI Automation을 참조하십시오. |
이 항목에는 특정 속성을 기반으로 UI Automation 트리 내에서 요소를 찾는 방법을 보여 주는 예제 코드가 나와 있습니다.
예제
다음 예제에서는 AutomationElement 트리에서 원하는 특정 요소를 식별하는 속성 조건 집합을 지정합니다. 그런 다음 일치하는 요소 수를 줄이기 위해 일련의 AndCondition 부울 연산을 결합하는 FindAll 메서드를 사용하여 일치하는 모든 요소를 검색하는 작업을 수행합니다.
참고 |
---|
RootElement에서 검색하는 경우 바로 아래 자식 요소만 검색해야 합니다.모든 하위 항목을 검색하면 수백 또는 수천 개의 요소에서 검색 작업이 반복되어 스택 오버플로가 발생할 수 있습니다.하위 수준에 있는 특정 요소를 찾으려는 경우 하위 수준에 있는 컨테이너나 응용 프로그램 창에서 검색을 시작해야 합니다. |
'''--------------------------------------------------------------------
''' <summary>
''' Walks the UI Automation tree of the target and reports the control
''' type of each element it finds in the control view to the client.
''' </summary>
''' <param name="targetTreeViewElement">
''' The root of the search on this iteration.
''' </param>
''' <param name="treeviewIndex">
''' The TreeView index for this iteration.
''' </param>
''' <remarks>
''' This is a recursive function that maps out the structure of the
''' subtree beginning at the AutomationElement passed in as
''' rootElement on the first call. This could be, for example,
''' an application window.
''' CAUTION: Do not pass in AutomationElement.RootElement. Attempting
''' to map out the entire subtree of the desktop could take a very
''' long time and even lead to a stack overflow.
''' </remarks>
'''--------------------------------------------------------------------
Private Sub FindTreeViewDescendants( _
ByVal targetTreeViewElement As AutomationElement, _
ByVal treeviewIndex As Integer)
If (IsNothing(targetTreeViewElement)) Then
Return
End If
Dim elementNode As AutomationElement = _
TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement)
While Not (elementNode Is Nothing)
Dim elementInfo As New Label()
elementInfo.Margin = New Thickness(0)
clientTreeViews(treeviewIndex).Children.Add(elementInfo)
' Compile information about the control.
elementInfoCompile = New StringBuilder()
Dim controlName As String
If (elementNode.Current.Name = "") Then
controlName = "Unnamed control"
Else
controlName = elementNode.Current.Name
End If
Dim autoIdName As String
If (elementNode.Current.AutomationId = "") Then
autoIdName = "No AutomationID"
Else
autoIdName = elementNode.Current.AutomationId
End If
elementInfoCompile.Append(controlName).Append(" (") _
.Append(elementNode.Current.ControlType.LocalizedControlType) _
.Append(" - ").Append(autoIdName).Append(")")
' Test for the control patterns of interest for this sample.
Dim objPattern As Object = Nothing
Dim expcolPattern As ExpandCollapsePattern
If True = elementNode.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, objPattern) Then
expcolPattern = DirectCast(objPattern, ExpandCollapsePattern)
If expcolPattern.Current.ExpandCollapseState <> ExpandCollapseState.LeafNode Then
Dim expcolButton As New Button()
expcolButton.Margin = New Thickness(0, 0, 0, 5)
expcolButton.Height = 20
expcolButton.Width = 100
expcolButton.Content = "ExpandCollapse"
expcolButton.Tag = expcolPattern
AddHandler expcolButton.Click, AddressOf ExpandCollapse_Click
clientTreeViews(treeviewIndex).Children.Add(expcolButton)
End If
End If
Dim togPattern As TogglePattern
If True = elementNode.TryGetCurrentPattern(TogglePattern.Pattern, objPattern) Then
togPattern = DirectCast(objPattern, TogglePattern)
Dim togButton As New Button()
togButton.Margin = New Thickness(0, 0, 0, 5)
togButton.Height = 20
togButton.Width = 100
togButton.Content = "Toggle"
togButton.Tag = togPattern
AddHandler togButton.Click, AddressOf Toggle_Click
clientTreeViews(treeviewIndex).Children.Add(togButton)
End If
Dim invPattern As InvokePattern
If True = elementNode.TryGetCurrentPattern(InvokePattern.Pattern, objPattern) Then
invPattern = DirectCast(objPattern, InvokePattern)
Dim invButton As New Button()
invButton.Margin = New Thickness(0)
invButton.Height = 20
invButton.Width = 100
invButton.Content = "Invoke"
invButton.Tag = invPattern
AddHandler invButton.Click, AddressOf Invoke_Click
clientTreeViews(treeviewIndex).Children.Add(invButton)
End If
' Display compiled information about the control.
elementInfo.Content = elementInfoCompile
Dim sep As New Separator()
clientTreeViews(treeviewIndex).Children.Add(sep)
' Iterate to next element.
' elementNode - Current element.
' treeviewIndex - Index of parent TreeView.
FindTreeViewDescendants(elementNode, treeviewIndex)
elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode)
End While
End Sub 'FindTreeViewDescendants
///--------------------------------------------------------------------
/// <summary>
/// Walks the UI Automation tree of the target and reports the control
/// type of each element it finds in the control view to the client.
/// </summary>
/// <param name="targetTreeViewElement">
/// The root of the search on this iteration.
/// </param>
/// <param name="elementIndex">
/// The TreeView index for this iteration.
/// </param>
/// <remarks>
/// This is a recursive function that maps out the structure of the
/// subtree of the target beginning at the AutomationElement passed in
/// as the rootElement on the first call. This could be, for example,
/// an application window.
/// CAUTION: Do not pass in AutomationElement.RootElement. Attempting
/// to map out the entire subtree of the desktop could take a very
/// long time and even lead to a stack overflow.
/// </remarks>
///--------------------------------------------------------------------
private void FindTreeViewDescendants(
AutomationElement targetTreeViewElement, int treeviewIndex)
{
if (targetTreeViewElement == null)
return;
AutomationElement elementNode =
TreeWalker.ControlViewWalker.GetFirstChild(targetTreeViewElement);
while (elementNode != null)
{
Label elementInfo = new Label();
elementInfo.Margin = new Thickness(0);
clientTreeViews[treeviewIndex].Children.Add(elementInfo);
// Compile information about the control.
elementInfoCompile = new StringBuilder();
string controlName =
(elementNode.Current.Name == "") ?
"Unnamed control" : elementNode.Current.Name;
string autoIdName =
(elementNode.Current.AutomationId == "") ?
"No AutomationID" : elementNode.Current.AutomationId;
elementInfoCompile.Append(controlName)
.Append(" (")
.Append(elementNode.Current.ControlType.LocalizedControlType)
.Append(" - ")
.Append(autoIdName)
.Append(")");
// Test for the control patterns of interest for this sample.
object objPattern;
ExpandCollapsePattern expcolPattern;
if (true == elementNode.TryGetCurrentPattern(ExpandCollapsePattern.Pattern, out objPattern))
{
expcolPattern = objPattern as ExpandCollapsePattern;
if (expcolPattern.Current.ExpandCollapseState != ExpandCollapseState.LeafNode)
{
Button expcolButton = new Button();
expcolButton.Margin = new Thickness(0, 0, 0, 5);
expcolButton.Height = 20;
expcolButton.Width = 100;
expcolButton.Content = "ExpandCollapse";
expcolButton.Tag = expcolPattern;
expcolButton.Click +=
new RoutedEventHandler(ExpandCollapse_Click);
clientTreeViews[treeviewIndex].Children.Add(expcolButton);
}
}
TogglePattern togPattern;
if (true == elementNode.TryGetCurrentPattern(TogglePattern.Pattern, out objPattern))
{
togPattern = objPattern as TogglePattern;
Button togButton = new Button();
togButton.Margin = new Thickness(0, 0, 0, 5);
togButton.Height = 20;
togButton.Width = 100;
togButton.Content = "Toggle";
togButton.Tag = togPattern;
togButton.Click += new RoutedEventHandler(Toggle_Click);
clientTreeViews[treeviewIndex].Children.Add(togButton);
}
InvokePattern invPattern;
if (true == elementNode.TryGetCurrentPattern(InvokePattern.Pattern, out objPattern))
{
invPattern = objPattern as InvokePattern;
Button invButton = new Button();
invButton.Margin = new Thickness(0);
invButton.Height = 20;
invButton.Width = 100;
invButton.Content = "Invoke";
invButton.Tag = invPattern;
invButton.Click += new RoutedEventHandler(Invoke_Click);
clientTreeViews[treeviewIndex].Children.Add(invButton);
}
// Display compiled information about the control.
elementInfo.Content = elementInfoCompile;
Separator sep = new Separator();
clientTreeViews[treeviewIndex].Children.Add(sep);
// Iterate to next element.
// elementNode - Current element.
// treeviewIndex - Index of parent TreeView.
FindTreeViewDescendants(elementNode, treeviewIndex);
elementNode =
TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
}
}
참고 항목
작업
InvokePattern, ExpandCollapsePattern, and TogglePattern Sample