CodedUI "FindMatchingControls ()" работает 10% времени, но обычно возвращает около половины элементов управления - PullRequest
0 голосов
/ 03 октября 2018

Проблема: Я использую FindMatchingControls () для создания коллекции строк в таблице WPF.Я написал цикл, который будет устанавливать ComboBox в каждой строке на заданное значение.Иногда все это работает, но чаще всего FindMatchingControls () фактически находит около половины строк.Как я могу настроить тайм-ауты или изменить настройки, чтобы он каждый раз находил все 50 элементов управления или, возможно, чтобы найти первые 10, а затем найти следующие 10 и т. Д.?

Фон : я тестируюокно WPF и на нем есть таблица, у каждой строки в таблице есть выпадающий список.Есть 50 строк, и в будущем их может быть больше, поэтому я не могу записать настройки каждого из них, мой записанный тест будет устаревшим с каждой новой версией (каждый месяц или около того).

Поэтому я записал значение 1 ComboBox, а затем использовал FindMatchingControls () для создания Коллекции.Я перебираю коллекцию, устанавливая каждый ComboBox в этой коллекции на желаемый выбор.Первые 23 строки показаны на моем текущем разрешении экрана.Единственная проблема заключается в том, что FindMatchingControls () иногда возвращает 23, иногда 26, иногда 34, а иногда возвращает все 50 строк!У меня вопрос, как мне исправить приведенный ниже код, чтобы он всегда возвращал все 50 строк (и, возможно, больше в будущем).

Из кода видно, что я дважды обнаружил родительский элемент управления, поэтому псевдокодниже.

Код Psuedo :

1) Найти родительский контейнер (таблица) 2) Определить строку (которая является дочерней по отношению к родительской таблице) 3) Использовать FindMatchingControlsчтобы получить коллекцию строк 4) Выполните цикл по Коллекции, найдите ComboBox в каждой строке и установите для его выбора значение, переданное в метод.

КОД:

    public void PlaceAnOrderScreen_SelectItems_List(String item /*Value to set all 50 ComboBoxes to*/)
    {
        WpfControl rowOfOrderItems = new WpfControl(this.UIOptimalOrderSystemClientShWindow.UIItemCustom22.UIListViewAutoID37Table);
        rowOfOrderItems.SearchProperties[WpfControl.PropertyNames.ControlType] = "DataItem";
        rowOfOrderItems.SearchProperties[WpfControl.PropertyNames.ClassName] = "Uia.ListViewItem";
        rowOfOrderItems.WindowTitles.Add("Order Management System");

        rowOfOrderItems.Find();
        rowOfOrderItems.DrawHighlight();  //Visible diagnostic

        //should get a collection of 50 controls ...
        //... but this is dodgy, it sometimes finds 23, 26, 34 or ocassionaly all 50 controls.
        //There are 23 visible controls and the rest, you have to scroll down to see.
        UITestControlCollection itemRows = rowOfOrderItems.FindMatchingControls();

        int c = 0;
        int i = 1;
        string label = String.Empty;

        foreach (var auditSelectionBox in itemRows)
        {
            //After the top 15 drop down selections have been made, strat scrolling down.
            //This is because setting the Value for a list box that is off the screen
            //causes it to complain the control is blocked...
            if (c >= 15)
            {
                if (i >= 3) //The scroll wheel moves 3 rows at a time, so only scroll once for every 3 rows...
                {
                    Mouse.MoveScrollWheel(-1);
                    i = 0;
                }                    
            }
            i++;
            c++;

            WpfCell auditDDL1 = new WpfCell(auditSelectionBox);
            auditDDL1.SearchProperties[WpfCell.PropertyNames.ColumnHeader] = "Total";
            auditDDL1.WindowTitles.Add("OrderSystem 5");

            //Works but takes 5 - 16 seconds per drop down list
            auditDDL1.Value = item;
        }
    }    

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

PixelPlex (выше) предоставил лучший ответ.Все, что я должен был добавить к коду PixelPlex, это оператор If, чтобы установить ComboBox в значение, когда оно было найдено.Таким образом, foreach, как показано ниже, в моем случае ...

            foreach (UITestControl childControl in parentControl.GetChildren())
            {
                children.Add(GetChildControls(childControl));

                //Added below If statement to set ComboBox selected item to "Carrots"...
                if (childControl.ClassName == "Uia.ComboBox")
                {
                    WpfComboBox cb = (WpfComboBox)childControl; 
                    cb.SelectedItem = "Carrots";
                }
            }

Это выбирает морковь из моего ComboBox ... Все, что не удовлетворяет моему утверждению If, не имеет значения, поэтому я ничего с ним не делаю.

0 голосов
/ 04 октября 2018

Вместо того, чтобы пытаться найти совпадающие элементы управления на основе другой строки, вы можете использовать метод, который берет родителя (в вашем случае таблицу) и возвращает все его дочерние элементы рекурсивным способом.Он копается до тех пор, пока не будут найдены все доступные дети.Не должно иметь значения, сколько строк имеет ваша таблица, она попытается получить их все.Его можно использовать для любого UITestControl.

public ParentControl GetChildControls(UITestControl parentControl)
{
    ParentControl parent = new ParentControl();

    if (parentControl != null)
    {
        List<ParentControl> children = new List<ParentControl>();

        foreach (UITestControl childControl in parentControl.GetChildren())
        {
            children.Add(GetChildControls(childControl));
        }

        parent.Children = new KeyValuePair<UITestControl, List<ParentControl>>(parentControl, children);
    }

    return parent;
}

Родительский класс

public class ParentControl
{
    public KeyValuePair<UITestControl, List<ParentControl>> Children { get; set; }
    public string Value
    {
        get
        {
            return Children.Key.Name;
        }
    }
}

Я только что добавил свойство Value для быстрого доступа к имени UITestControl.

...