7

Microsoft UI Automation (つまり) を使用AutomationElementして、アプリケーションに対して自動受け入れテストを実行しています。これはうまくいきましたが、自動化フレームワークにさらされていないように見える状況に遭遇しました。

私はItemsControl(その派生コントロールの 1 つを使用することもできますが、たとえばListBox)を持っており、CollectionViewSource項目をグループ化するために使用しています。デモ用の完全なウィンドウを次に示します。

<Window x:Class="GroupAutomation.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Orchestra">
    <Window.Resources>

        <!-- Take some simple data -->
        <XmlDataProvider x:Key="SampleData" XPath="Orchestra/Instrument">
            <x:XData>
                <Orchestra xmlns="">
                    <Instrument Name="Flute" Category="Woodwind" />
                    <Instrument Name="Trombone" Category="Brass" />
                    <Instrument Name="French horn" Category="Brass" />
                </Orchestra>
            </x:XData>
        </XmlDataProvider>

        <!-- Add grouping -->
        <CollectionViewSource Source="{Binding Source={StaticResource SampleData}}" x:Key="GroupedView">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="@Category" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Window.Resources>

    <!-- Show it in an ItemsControl -->
    <ItemsControl ItemsSource="{Binding Source={StaticResource GroupedView}}" HorizontalAlignment="Left" Margin="4">
        <ItemsControl.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" />
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ItemsControl.GroupStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border Padding="4" Margin="4" Background="#FFDEDEDE">
                    <StackPanel>
                        <Label Content="{Binding XPath=@Name}" />
                        <Button Content="Play" />
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

これにより、カテゴリにグループ化されたアイテムを含むウィンドウが生成され、各アイテムには、UI オートメーションでクリックしたいボタンがあります。

リストが表示されたウィンドウのスクリーンショット
(ソース: brizzly.com )

ただし、UISpy.exeを見る(または で移動するAutomationElement) と、グループしか表示されません (Raw ビューであっても):

UIスパイ
(ソース: brizzly.com )

ご覧のとおり、グループはありますが、アイテムが含まれていないため、ボタンを探す場所がありません。WPF 3.5 SP1 と WPF 4.0 の両方でこれを試しましたが、同じ結果が得られました。

グループ化されたアイテムで UI オートメーションを使用することは可能ですか?

4

4 に答える 4

3

ボタンについては 100% 確信が持てませんTextBlockが、 内にあるコントロールは UI オートメーション ツリーに配置されません。どうやらこれは、何千もの不要なテキストブロックを避けるための最適化です。DataTemplate

TextBlock を SubClassing することで回避できます。これが私のものです:

public class AutomatableTextBlock : TextBlock
{
    protected override AutomationPeer OnCreateAutomationPeer()
    {
        return new AutomatableTextBlockAutomationPeer(this);
    }

    class AutomatableTextBlockAutomationPeer : TextBlockAutomationPeer
    {
        public AutomatableTextBlockAutomationPeer(TextBlock owner)
            : base(owner)
        { }

        protected override bool IsControlElementCore()
        { return true; }
    }
}

注: UI オートメーションは、 、 などの他のさまざまなコントロールも公開しませんCanvasPanelそれらを同様のサブクラスで表示させることができます。

そうは言っても、なぜ が表示されないのかButtonわかりません....うーん

于 2010-05-17T03:00:05.590 に答える
1

自動化されたスクリプトを作成するためにどのツールを使用していますか? Win32 ツリー (UISpy によって表面化) に依存するのではなく、WPF の論理/ビジュアル ツリーにドリルダウンするオプションがあると思いました。

Snoopを使用して同じアプリケーションを見ると、完全なビジュアル ツリーと論理ツリーが表示されます。

于 2010-05-05T12:49:22.080 に答える
1

を使用してテンプレートを見つけたTreeWalker.RawViewWalker後、手動でツリーをナビゲートすることで、アプリケーションでこれを解決することになりました。他の誰かのアプリケーションを自動化するときに必要なすべての情報を確実に除外しているようです。要素が「オブジェクトの検査」に表示されたときに機能するように見えますが、UISpy またはアプリケーションでは機能しません。AutomationElement.FindFirstFindFirstRawViewWalker

于 2011-11-17T19:13:46.130 に答える