2014-01-27 15 views
6

Ich habe eine kleine WPF-Anwendung erstellt (um zu erfahren, wie Coded UI Testing funktioniert). Meine Anwendung enthielt eine ItemsControl, aber UIMap konnte nicht gefunden werden das entsprechende Steuerelement.Wie erhalten Sie den Microsoft Coded UI Test Builder zum Erkennen eines ItemsControl?

XAML:

<ItemsControl ItemsSource="{Binding Path=Customers, Mode=OneTime}" 
       AutomationProperties.AutomationId="CustomersItemsControl"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock AutomationProperties.AutomationId="{Binding Path=Id, StringFormat='Customer_{0}', Mode=OneWay}" 
         Margin="5"> 
       <TextBlock.Text> 
        <MultiBinding StringFormat="{}{1}, {0}"> 
         <Binding Path="FirstName" /> 
         <Binding Path="LastName" /> 
        </MultiBinding> 
       </TextBlock.Text> 
      </TextBlock> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Das Problem, das ich habe, ist, dass, obwohl WPF eine ItemsControlAutomationPeer hat, kann der Test der codierten UI Builder nicht die Kontrolle orten zum UIMap hinzugefügt werden. Die einzige Möglichkeit, die ich bekam, war, das root AutomationElement zu bekommen und dann die TreeWalker.ControlViewWalker (ich benutzte den Code, der in this answer gefunden wurde) zu verwenden, aber diese Lösung gibt mir keinen Zugriff auf die Steuerung selbst, nur die AutomationElement. Im Idealfall, da es einen AutomationPeer für das Steuerelement gibt, habe ich mich gefragt, ob es einen besseren Weg gibt, dieses Steuerelement zu erreichen (selbst wenn es unmöglich ist, für die UIMap zu gelangen).


Auch eine Randnotiz. Ich verstehe schon, dass Visual Studio TextBlock s bei Coded UI Testing ignoriert, weil es so viele produziert werden kann. Im Moment bin ich mehr daran interessiert, an die ItemsControl selbst zu kommen, nicht die einzelnen TextBlock s, die daraus generiert werden.

Antwort

4

Nachdem ich ein wenig in dieses Problem gegraben habe, fand ich eine Semi-Lösung. Ich sah, wie die UIMap Designer-Dateien erzeugen ihren Code für ein ListView (Ich kann das ein bisschen für meine eigenen Variablen eingestellt):

var itemscontrol = new WpfList(window); 
itemscontrol.SearchProperties[WpfList.PropertyNames.AutomationId] = "CustomersItemsControl"; 
itemscontrol.WindowTitles.Add("MainWindow"); 

var count = itemscontrol.Items.Count(); // Returns the correct value! 

ich diesen Code kopiert und es scheint, als auch für ein ItemsControl zu arbeiten, bei zumindest einige Eigenschaften wie WpfList.Items. Also, es ist eine Teillösung, denke ich.