Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# UIACOMWRAPER无法返回以前已折叠的WPF控件的子节点_C#_.net_Wpf_Coded Ui Tests_Microsoft Ui Automation - Fatal编程技术网

C# UIACOMWRAPER无法返回以前已折叠的WPF控件的子节点

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.

我试图在WPF应用程序上创建编码的UI测试。我正在使用Visual Studio 2019创建/运行测试

我遇到了一个奇怪的行为,启动时折叠的WPF按钮(但后来变为可见/启用)没有使用与按钮关联的AutomationElement对象可用的任何FindXXX方法显示任何子节点。其他未折叠的按钮似乎没有此问题。我应该注意到,我希望此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>
其中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 "";
}