Подождите на InvokePattern.Invoke () - PullRequest
1 голос
/ 25 мая 2011

Я пытаюсь автоматизировать тестирование пользовательского интерфейса. У меня есть окно, которое вычисляет что-то на основе некоторых текстовых полей, как только вы нажимаете кнопку. У меня правильно нажимается кнопка, но я не могу правильно получить результат вычисления, потому что метод Calculate () вызывается после того, как я проверяю правильный ответ в тесте.

InvokePattern pattern = element.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
pattern.Invoke();

Вызов Invoke () не блокируется, поэтому он немедленно возвращается и затем начинает проверять, сработал ли calculate(), даже если он еще не был вызван. Как я могу изменить вызов Invoke () так, чтобы он ждал, пока не будет вызван метод calc ()?

Элемент

является AutomationElement для моей кнопки.

 private void Button_Click(object sender, RoutedEventArgs e)
        {
            double v1 = 0;
            double v2 = 0;

            if(Double.TryParse(tbVal1.Text, out v1) && Double.TryParse(tbVal2.Text, out v2))
            {
                double output = v1 + v2;
                tbAnswer.Text = "The answer is " + output.ToString();
            }
        }

EDIT: В итоге я выбрал другой путь к своему решению, подписавшись на событие InvokePattern.InvokedEvent. Это позволило мне поместить любую необходимую логику в обработчик событий, чтобы реагировать на вызов AutomationElement.

InvokePattern pattern = element.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;

 Automation.AddAutomationEventHandler(InvokePattern.InvokedEvent, element, TreeScope.Element,
               new AutomationEventHandler(OnUIAutomationEvent));
  pattern.Invoke();

Дайте мне знать, если мне нужно добавить что-нибудь еще. Спасибо!

1 Ответ

1 голос
/ 25 мая 2011

Согласно этим рекомендациям , InvokedEvent должен быть вызван элементом управления:

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

Невозможно или практически невозможно дождаться завершения действия.

Действие требует взаимодействия с пользователем.

Действие отнимает много времени и приводит к блокировке вызывающего клиента в течение значительного периода времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...