我正在尝试创建一些编码UI测试,以便在“一组”WPF控件上多次使用。我可以使用Coded UI测试构建器单独创建每个测试,但我希望创建“一般”案例,因为每个测试非常相似,只需稍作修改。
为了创建这个一般情况,我需要能够找到(然后单击)给定父级的控件(在本例中为WpfWindow
;我正在寻找的控件是几个级别的深度,但我希望无论深度如何都能找到控件。我已经能够使用AutomationElement
找到我正在寻找的控件,但是编码的UI似乎不喜欢它,并且一旦找到它就无法点击它。
我尝试在父窗口上使用GetChildren()
,然后递归搜索以找到有问题的控件。我正在使用SearchProperties
查找我正在寻找的特定WPF控件的Name
和ControlType
,但看起来并不是所有内容都有Name
它失败了。
我也尝试过为特定控件设置SearchProperties
,但它会抛出一个异常,说它无法找到。
有什么建议吗?我是以正确的方式解决这个问题,还是我错过了一些基本的东西?
除此之外:使用Coded UI测试构建器构建类似的Coded UI测试有多“糟糕”?我的意思是,使用Coded UI Test Builder创建800个不同的测试似乎是错误的,它们都具有相同的前5个步骤(根据运行的位置有微小的差异)。
答案 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()
。