如何使用隐藏字段ID在CodedUI测试中唯一标识控件

时间:2013-10-30 18:57:21

标签: automated-tests hidden coded-ui-tests

我正在使用codedUI来自动化我的测试用例。我们的开发人员使用Telerik的Kendo UI控件。对于具有唯一名称的控件的录制和播放,我没有任何问题。但是我们几乎没有在同一文档上动态呈现的控件,只有名称作为唯一标识符,并且自动创建了html,我们的开发人员无法控制修改名称或向该html添加id。因此名称自动添加了GUID,并且在测试用例运行时,此GUID会更改大多数时间。我尝试在名称字段上使用控件而不是等于运算符,但由于GUID位于名称的中间,因此很难使用它。例如,这些是两个控件的名称,“Courses [138a47d6-8313-4df4-b39f-caeffd0aecf2] .ExternalCoatingId_input”和“Floors [4fabd16d-4051-4547-bb6d-0847bddc05fbb6d-0847bddc05fe] .ExternalCoatingId_input”。所以现在在搜索属性中,如果我必须使用名称,我在名称上使用包含(即名称。包含(课程)或名称。包含(ExternalCoatingId_input)),它们不作为唯一搜索条件。我真正需要的是姓名或ID,如“Courses_ExternalCoatingId_input_GUID”。所以我的开发人员理解我的问题,并以我要求的格式添加了ID,但由于他们无法控制自动生成的html,因此他们创建了一个隐藏的控件,链接到上面带有名称的实际控件并添加了ID。下面是该类控件的示例html代码。

“span class =”k-widget k-combobox k-header“style =”width:220px;“ span class =“k-dropdown-wrap k-state-default”unselectable =“on”tabindex =“ - 1”> input class =“k-input”type =“text”autocomplete =“off”name =“Courses [138a47d6-8313-4df4-b39f-caeffd0aecf2] .ExternalCoatingId_input”style =“width:100%;” role =“combobox”aria-expanded =“false”占位符=“选择外部涂层......”tabindex =“0”aria-disabled =“false”aria-readonly =“false”aria-autocomplete =“both”aria- owns =“tank-component-external-coating-course-a490312e-c9f5-494a-8d3f-3ccdc33f7660_listbox”aria-activedescendant =“tank-component-external-coating-course-a490312e-c9f5-494a-8d3f-3ccdc33f7660_option_selected”aria-忙= “假” >

span class =“k-select”unselectable =“on”tabindex =“ - 1”> 跨度

输入id =“tank-component-external-coating-Course-a490312e-c9f5-494a-8d3f-3ccdc33f7660”type =“text”style =“width:220px; display:none;” name =“Courses [138a47d6-8313-4df4-b39f-caeffd0aecf2] .ExternalCoatingId”data-val-number =“字段ExternalCoatingId必须是数字。” data-val =“true”data-role =“combobox”aria-disabled =“false”aria-readonly =“false”

span“

但是现在当我尝试在UImap.uitest中为该控件添加此ID并尝试重放测试时,它会给出错误“{”无法对隐藏控件执行“点击”。其他详细信息:\ r \ nTechnologyName:'Web'\ r \ n \ nControlType:'Edit'\ r \ nTagName:'INPUT'\ r \ nIdd:'tank-component-external-coating-Roof-7341237e-a359-4fb9-b9a3 -29a282c44480'\ r \ n名称:'屋顶[4400736d-2a50-40ae-87f2-41acdf200e1f] .ExternalCoatingId'\ r \ n“}” 我正在使用Visual Studio 2012 Premium和Windows 8 OS以及IE 10

我为这个问题的详细解释道歉,但我在这个具体的论坛中找不到任何帮助。我发现很少有论坛主题讨论“不能点击隐藏控件”,但与我的问题完全无关。 我很欣赏有关如何使用隐藏控件ID并成功执行测试用例的任何建议。

谢谢, 的Raji

2 个答案:

答案 0 :(得分:1)

我会考虑不使用隐藏的控件,而是专注于真正的控件。我尝试的方法是使用Contains(ExternalCoatingId_input)指定搜索属性,并添加Contains(Courses)的过滤器属性。这可能就足够了。如果不是,请尝试使用FindMatchingControls(),这将返回UIControlCollection并找到所有控件。然后,您可以搜索该集合以找到您想要的控件,问题不会说明这些其他搜索条件可能是什么。

答案 1 :(得分:0)

我想到了两种解决方案。

一,你可以在隐藏控件的位置执行一次单击 - 这是通过获取控件的边界矩形并单击它来完成的 -

Mouse.Click(new System.Drawing.Point(hiddenControl.BoundingRectangle.X + 5, hiddenControl.BoundingRectangle.Y + 5));

单击控件很好,但是如果它是下拉列表或其他内容,并且您想要做的不仅仅是单击,则需要控件本身。在这种情况下,您需要找到隐藏控件和实际控件的公共父级,该控件不是实际控件的另一个示例的父级。

例如,假设您拥有隐藏控件(我们称之为hiddenControl)和您的下拉列表(我们称之为noIDList)。让我们进一步说它们都包含在同一个HtmlSpan中。首先,使用其ID在您的UI地图中设置hiddenControl,就像您控制一样。然后,当您在UIMap中声明noIDList时,您可以将其父级缩小为hiddenControl使用GetParent()方法的父级。方法如下:

public HtmlComboBox noIDList
{
  get
  {
    //This returns the first combo box that is a child of hidden control's parent
    //So, the first combo box that is a sibling of hidden control
    return new HtmlComboBox(hiddenControl.GetParent());
  }
}

显然,这要求隐藏控件和组合框共享父级,而父级也不包含所有其他隐藏控件和组合框。干杯,祝你好运!