试图找到一个特定的WpfControl用于编码的UI测试

时间:2013-11-15 15:50:52

标签: c# wpf coded-ui-tests

我正在尝试创建一些编码UI测试,以便在“一组”WPF控件上多次使用。我可以使用Coded UI测试构建器单独创建每个测试,但我希望创建“一般”案例,因为每个测试非常相似,只需稍作修改。

为了创建这个一般情况,我需要能够找到(然后单击)给定父级的控件(在本例中为WpfWindow;我正在寻找的控件是几个级别的深度,但我希望无论深度如何都能找到控件。我已经能够使用AutomationElement找到我正在寻找的控件,但是编码的UI似乎不喜欢它,并且一旦找到它就无法点击它。

我尝试在父窗口上使用GetChildren(),然后递归搜索以找到有问题的控件。我正在使用SearchProperties查找我正在寻找的特定WPF控件的NameControlType,但看起来并不是所有内容都有Name它失败了。

我也尝试过为特定控件设置SearchProperties,但它会抛出一个异常,说它无法找到。

有什么建议吗?我是以正确的方式解决这个问题,还是我错过了一些基本的东西?

除此之外:使用Coded UI测试构建器构建类似的Coded UI测试有多“糟糕”?我的意思是,使用Coded UI Test Builder创建800个不同的测试似乎是错误的,它们都具有相同的前5个步骤(根据运行的位置有微小的差异)。

2 个答案:

答案 0 :(得分:0)

我们如何处理这个是录制控件而不是步骤。然后,您可以传递使用完整父 - 父 - 父映射的控件。 。 。 -parent映射到方法。

ControlB = genericControl(parentWindow,     
    "ControlType","Button","ControlName","Send");
TestOne(ControlB);
TestOne(ControlC);

public void TestOne(UITestControl control, string Value)
{ 
    //do stuff
    Mouse.Click(control);
    Assert.AreEqual(Value, control.GetProperty("InnerText"));
}

通用控制:

public UITestControl genericControl(UITestControl parentWindow, String Property1, String Value1, String Property2, String Value2)
{
    UITestControl control = new UITestControl(parentWindow);
    control.TechnologyName = "MSAA";
    control.SearchProperties.Add(Property1, Value1, Property2, Value2);

    return control;
}

如果每个步骤都是通用的,它应该有用。

ETA - 您必须具有要使用的控件的某些特征。除非您想使用FindAllMatchingControls并遍历所有控件或不同类型来过滤列表,否则您必须为每个控件提供唯一的标识信息。

答案 1 :(得分:0)

我重新访问了AutomationElement解决方案,并能够找出点击部分。

public AutomationElement findControl(AutomationProperty propertyOfItem, string itemToSearchFor, System.Windows.Automation.ControlType controlType)
{
            Condition condition = new System.Windows.Automation.AndCondition(
                   new System.Windows.Automation.PropertyCondition(propertyOfItem, itemToSearchFor),
                   new System.Windows.Automation.PropertyCondition(AutomationElement.ControlTypeProperty, controlType));

            AutomationElement foundControl = AutomationElement.RootElement.FindFirst(TreeScope.Descendants | TreeScope.Children, condition);
            return foundControl;
}

点击部分从AutomationElement获取可点击点并将其存储在System.Windows.Point中,并根据该点创建System.Drawing.Point。然后在该点上调用Mouse.Click()