【问题标题】:I can't select UWP ListView items in codedui我无法在 codedui 中选择 UWP ListView 项目
【发布时间】:2018-08-27 13:48:38
【问题描述】:

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

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

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

visualstudio 为 listitem 行捕获了什么

在为主窗口运行 getchildren 然后为 listitem 控件运行 getparents 层次结构后,它们看起来像这样

【问题讨论】:

  • 你能在 UI Control Map 中找到你想要的控件吗?
  • 嗨 Memok,当列表视图项较少时,您是否尝试选择带有十字线的行?问题是, UITestControl 对象具有父子关系。这意味着父控件(您的列表视图)可以有许多子控件(列表视图项)。我有这样的理论,当您在列表视图项上使用十字准线时,必须筛选所有这些子项以找到您要选择的列表视图项。拥有更少的列表视图项目可能会加快速度。你能帮我验证一下吗?
  • 关于找不到控件。在您的测试尝试访问其中一个孩子之前,您是否确保您的列表视图已完全加载?您可以将UITestControl.WaitForControlExist() 之类的函数用于这些目的。
  • @Milan 当我尝试使用十字准线工具突出显示该行时(10 次尝试中有 1 次成功,否则它会挂起)我在带有路径的 UI 控制映射中找到它(UIWindow.UIItemCustom.UIItemList. UIItem201807052049SECTListItem)。 UIItem201807052049SECTListItem 是行 ID,它是动态 ID 所以我尝试调试以检查父 UIItemList.exist 是否为真并使用 GetChildren() 但我发现它是假的。
  • 嗨 @PixelPlex ,是的,我尝试在列表中仅选择 2 行,并且每当我将十字准线拖过一个单元格时,它仍然会挂起相同的行为。正如我在之前的评论中提到的,当我很幸运地捕捉到我尝试了 parent 和 grand parent.exist 的行时,我添加了 Playback.Wait(4000);确保它在没有等待失败问题的情况下被加载。报表由xaml StackLayout->Grid->Listview->Grid完成

标签: uwp automated-tests coded-ui-tests


【解决方案1】:

我可能有一个替代你的问题。下面的代码将采用父控件并对其进行筛选,直到以递归方式添加所有子控件,同时尊重控件层次结构。这样,您将在运行时拥有所有可用的列表视图项。如果您在列表视图项集合更改时使 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;
    }

ParentControl 对象:

public class ParentControl
{
    public KeyValuePair<UITestControl, List<ParentControl>> Children { get; set; }
    public string Value
    {
        get
        {
            return Children.Key.Name;
        }
    }
}

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

【讨论】:

  • 有些东西我不明白。如果行列表层次结构是“UIWindow.UIItemCustom.UIItemList.UIItem201807052049SECTListItem”,我将使用 getchildren 函数并像这样传递 UIWindow “UIFMELogWindow window=GetChildControls(this.UIMap.UIFMELogWindow);”那么我将如何访问子列表?
  • 递归方法将所有子节点添加到键值对列表中。关键是父母,价值是孩子。因此,如果您提供 UIItemCustom 作为此递归方法的参数,您将收到一个包含该 UIItemCustom 作为键的键值对。该值将是键值对列表,其中键是 UIItemCustom 子项,值是包含孙子项的键值对的新列表,依此类推...只需尝试代码并剖析您得到的对象把它放在手表里,可能会更容易理解。
  • 在您的情况下,将列表视图作为参数而不是整个窗口提供会更有效,因此该函数不需要深入挖掘。要了解孩子,请尝试在 Google 上搜索如何进行递归迭代。例如,您可以检查关键对象类型是否为列表项并将其添加到另一个具有平面结构的列表中。
  • 抱歉回复晚了。我是 codedui 的新手,所以我需要一些时间来实现。我制作了 getchildren 并打印了 control.name 和 control.controlType.name。它使结构更加清晰。当我通过 UIWindow 但是当我尝试通过 UIItemCustom 时找不到控件。当它找到一个具有一定价值的单元格和 getparent 但它失败时,我试图创建一个 if 条件。我现在完全迷路了
  • 当我成功获得层次结构时,我应该使用它为这些控件创建类,就像设计器中存在的那样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多