我正在尝试使用.NET UI自动化框架来自动化WinForms应用程序上的一些测试。该应用程序包含一些WPF用户控件。
登录到应用程序时,Thread.CurrentPrincipal设置为继承自GenericPrincipal的自定义主体。然后将其用于权限检查。
我已设法自动登录到应用程序并打开一个承载WPF用户控件的表单。在各个点检查Thread.CurrentPrincipal并返回具有自定义类型的正确对象。
当我自动点击WPF用户控件上的按钮时会出现问题:
var btnNewSet = setBuilderView.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, "btnNewSet"));
btnNewSet.SetFocus();
Thread.Sleep(1500);
btnNewSetInvokePattern = (InvokePattern) btnNewSet.GetCurrentPattern(InvokePattern.Pattern);
btnNewSetInvokePattern.Invoke();
按钮单击事件触发,然后我的应用程序抛出异常,因为Thread.CurrentPrincipal返回基类型GenericPrincipal的对象,而不是先前设置的自定义主体。
上面的代码没有什么特别之处 - 它与我在应用程序中调用WinForms按钮使用的代码相同。
如果我在点击按钮之前停止自动测试,然后用鼠标手动点击按钮,一切正常,当前主体的类型正确。
值得一提的是,应用程序中的WinForms按钮连接到标准的单击事件处理程序,而WPF按钮则绑定到ICommand的实例(例如)。
这看起来像是一个线程问题,但我无法弄清楚。
有谁知道这里会发生什么?