Windows UI Automation API在服务器上运行时无法查找子元素

时间:2012-07-09 21:48:53

标签: c# nunit-2.5 microsoft-ui-automation

我正在使用NUnit 2.5.10测试中的Microsoft UI Automation API来为WPF应用程序执行自动UI测试。

在某些情况下,在我的开发计算机上运行测试能够找到某些UI元素,但是当在我们的构建代理计算机上针对相同的二进制文件运行相同的脚本时,它无法找到这些元素。

我找不到代理机器行为不同的任何原因。我怀疑它与UIAccess标志或UAC有关,但没有遇到任何具体问题。

任何人都可以提供一些指导,说明为什么构建代理会有不同的行为,或者如何修复代理以查看与其他计算机相同的元素?

例如,我有一个comboBox,里面有十几个选项。使用Win7 SDK中的“Inspect Objects”工具,我可以看到每个选项都有一个包含实际显示文本的子元素。所以在我的测试代码中,我做了类似的事情:

// get the child elements
var options = comboBoxElement.FindAll(TreeScope.Children, (System.Windows.Automation.Condition) new PropertyCondition(AutomationElement.IsControlElementProperty, (object) true));

foreach (AutomationElement child in viewOptions)
{
    var subControls = child.GetChildren();
    Console.WriteLine("Child: {0} w/ {1} children", child.Current.Name,  subControls.Count);
    foreach (AutomationElement subControl in subControls)
        Console.WriteLine("SubControl: {0}", subControl.Current.Name);
}

在我的开发机器上,我得到了这些结果:

Child: My.BoundObject.ClassName w/ 1 children
SubControl: Displayed Text for first item
Child: My.BoundObject.ClassName w/ 1 children
SubControl: Displayed Text for second item
Child: My.BoundObject.ClassName w/ 1 children
SubControl: Displayed Text for third item

但是在服务器上,我得到了这个:

Child: My.BoundObject.ClassName w/ 0 children
Child: My.BoundObject.ClassName w/ 0 children
Child: My.BoundObject.ClassName w/ 0 children

在这两种情况下,Inspect Objects都会显示子对象。 Inspect Options screenshot

构建代理和本地计算机都运行带有.Net 4的Windows 7 SP1。在这两种情况下,我都运行nunit-console.exe来启动测试。我正在复制机器之间的整个环境,因此它不仅是nunit和我的应用程序的二进制文件的相同版本,它完全相同的文件,配置,库等.nunit-console以管理员用户身份运行。 / p>

2 个答案:

答案 0 :(得分:6)

在多台计算机上运行方案后,我能够确定安装了.Net 4.5的计算机能够访问子元素,而只有.Net 4.0的计算机不能访问子网元素。请注意,应用程序和测试都是针对.Net 4.0编译的。

希望这有助于遇到此问题的其他任何人。

答案 1 :(得分:0)

请选择Windows的用户版本而不是服务器版本。即Windows / Windows7 / Windows2008上的XP / Windows7。在Windows的服务器版本中,UIA的自动化支持通常较差。

check out here