2011-05-25 72 views
1

我试图自动化一些UI测试。一旦你点击一个按钮,我有一个窗口可以基于一些文本框来计算某些东西。我已经正确地点击了按钮,但是我无法正确地获得分组的结果,因为在我检查测试中的正确答案之后正在调用calculate()方法。等待InvokePattern.Invoke()

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(); 

让我知道是否需要添加其他东西。谢谢!

+0

你在哪里调用Invoke?你是否在另一个线程中调用它,因为从你的描述来看,你听起来像在UI线程中调用它,这是没有意义的。 – alexD 2011-05-25 18:18:54

+0

我只是为了简单而在处理程序内部计算代码。我可以直接调用calculate方法,但我也希望通过自动化按钮点击来查看UI上的影响。我不认为从UI线程调用Invoke是问题,因为invoke立即返回,并且在调用时没有任何阻塞。 – wangburger 2011-05-25 18:19:21

回答

1

根据these guidelines,所述InvokedEvent应当由控制提出:

InvokedEvent对已经被激活的控制凸起(以执行其相关联的动作的控制的响应)。如果可能的话,在控制完成操作并且没有阻塞地返回之后应该提高事件。在以下情况下,在调用请求之前应调用Invoked事件:

要等到操作完成后才可能或不实际。

该操作需要用户交互。

该操作非常耗时,并且会导致呼叫客户端阻塞很长一段时间。

+0

我看过那篇文章,但它看起来更像是为UserContols等实现InvokePattern。应该在控制本身上提出InvokedEvent是什么意思? – wangburger 2011-05-25 21:11:10

+0

@wangburger,这不是我读过的。我的回答中的引用直接来自文章。我没有写这个。我理解它的方式是在控件处理/执行点击之后,应该提高此事件。如果控件执行此操作,则自动化客户端可以订阅此事件,并在所有处理完成后调用。 – 2011-05-26 04:15:46

+0

订阅该事件是我遇到 – wangburger 2011-05-27 13:01:48