我想告诉自己Coded UI测试。所以我创建了一些编码的ui测试并且玩了一下。
但是现在即时通讯我无法帮助自己。我有以下问题。当我从dotNet 4.5程序录制一些动作时,录音机通过 SearchProperties [WinText.PropertyNames.Name] 找到表格,按钮,文本字段等等,这绝对是不酷的。
想象一下,你想在文本控制上做一个断言。 WinText.PropertyNames.Name将是计算值。因此,如果您更改影响计算的表单中的某些输入值,WinText.PropertyNames.Name将更改为新值,并且编码的ui测试将找不到具有更改值的文本控件,因为它搜索了WinText。控件的PropertyNames.Name而不是 WinText.PropertyNames.ControlName 。
我的问题是,有没有办法更改标准搜索属性的配置,编码的ui测试构建器用于定位所需的对象???
因为之后为每个录制的对象做了很大的改变。
PS:我不是在谈论 C:\ Program Files(x86)\ Common Files \ microsoft shared \ VSTT \ 11.0 \ IEPropertyConfiguration.xml ,它只对ie sites =)
提前致谢
让我们说清楚:
继承我的代码:
public class UIItem100180Window : WinWindow
{
public UIItem100180Window(UITestControl searchLimitContainer) :
base(searchLimitContainer)
{
#region Search Criteria
this.SearchProperties[WinWindow.PropertyNames.ControlName] = "wert2Praemie12";
this.WindowTitles.Add("Any Title");
#endregion
}
#region Properties
public WinText UIItem100180Text
{
get
{
if ((this.mUIItem100180Text == null))
{
this.mUIItem100180Text = new WinText(this);
#region Search Criteria
this.mUIItem100180Text.SearchProperties[WinText.PropertyNames.Name] = "1.001,80";
this.mUIItem100180Text.WindowTitles.Add("Any Title");
#endregion
}
return this.mUIItem100180Text;
}
}
#endregion
#region Fields
private WinText mUIItem100180Text;
#endregion
}
我有一个父控件(UIItem100180Window:WinWindow),它在UI上创建我的文本控件(UIITem100180Text:WinText),表示我的计算值。问题是两者都有相同的 .PropertyNames.ControlName =)。
这意味着如果我要添加:
this.mUIItem100180Text.SearchProperties[WinText.PropertyNames.ControlName] = "wert2Praemie12";
它会一直找到我的父控件:WinWindow。如果我不添加它并且计算的值发生变化(可能计算方法被编辑,..),它不等于 this.mUIItem100180Text.SearchProperties [WinText.PropertyNames.Name] =“1.001,80” ; 控件不会被找到,并且会抛出errorMessage“..control not found”。
稍后我会在此行遇到问题,检查我的文本控件的值(WinText):
public void VerifyTextControl()
{
#region Variable Declarations
WinText uIItem100180Text = this.xxx.UIItem100180Window.UIItem100180Text;
#endregion
// Verify that the 'DisplayText' property of '1.001,80' label equals '1.001,80'
Assert.AreEqual("1.001,80", uIItem100180Text.DisplayText, "järhlich muss 1.001,80 € betragen!");
}
我的 uIItem100180Text:WinText 作为 WinWindow 处理,因为它在我搜索PropertyNames.ControlName时只找到我的父控件,就像我说两个名字都一样。所以我无法使用.DisplayText-method ,它以错误消息结束。
最好的解决办法是,对父控制进行断言,因为它也保留了文本控制的价值,你不会像我一样有这样的问题。
也许这篇文章对于那些在同一时刻挣扎的人来说很有帮助=)
注意:
UITestControl-> WinControl-> WinText
UITestControl-> WinControl-> WinWindow
答案 0 :(得分:0)
更新2:!!问题解决了!!
我会尝试解释。
以下是我们的例子:
public class UITextWindow : WinWindow
{
public UITextWindow(UITestControl searchLimitContainer) :
base(searchLimitContainer)
{
#region Search Criteria
this.SearchProperties[WinWindow.PropertyNames.ControlName] = "label1";
this.WindowTitles.Add("Form1");
#endregion
}
#region Properties
public WinText UITextText
{
get
{
if ((this.mUITextText == null))
{
this.mUITextText = new WinText(this);
#region Search Criteria
this.mUITextText.SearchProperties[WinText.PropertyNames.Name] = "text";
this.mUITextText.WindowTitles.Add("Form1");
#endregion
}
return this.mUITextText;
}
}
问题是编码的ui测试构建器生成 SearchProperty 以找到我们的 Wintext UITextText 。但这不是必需的,因为我们的Wintext UITextText 在cunstructor中从 UITextWindow:WinWindow(父)继承所需的属性(ControlName):
this.mUITextText = new WinText(this);
因此,无需添加额外的搜索属性来查找子元素,因为两者都具有相同的controlName。
这可以防止系统在Label的值发生变化时抛出“..ElementNotFound”-Exception。相反,我们会得到一个“..AssertationFailure” - 例外,告诉我们标签的价值有些不对劲。这是它应该如何运作的标准方式。
只需删除这一行,一切都会好的:
this.mUITextText.SearchProperties[WinText.PropertyNames.Name] = "text";
我不知道为什么编码的ui构建器会自动将此搜索属性添加到标签中以使我们遇到麻烦:/
更新1:
System.Windows.Forms.Label 负责此事。如果你在带有编码ui测试的标签上做断言并且标签的值改变一天,你将遇到像我一样的问题:/
答案 1 :(得分:0)
您可以配置搜索属性,我希望这对您有帮助。
答案 2 :(得分:0)
通过痛苦和努力。我必须指出这一点,不要触摸设计器文件,每次调整,添加,删除功能或控件时都会重新生成它。
如果您在项目中打开uimap文件(.uitest),它将显示您捕获的所有控件和方法。 右键单击列出的控件:要注意的两件事。重命名(非常适合丑陋的动态控制) UIItem100180Text 也是属性。
在属性中,您可以调整“搜索和过滤器”属性 搜索在Filter上进行了优化 您可以直接删除无关紧要的值,添加新条件,删除要排除的值,甚至可以将运算符切换为 包含
这可以更可靠地解决您的问题。
但是,如果您有动态控件,则可以使用.uitest文件下提供的普通cs文件,针对直接父控件的扩展方法(cell-> parent-> table,button-> parent) - >> tab)或功能层(请参阅http://www.slideshare.net/tharindaliyanage/coded-ui-hand-code-based-on-page-object-model)可以添加。
为了简化此帖子,扩展方法看起来像
public static WinText GetSuperDynamicButton(this UITextWindow container, string displayText)
{
var button = new WinText(container);
button.SearchProperties[WinText.PropertyNames.Name]=displayText;
//if you wanted to use the contains style
//button.SearchProperties.Add(new PropertyExpression(WinText.PropertyNames.Name, displayText, PropertyExpressionOperator.Contains));
return button;
}