等待InvokePattern.Invoke()

时间:2011-05-25 18:01:50

标签: c# wpf automation

我正在尝试自动化一些UI测试。我有一个窗口,一旦你点击一个按钮,就可以根据一些文本框来计算。我已经正确地点击了按钮,但是我无法正确得到claculation的结果,因为在我检查测试中的正确答案后调用了calculate()方法。

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

调用Invoke()不会阻塞,因此它会立即返回,然后开始检查calculate()是否有效,即使它尚未被调用。如何更改Invoke()调用以使其等到调用calculate()之后?

元素是我按钮的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();
            }
        }

编辑: 通过订阅InvokePattern.InvokedEvent事件,我最终采用了不同的方法来解决我的问题。这允许我将所需的任何逻辑放入事件处理程序,以响应对AutomationElement的调用。

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

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

如果我需要添加任何其他内容,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:1)

根据these guidelines,InvokedEvent应由控件引发:

  

在已激活的控件上引发InvokedEvent(作为对执行其关联操作的控件的响应)。如果可能,应在控件完成操作后引发事件,并在不阻塞的情况下返回。在以下情况下服务Invoke请求之前,应该引发Invoked事件:

     

等待行动完成是不可能或不切实可行的。

     

该操作需要用户互动。

     

该操作非常耗时,会导致调用客户端阻塞很长时间。