C# UIACOMWRAPER无法返回以前已折叠的WPF控件的子节点
我试图在WPF应用程序上创建编码的UI测试。我正在使用Visual Studio 2019创建/运行测试 我遇到了一个奇怪的行为,启动时折叠的WPF按钮(但后来变为可见/启用)没有使用与按钮关联的AutomationElement对象可用的任何FindXXX方法显示任何子节点。其他未折叠的按钮似乎没有此问题。我应该注意到,我希望此WPF按钮具有子节点的原因是,在XAML中,它的定义类似于以下内容:C# UIACOMWRAPER无法返回以前已折叠的WPF控件的子节点,c#,.net,wpf,coded-ui-tests,microsoft-ui-automation,C#,.net,Wpf,Coded Ui Tests,Microsoft Ui Automation,我试图在WPF应用程序上创建编码的UI测试。我正在使用Visual Studio 2019创建/运行测试 我遇到了一个奇怪的行为,启动时折叠的WPF按钮(但后来变为可见/启用)没有使用与按钮关联的AutomationElement对象可用的任何FindXXX方法显示任何子节点。其他未折叠的按钮似乎没有此问题。我应该注意到,我希望此WPF按钮具有子节点的原因是,在XAML中,它的定义类似于以下内容: <Button x:Name="ButtonStop" Grid.Row="0" Grid.
<Button x:Name="ButtonStop" Grid.Row="0" Grid.Column="2" Command="{Binding TheVm.StopCommand}">
<Button.Style>
<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyleA}">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding TheVm.DisplayButton}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
<StackPanel Style="{StaticResource ControlsStackPanelStyle}">
<Image Source="pack://application:,,,/Assets/icon1.png" Style="{StaticResource ControlsButtonImageStyle}"/>
<ContentPresenter Content="Stop" Style="{StaticResource ControlsButtonTextStyle}"/>
</StackPanel>
</Button>
其中GetFirstNodeText方法如下所示:
private static string GetFirstNodeText(AutomationElement automationElement)
{
if (automationElement != null)
{
// Get first AutomationElement node that is a 'text' control-type
var textEl = automationElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "text"));
if (textEl != null) return textEl.Current.Name;
}
return "";
}
另外一条(有趣的)信息:我使用Appium/WinAppDriver尝试了一个类似的测试,并且有一个几乎相同的体验——以前折叠的按钮上没有子节点
是什么导致了这种情况?您对此有什么建议吗?要验证您正在使用最新的
AutomationElement
对象,请务必检查有关刷新控件的问题
但是,由于您提到使用WinAppDriver时存在几乎相同的问题,我认为问题将出现在正在测试的应用程序中。
如果您可以访问处理该代码的源代码/开发人员,请仔细查看涉及此按钮及其子项的代码/xaml。问题很可能会在那里找到。是否可以尝试重新加载禁用的元素?看看这个问题。这是关于UIMap的,但应该适用于任何
UITestControl
。谢谢。我尝试在调用获取DisplayText之前添加以下代码行:“uiButtonStopButton.Find();”,但似乎没有任何效果。我还将SearchAlways添加到UIMap.uitest中的StopButton中,但没有任何效果。我还尝试将WpfButton(uIButtonStopButton)设置为null,并强制其创建一个新实例-结果相同。我开始认为问题可能出在测试中的应用程序中,因为您提到在使用WinAppDriver时也会看到这个问题。如果您可以访问应用程序源代码,可以尝试从那里重新加载按钮。如果您首先在被测应用程序中调用子节点,子节点是否会显示在测试脚本中?孩子们没有加载是有道理的,因为家长在启动时崩溃了,但我不确定它是否可以这样工作。我确实可以访问正在测试的应用程序,你肯定是正确的。另一个开发人员刚刚修改了XAML,行为得到了纠正。当我了解到是什么导致了XAML中的初始问题时,我将用详细信息更新此问题。感谢您的帮助。我的应用程序有一个绑定/属性更改通知问题,UIA根本没有问题。一点问题都没有,很高兴我能提供帮助。有时一个问题对于项目外的人来说更清楚,因为它可以“从远处”看。
private static string GetFirstNodeText(AutomationElement automationElement)
{
if (automationElement != null)
{
// Get first AutomationElement node that is a 'text' control-type
var textEl = automationElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "text"));
if (textEl != null) return textEl.Current.Name;
}
return "";
}