【问题标题】:Coded UI Tests: How can I set the search properties for recording?编码的 UI 测试:如何设置记录的搜索属性?
【发布时间】:2021-05-31 07:37:30
【问题描述】:

我想告诉自己有关编码 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";找不到控件,会抛出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 方法,它以错误消息结尾。

最好的解决方案是,在父控件上进行断言,因为它还保留了文本控件的值,你不会像我一样遇到这样的问题。

也许这篇文章对在同一点上挣扎的人有所帮助。

注意:
UITestControl->WinControl->WinText
UITestControl->WinControl->WinWindow

【问题讨论】:

  • 我不知道你是怎么做到的,但这篇文章看起来很有趣:msdn.microsoft.com/en-us/library/gg269469.aspx
  • 您能否举一个您认为“不酷”的代码示例,并说明您可能需要更改它的原因和方式?通常,如果正在测试的应用程序发生更改,那么测试也需要更改以匹配。否则更改不是真正的更改或测试不充分。
  • 谢谢乔克,我之前已经读过这篇文章了(:
  • @AdrianHHH 问题是,如果您想检查值并​​且程序中的值以某种方式更改(例如更改为 2.000,98),它每次都会抛出“找不到控件异常”而不是“assertfailedException” ”。那是我的问题。它的逻辑是因为控件位于代码行:this.mUIItem100180Text.SearchProperties[WinText.PropertyNames.Name] = "1.001,80";因此,如果值发生变化并且这让我很生气,它将不会被发现。
  • 我已在以下链接回复:stackoverflow.com/a/36649658/2871356

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


【解决方案1】:

更新 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 测试对标签进行断言并且标签的值有一天会发生变化,那么您将遇到与我相同的问题:/

【讨论】:

  • 我在使用标签时遇到了同样的问题。我有在运行时会改变的动态标签。我想断言标签的值,但是一旦标签的 Text 属性发生更改,就找不到控件。我只是确定您的回答,因为您表示我必须编辑designer.cs,这令人担忧。我同意你的观点,标签的处理方式似乎非常出人意料。
【解决方案2】:

【讨论】:

  • 不要发布链接作为答案,而是将其作为评论。
【解决方案3】:

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

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

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

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

但是,如果您有动态控件,则在 .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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多