编码的UI测试:我如何设置录制的搜索属性?

时间:2013-05-07 08:40:31

标签: unit-testing visual-studio-2012 mstest coded-ui-tests

我想告诉自己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

3 个答案:

答案 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;
}