Как избежать использования Thread.Sleep при использовании WPF Automation Framework? - PullRequest
2 голосов
/ 05 ноября 2010

Я пытаюсь использовать WPF UI Automation без использования ложных операторов thread.sleep.То, что я хотел бы сделать, это иметь функцию GetElementById, которая постоянно опрашивает, пока элемент управления не доступен (или тайм-аут происходит).Проблема в том, что он, кажется, кэширует дочерние элементы управления моего родительского элемента.Можно ли освежиться детям?Или у кого-нибудь есть альтернативный подход?

public AutomationElement GetElementById(string id, int timeout)
{
    if (timeout <= 1000) throw new ArgumentException("Timeout must be greater than 1000", "timeout");

    AutomationElement element = null;

    int timer = 0;
    const int delay = 100;

    do
    {       
        element = MainWindow.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, id));                
        Thread.Sleep(delay);
        timer += delay;
    } while (element == null && timer < timeout);

    if (element == null) throw new InvalidOperationException("Unable to find element with id: " + id);

    return element;
}

Ответы [ 2 ]

0 голосов
/ 05 ноября 2010

Если есть лучший способ, чем разумное использование Thread.Sleep, я еще не нашел его.

UIAutomation предоставляет События , и я полагаю, что вы могли бы (использовать ваш случай в качестве примера) прослушать событие, которое происходит, когда выбран TabItem, и только затем продолжить поиск элемента по Я бы. Но я подозреваю, что такого рода паттерн может повлиять на общую читабельность вашего кода.

0 голосов
/ 05 ноября 2010

Функция DoEvents, которая доступна в пространстве имен System.Windows.Forms.Application, используется для обновления пользовательского интерфейса во время продолжительного процесса.Он не является членом пространств имен WPF.Вы можете использовать что-то глупое, реализовав его самостоятельно, как в этой статье , или импортировав пространство имен System.Windows.Forms и вызвав Application.DoEvents.Это позволит продолжить другую обработку, пока вы выполняете опрос.Эту функцию следует использовать с осторожностью.

...