0

我想告诉自己有关编码 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 网站有效 =)

额外的:

让我们把事情说清楚:

这是我的代码:

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 上创建我的Text-Control(UIITem100180Text:WinText),它代表我的计算值。问题是两者都有相同的.PropertyNames.ControlName =)。

这意味着如果我要添加:

this.mUIItem100180Text.SearchProperties[WinText.PropertyNames.ControlName] = "wert2Praemie12";

它会一直找到我的父控件:WinWindow。如果我没有添加它并且计算的值发生变化(可能计算方法被编辑,..),它不等于this.mUIItem100180Text.SearchProperties[WinText.PropertyNames.Name] = "1.001,80"; 找不到控件,并且会抛出错误消息“..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

4

3 回答 3

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(parent)继承了所需的属性(ControlName):

this.mUITextText = new WinText(this);

因此无需添加额外的搜索属性来查找子元素,因为两者都获得了相同的 controlName。
这可以防止系统在 Label 的值更改时抛出“..ElementNotFound”-Exception。相反,我们会得到一个“..AssertationFailure”-Exception,它告诉我们标签的值有问题。这就是它应该如何工作的标准方式。


只需删除这一行,一切都会好起来的:

this.mUITextText.SearchProperties[WinText.PropertyNames.Name] = "text";


我不知道为什么编码的 ui builder 会自动将此 searchproperty 添加到 Labels 以使我们陷入困境:/



更新1:

System.Windows.Forms.Label负责这些麻烦。如果您使用编码的 ui 测试对标签进行断言,并且标签的值有一天会发生变化,那么您将遇到与我相同的问题:/

于 2013-05-08T12:27:50.677 回答
0

您可以配置搜索属性,希望对您有所帮助。

http://blogs.msdn.com/b/visualstudioalm/archive/2012/12/10/coded-ui-test-configuring-search-properties-while-recording-on-internet-explorer.aspx

于 2014-02-26T07:42:17.620 回答
0

经过很多痛苦和努力。我必须指出这一点永远不要触摸设计器文件,每次调整、添加、删除功能或控件时都会重新生成它。

如果您在项目中打开 uimap 文件 (.uitest),它将显示您所有捕获的控件和方法。右键单击列出的控件:需要注意的 2 件事。重命名(非常适合丑陋的动态控件) UIItem100180Text也是属性。

在属性中您可以调整搜索和过滤器属性搜索优先于过滤器您可以直接删除无关紧要的值,添加新条件,删除要排除的值,甚至将运算符切换到包含

这应该更可靠地解决您的问题。

但是,如果您有动态控件,则在 .uitest 文件下提供的普通 cs 文件中,这是针对直接父控件(单元格->父级->表,按钮->父级->选项卡)的扩展方法,或者可以添加一个功能层(参见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;
}
于 2015-09-29T20:41:14.187 回答