UIAComWrapper 无法 return 之前折叠的 WPF 控件的子节点
UIAComWrapper failing to return child nodes of WPF control that was previously COLLAPSED
我正在尝试在 WPF 应用程序上创建编码 UI 测试。我正在使用 Visual Studio 2019 创建/运行 测试。
我 运行 遇到一个奇怪的行为,在启动时折叠的 WPF 按钮(但后来 visible/enabled)没有使用任何可用的 FindXXX 方法显示任何子节点到与按钮关联的 AutomationElement 对象。其他没有折叠的按钮好像没有这个问题。我应该注意,我期待此 WPF 按钮的子节点的原因是在 XAML 中它的定义类似于以下内容:
<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>
使用 INSPECT.EXE 应用程序,我可以正确地看到此按钮的子节点,但是当我遍历我可以访问的 AutomationElements 时,它们丢失了。
我用来检查人类可读文本的测试代码是:
// Wait for 'Stop' button to become enabled, and verify correct text
uIButtonStopButton.WaitForControlEnabled();
var displayText = (!uIButtonStopButton.DisplayText.Equals(""))
? uIButtonStopButton.DisplayText
: GetFirstNodeText(uIButtonStopButton.NativeElement as AutomationElement;
Assert.AreEqual("Stop", displayText, "Stop button doesn\'t have correct text.");
其中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 尝试了类似的测试并且有几乎相同的体验 - 以前折叠的按钮上没有子节点。
可能是什么原因造成的,对此您有什么建议吗?
要验证您正在使用 up-to-date AutomationElement
对象,请务必检查 this 关于刷新控件的问题。
但是由于您提到在使用 WinAppDriver 时遇到几乎相同的问题,所以我认为问题出在被测应用程序上。
如果您有权访问源代码/开发人员处理该代码,请仔细查看涉及此按钮及其子项的 code/xaml。很可能会在那里发现问题。
我正在尝试在 WPF 应用程序上创建编码 UI 测试。我正在使用 Visual Studio 2019 创建/运行 测试。
我 运行 遇到一个奇怪的行为,在启动时折叠的 WPF 按钮(但后来 visible/enabled)没有使用任何可用的 FindXXX 方法显示任何子节点到与按钮关联的 AutomationElement 对象。其他没有折叠的按钮好像没有这个问题。我应该注意,我期待此 WPF 按钮的子节点的原因是在 XAML 中它的定义类似于以下内容:
<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>
使用 INSPECT.EXE 应用程序,我可以正确地看到此按钮的子节点,但是当我遍历我可以访问的 AutomationElements 时,它们丢失了。
我用来检查人类可读文本的测试代码是:
// Wait for 'Stop' button to become enabled, and verify correct text
uIButtonStopButton.WaitForControlEnabled();
var displayText = (!uIButtonStopButton.DisplayText.Equals(""))
? uIButtonStopButton.DisplayText
: GetFirstNodeText(uIButtonStopButton.NativeElement as AutomationElement;
Assert.AreEqual("Stop", displayText, "Stop button doesn\'t have correct text.");
其中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 尝试了类似的测试并且有几乎相同的体验 - 以前折叠的按钮上没有子节点。
可能是什么原因造成的,对此您有什么建议吗?
要验证您正在使用 up-to-date AutomationElement
对象,请务必检查 this 关于刷新控件的问题。
但是由于您提到在使用 WinAppDriver 时遇到几乎相同的问题,所以我认为问题出在被测应用程序上。 如果您有权访问源代码/开发人员处理该代码,请仔细查看涉及此按钮及其子项的 code/xaml。很可能会在那里发现问题。