我正在尝试自动化一些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();
如果我需要添加任何其他内容,请告诉我。谢谢!
答案 0 :(得分:1)
根据these guidelines,InvokedEvent应由控件引发:
在已激活的控件上引发InvokedEvent(作为对执行其关联操作的控件的响应)。如果可能,应在控件完成操作后引发事件,并在不阻塞的情况下返回。在以下情况下服务Invoke请求之前,应该引发Invoked事件:
等待行动完成是不可能或不切实可行的。
该操作需要用户互动。
该操作非常耗时,会导致调用客户端阻塞很长时间。