我需要为控制创建自动化系统级测试。 控件按样式设置,并具有单独的ListViewItem
模板ListView
。 我的目标是从此ListViewItem
内的标题中获取文本。 这是我在 XAML 中的内容(代码简化(
<Style>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border>
<Grid>
<ScrollViewer x:Name="ScrollViewer">
<ScrollViewer.TopHeader>
<StackPanel>
<ListView ItemsSource="{TemplateBinding SomeSource}"
ItemTemplate="{StaticResource MyTemplate}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsStackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
</StackPanel>
</ScrollViewer.TopHeader>
</ScrollViewer>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
ListViewItem
的模板是这样的:
<DataTemplate>
<Grid>
<Grid>
<TextBlock x:Name="TextName"
AutomationProperties.AutomationId="{Binding SomeId}"
Text="{x:Bind SomeText}"/>
</Grid>
</Grid>
</DataTemplate>
当然,ListViewItems
是在运行时自动生成的。他们根据属性绑定并获得了所需的模板。
但是在测试中,无论如何我都无法到达我的TextBlock
(ById
,FindElementById
等(。 我可以通过首先按类(FindElementByClassName
(查找ListView
来找到元素,然后按类ListViewItems
,然后按类TextBlock
,但我认为这不是正确的方法。因为在未来的控制结构可能会改变,并且将更难支持测试。
控制也AutomationPeer
网格。
那么你有什么想法为什么我不能通过他们的AutomationId
得到我的简单TextBlock
甚至ListViewItem
吗?
已通过为 conrtol 创建自定义自动化对等方解决了问题。控件继承列表视图(在问题描述中不清楚(。因此,自动化 ID 继承的列表视图控制中的列表视图存在问题。
在显示元素后但在 WinAppDriver 查找元素之前添加Thread.Sleep()
或Task.Delay()
几秒钟也很有帮助。 看起来测试环境需要更多时间来绑定和查找元素。