среда, 13 февраля 2013 г.

CodedUITest. Работа с ComboBox.


Продолжу рассказывать про работу с разными контролами в CodedUITest. Теперь настала очередь ComboBox. Для работы с этим контролом в CodedUITest служит класс WpfComboBox.
Будем работать со следующим небольшим приложением, содержащим два контрола ComboBox:


  

Первый служит для выбора студента, второй – для выбора предмета. Рассмотрим работу с каждым из них.
Если посмотреть через UISpy структуру второго контрола ComboBox для выбора предмета, мы увидим следующее:

  
В качестве имени элемента списка (ListBoxItem) ComboBox’а выводится сам текст элемента. Тут с точки зрения автоматизации не возникает никаких проблем, стандартных методов класса WpfComboBox  для работы с ComboBox достаточно. 
При просмотре структуры второго ComboBox’а через UISpy получается следующая картина


Тут  все не так просто. Здесь мы видим, что у элементов списка ComboBox в свойстве Name выводится не само значение элемента списка, которое мы видим в запущенном приложении, а полное имя класса, к списку объектов которого осуществляется привязка в коде xaml приложения – “Lena.Student”.  Углубимся немножко в структуру тестируемого приложения. В xaml реализация ComboBox выглядит так:

<ComboBox Grid.Column="1" ItemsSource="{Binding Path=Students}" ItemContainerStyle="{StaticResource StudentStyle}">

Класс viemodel выглядит так:

    public class MainVM    
    {
        public ObservableCollection<Student> Students { get { return students; } }
        private readonly ObservableCollection<Student> students =
            new ObservableCollection<Student>();
 
        public MainVM()
        {
            this.Students.Add(new Student() { Age = 20, FirstName = "Василий", LastName = "Пупкин", SecondName = "Васильевич", GroupName = "ИС-54"  });
            this.Students.Add(new Student() { Age = 21, FirstName = "Олег", LastName = "Куркин", SecondName = "Олегович", GroupName = "АИ-32" });
            this.Students.Add(new Student() { Age = 23, FirstName = "Борис", LastName = "Дубин", SecondName = "Борисович", GroupName = "ИС-89" });
            this.Students.Add(new Student() { Age = 22, FirstName = "Юлия", LastName = "Коновалкина", SecondName = "Александровна", GroupName = "ТМ-12" });
            this.Students.Add(new Student() { Age = 20, FirstName = "Софья", LastName = "Порейко", SecondName = "Порейко", GroupName = "ТМ-16" });
 
        }
    }


Класс студента выглядит так:

    public class Student
    {
        public string LastName { getset; }
 
        public string FirstName { getset; }
 
        public string SecondName { getset; }
 
        public int Age { getset; }
 
        public string GroupName { getset; }
    }


Поскольку при работе с элементами ComboBox используется именно значение свойства Name контрола ListBoxItem, стандартные методы класса WpfComboBox для работы с ComboBox в данном случае отрабатывать не будут. Например,

Console.WriteLine(comboBox.SelectedItem);
            
выведет нам на экран значение «Lena.Student».
Что тут можно сделать?
Тут на помощь могут прийти разработчики. Простое переопределение метода ToString() класса, к которому привязывается ComboBox (в нашем случае класс Student), поможет решить проблему:

    public class Student
    {
        public string LastName { getset; }
 
        public string FirstName { getset; }
 
        public string SecondName { getset; }
 
        public int Age { getset; }
 
        public string GroupName { getset; }
 
        public override string ToString()
        {
            return LastName + " " + FirstName + " " + SecondName + " " + Age + " " + GroupName;
        }
    }

Теперь структура ComboBox при просмотре через UISpy выглядит так:


И для работы с ComboBox можно использовать стандартные методы класса WpfComboBox из фреймворка CodedUITest. Например, та же самая строчка вывода значения выбранного элемента в Combobox'е:
Console.WriteLine(comboBox.SelectedItem);
выведет нам на экран значение «Пупкин Василий Васильевич 20 ИС-54».

Комментариев нет:

Отправить комментарий