我能';t在codedui中选择UWP ListView项

我能';t在codedui中选择UWP ListView项,uwp,automated-tests,coded-ui-tests,Uwp,Automated Tests,Coded Ui Tests,我有一个UWP应用程序,我正在使用CodedUI进行UWP 它包含一个作为ListView创建的报告,我需要验证此列表中的一些值。但是,当我尝试使用十字线工具将其拖动到行或列表上时,应用程序一直挂起,当我成功捕获行时,我运行了测试用例,但失败了,因为Codedui找不到控件 在所附的照片中,我可以捕捉主页选项卡按钮和其他选项卡以及下拉列表和其下方的按钮,但如果我拖动列表上的十字线工具,它会一直挂起应用程序,直到我关闭它 visualstudio为listitem行捕获了哪些内容 在为主窗口运

我有一个UWP应用程序,我正在使用CodedUI进行UWP

它包含一个作为ListView创建的报告,我需要验证此列表中的一些值。但是,当我尝试使用十字线工具将其拖动到行或列表上时,应用程序一直挂起,当我成功捕获行时,我运行了测试用例,但失败了,因为Codedui找不到控件

在所附的照片中,我可以捕捉主页选项卡按钮和其他选项卡以及下拉列表和其下方的按钮,但如果我拖动列表上的十字线工具,它会一直挂起应用程序,直到我关闭它

visualstudio为listitem行捕获了哪些内容

在为主窗口运行getchildren,然后为listitem控件运行getparents层次结构之后,这就是它们的样子

我可能有办法解决你的问题。下面的代码将采用一个父控件并对其进行筛选,直到所有子控件都以递归方式添加,这与控件层次结构有关。这样,您将在运行时拥有所有可用的listview项。如果在listview项集合发生更改时使KeyValuePair保持最新,则控件未找到异常在此处不应成为问题

使用此递归方法:

    public ParentControl GetChildControls(UITestControl parentControl)
    {
        ParentControl parent = new ParentControl();

        if (parentControl != null)
        {
            List<ParentControl> children = new List<ParentControl>();

            foreach (UITestControl childControl in parentControl.GetChildren())
            {
                children.Add(GetChildControls(childControl));
            }

            parent.Children = new KeyValuePair<UITestControl, List<ParentControl>>(parentControl, children);
        }

        return parent;
    }
public ParentControl GetChildControls(UITestControl ParentControl)
{
ParentControl parent=新的ParentControl();
if(parentControl!=null)
{
列表子项=新列表();
foreach(parentControl.GetChildren()中的UITestControl childControl)
{
Add(GetChildControls(childControl));
}
parent.Children=新的KeyValuePair(parentControl,Children);
}
返回父母;
}
ParentControl对象:

public class ParentControl
{
    public KeyValuePair<UITestControl, List<ParentControl>> Children { get; set; }
    public string Value
    {
        get
        {
            return Children.Key.Name;
        }
    }
}
公共类ParentControl
{
公钥值对子项{get;set;}
公共字符串值
{
得到
{
返回Children.Key.Name;
}
}
}

Children属性是必需的,其他属性是可选的。

您能在UI控件映射中找到所需的控件吗?您好,Memok,当listview项目较少时,您是否尝试选择带有十字线的行?问题是,UITestControl对象具有父子关系。这意味着父控件(listview)可以有多个子控件(listview项)。我有一个理论,当你在一个listview项目上使用十字线时,vs必须筛选所有的子项,以找到你想要选择的listview项目。减少listview项可能会加快速度。你能帮我核实一下吗?关于找不到控件。在测试尝试访问其子级之前,是否确保listview已完全加载?您可以使用类似于
UITestControl.WaitForControlExist()
的函数来实现这些目的。@Milan当我尝试使用十字线工具高亮显示行时(10次尝试中有1次成功,否则将挂起),我会在带有路径(UIWindow.UIItemCustom.UIItemList.uiItem2017052049SectListItem)的UI控件映射中找到它。UIItem201807052049SECTListItem是行id,它是一个动态id,因此我尝试调试以检查父UIItemList.exist是否为true,并使用GetChildren(),但我发现它为false。Hi@PixelPlex,是的,我尝试在列表中仅选择2行,但仍然与在单元格上拖动十字线时挂起的行为相同。正如我在前面的评论中提到的,当我幸运地捕捉到行时,我尝试了parent和grandparent.exist,并添加了Playback.Wait(4000);确保加载时没有出现任何故障问题。该报告是由xaml StackLayout->Grid->Listview->Grid完成的。有些东西我不明白。如果行列表层次结构是“UIWindow.UIItemCustom.UIItemList.UIItem201807052049SECTListItem”,我将使用getchildren函数并像这样传递UIWindow“UIFMELogWindow window=GetChildControls(this.UIMap.UIFMELogWindow);”那么我将如何访问子列表?递归方法将所有子对象添加到键值对列表中。键是父项,值是子项。因此,如果将UIItemCustom作为参数提供给此递归方法,则将收到一个包含该UIItemCustom作为键的键值对。该值将是键值对列表,其中键是UIItemCustom子项,值是包含子项的键值对的新列表,以此类推。。。只需尝试代码并在监视中解析从中返回的对象,这可能会使它更容易理解。在您的情况下,将listview作为参数而不是整个窗口提供会更有效,因此函数不需要深入挖掘。为了找到孩子们,试着在谷歌上搜索如何进行递归迭代。例如,您可以检查键对象类型是否为列表项,并将其添加到另一个具有平面结构的列表中。很抱歉,回复太晚。我是codedui的新手,所以我需要一段时间来实现一些东西。我制作了getchildren并打印了control.name和control.controlType.name。它使结构更加清晰。当我通过UIWindow但试图通过UIItemCustom时,找不到该控件。当它找到一个单元格时,我试图创建一个if条件,该单元格有一些值要去和getparent,但失败了。我现在完全迷路了当我成功地获得层次结构时,我应该用它来为这些控件创建类,就像设计器中存在的一样,对吗?