2016-11-28 13 views
1

Windows AutomationElementを使用して、テスト中にユーザー入力をシミュレートします。 私の特定の用途はListBoxの選択を管理しており、私がオンラインで見つけたものから、それを操作するためにリストボックスのAutomationElementが必要になります。私はデスクトップ(AutomationElement.RootElement)から私の検索を起動せずにそれを見つけることができる必要があり、ユーザーコントロールへの参照を持っているのでWPF UserControlのAutomationElementを取得します。

<Window x:Class="CryptoAdmin_Test.Helper.FreshWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:CryptoAdmin_Test.Helper"> 
    <StackPanel> 
     <UserControl x:FieldModifier="public" x:Name="FindMe" /> 
    </StackPanel> 
</Window> 

は、私はこのようなウィンドウを持っていたとします。

window.FindMeUserControlにはAutomationElementを取得する最も早い方法は何ですか?

を使用するAutomationElement.RootElement.FindFirst(...);を使用すると、デスクトップから開始されますが、この検索を高速にするための一般的な方法は偽陽性の可能性なしでは表示されません。

答えて

0

これは、これを見つけるための最速の方法です。これはまた、ウィンドウに名前を付けることを前提としています。そうしないと、アプリケーションからプロセスを開始し、そのプロセスIDを持っていなければ見つけるのがかなり難しくなるからです。

AutomationElement mainWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "MainWindow")); 
AutomationElement findMe = mainWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "FindMe")); 

TreeScopeは子供に設定されているので、問題の要素を探すときにツリー全体をスキャンしません。あなたのユーザーコントロールが何をするかによって、あなたが戻ってくる要素は役に立たないかもしれません。あなたができる唯一のことについてあなたのコントロールのためのいくつかのカスタムパターンを実装することなく、それから他の要素を得ることです。

+0

ええ、私はルートから始まらずに何かを見つけようとしなければならなくなりました。 – Johannes

関連する問題