none
Les tests Coded UI ne "voient" pas les deux dernières lignes d'une datagrid RRS feed

  • Question

  • Découvrant Coded UI, j'ai voulu l'essayer sur une application simple mais rencontre quelques problèmes avec les DataGrid.

    Voici le XAML de l'interface :

    <Window x:Class="CodedUITests.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:CodedUITests"
            mc:Ignorable="d"
            Title="MainWindow" Height="592.214" Width="580.71"
            DataContext="{Binding RelativeSource={RelativeSource Self}}">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="Auto"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <DataGrid Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" AutoGenerateColumns="True" ItemsSource="{Binding Items}" x:Name="ItemGrid" SelectedItem="{Binding SelectedItem}" EnableColumnVirtualization="False" EnableRowVirtualization="False"/>
            <StackPanel Grid.Column="1" Grid.Row="1" Orientation="Horizontal">
                <Button x:Name="Add"  Content="+" Width="25" Margin="5" Click="Add_Click"/>
                <Button x:Name="Remove" Content="-" Width="25" Margin="5" Click="Remove_Click"/>
            </StackPanel>
        </Grid>
    </Window>


    Items correspond à une propriété du type suivant :

    ObservableCollection<dynamic>

    Où dynamic est un objet crée dynamiquement et contenant un propriété "Nom" et "Prenom".

    Ma classe de test est la suivante :

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Text.RegularExpressions;
    using System.Windows.Input;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Threading;
    using Microsoft.VisualStudio.TestTools.UITesting;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using Microsoft.VisualStudio.TestTools.UITest.Extension;
    using Keyboard = Microsoft.VisualStudio.TestTools.UITesting.Keyboard;
    
    
    namespace CodedUITestProject
    {
        /// <summary>
        /// Summary description for CodedUITest2
        /// </summary>
        [CodedUITest]
        public class CodedUITest2
        {
    
            private const int Repeat = 10;
            private Process _appProcess;
    
            public CodedUITest2()
            {
            }
    
            [TestInitialize]
            public void LaunchApp()
            {
                this._appProcess = Process.Start(@"..\..\..\CodedUiTests\bin\Debug\CodedUITests.exe");
            }
    
            [TestCleanup]
            public void ExitApp()
            {
                this._appProcess.CloseMainWindow();
            }
    
            [TestMethod]
            public void CodedUITestMethod1()
            {
                // To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
                var names = new List<string>() { "toto", "tata", "John", "Jane", "Doe", "Dane" };
                var rdm = new Random(DateTime.Now.Millisecond);
                var initialRowCount = this.UIMap.ExistingRowCount();
    
                for (int i = 0; i < Repeat; i++)
                {
                    var row = i + initialRowCount;
                    //On prépare les paramètres de l'exécution
                    this.UIMap.CreateItemParams.UIValue1TextEditText = names[rdm.Next(0, names.Count)];
                    this.UIMap.CreateItemParams.UIValue2TextEditText = names[rdm.Next(0, names.Count)];
    
                    //On exécute
                    this.UIMap.CreateItem();
    
                    //On vérifie les valeurs -- Crash sur n'importe laquelle des deux lignes après quelques itérations
                    this.UIMap.ValidateCell(row, 0, this.UIMap.CreateItemParams.UIValue1TextEditText);
                    this.UIMap.ValidateCell(row, 1, this.UIMap.CreateItemParams.UIValue2TextEditText);
    
    
                    //On Vérifie les valeurs totales
                    this.UIMap.TestTotalItemsNumberAndColumnsExpectedValues.UIItemGridTableColumnCount = 2;
                    this.UIMap.TestTotalItemsNumberAndColumnsExpectedValues.UIItemGridTableRowCount = row + 1;
                    this.UIMap.TestTotalItemsNumberAndColumns();
                }
    
                this.UIMap.RemoveItem();
                Assert.AreEqual(initialRowCount + Repeat - 1, this.UIMap.ExistingRowCount());
    
            }
    
            #region Additional test attributes
    
            // You can use the following additional attributes as you write your tests:
    
            ////Use TestInitialize to run code before running each test 
            //[TestInitialize()]
            //public void MyTestInitialize()
            //{        
            //    // To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
            //}
    
            ////Use TestCleanup to run code after each test has run
            //[TestCleanup()]
            //public void MyTestCleanup()
            //{        
            //    // To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
            //}
    
            #endregion
    
            /// <summary>
            ///Gets or sets the test context which provides
            ///information about and functionality for the current test run.
            ///</summary>
            public TestContext TestContext
            {
                get
                {
                    return this.testContextInstance;
                }
                set
                {
                    this.testContextInstance = value;
                }
            }
            private TestContext testContextInstance;
    
            public UIMap UIMap
            {
                get
                {
                    if ((this.map == null))
                    {
                        this.map = new UIMap();
                    }
    
                    return this.map;
                }
            }
    
            private UIMap map;
        }
    }

    ValidateCell est une méthode définie dans le partial UiMap.cs de la manière suivante :

    private WpfCell FindCell(int row, int column)
    {
        return this.UIMainWindowWindow2.UIItemGridTable.GetCell(row, column);
    }

    Après quelques itérations, impossible de trouver la cellule dans la table.

    J'ai tenté de définir la configuration "AlwaysSearch" pour la table dans le fichier UIMap.uitest sans effet.

    La grille n'est pas virtualisée.J'utilises Visual Studio 2015 et le projet de test à pour cible le .NET Framework 4.6.1. J'ai reproduit l'erreur Sur Windows 10 et Windows Server 2012 R2

    La propriété RowCount de la grille retourne le bon nombre de lignes, mais la propriété Count de la collection de Rows portée par la grille retourne un nombre inférieur (quand le crash se produit)

    L'erreur est la très classique :

    La méthode de test CodedUITestProject.CodedUITest2.CodedUITestMethod1 a levé une exception : 
    Microsoft.VisualStudio.TestTools.UITest.Extension.UITestControlNotFoundException: Contrôle avec les propriétés de recherche données introuvable. Informations supplémentaires : 
    TechnologyName : 'UIA'
    FrameworkId : 'Wpf'
    ControlType : 'Cell'
    RowIndex : '4'
    ColumnIndex : '0'
     Échec possible de la recherche au niveau de 'ItemGrid' Table car il possède peut-être des enfants virtualisés. Si le contrôle recherché est un descendant de 'ItemGrid' Table, son inclusion en tant que conteneur parent peut éventuellement résoudre le problème. ---> System.Runtime.InteropServices.COMException: Une erreur HRESULT E_FAIL a été retournée à partir d'un appel à un composant COM.

    Merci d'avance pour toute aide


    mercredi 19 octobre 2016 10:18