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

Automated tests 如何在CodedUI测试中使用隐藏字段ID唯一标识控件,automated-tests,hidden,coded-ui-tests,Automated Tests,Hidden,Coded Ui Tests,我正在使用codedUI自动化我的测试用例。我们的开发人员使用Telerik的剑道UI控件。我对具有唯一名称的控件的录制和播放没有任何问题。但是我们很少有控件在同一文档上动态呈现,并且只有名称作为唯一标识符,html是自动创建的,我们的开发人员没有修改名称或向html添加id的控件。因此,名称自动添加了GUID,并且在测试用例运行时,该GUID在大多数情况下都会更改。我尝试在名称字段上使用控件而不是等于运算符,但由于GUID位于名称的中间,因此很难使用它。例如,这是两个控件的名称,“Course

我正在使用codedUI自动化我的测试用例。我们的开发人员使用Telerik的剑道UI控件。我对具有唯一名称的控件的录制和播放没有任何问题。但是我们很少有控件在同一文档上动态呈现,并且只有名称作为唯一标识符,html是自动创建的,我们的开发人员没有修改名称或向html添加id的控件。因此,名称自动添加了GUID,并且在测试用例运行时,该GUID在大多数情况下都会更改。我尝试在名称字段上使用控件而不是等于运算符,但由于GUID位于名称的中间,因此很难使用它。例如,这是两个控件的名称,“Courses[138a47d6-8313-4df4-b39f-caeffd0aecf2]。外部涂层ID_输入”和“Floors[4fabd16d-4051-4547-bb6d-0847bddc05fbb6d-0847bddc05fe]。外部涂层ID_输入”。因此,现在在搜索属性中,如果我必须使用Name,我会在Name上使用contains(即Name.contains(课程)或Name.contains(ExternalCoatingId_input)),它们不作为唯一的搜索条件。我真正需要的是名称或ID,比如“课程\外部涂层ID \输入\ 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=“课程[138a47d6-8313-4df4-b39f-caeffd0aecf2]。外部涂层ID\u输入”style=“宽度:100%;“role=“combobox”aria expanded=“false”placeholder=“Select External Coating…”tabindex=“0”aria disabled=“false”aria readonly=“false”aria autocomplete=“both”aria owns=“tank-component-External-Coating-Course-a490312e-c9f5-494a-8d3f-3ccdc33f7660\u列表框”aria-activegenderant=”储罐-部件-外部-涂层-课程-a490312e-c9f5-494a-8d3f-3ccdc33f7660\u选项\u选中“aria busy=”false“>

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

输入id=“储罐-部件-外部-涂层-课程-a490312e-c9f5-494a-8d3f-3ccdc33f7660”type=“text”style=“width:220px;显示:无;“name=”Courses[138a47d6-8313-4df4-b39f-caeffd0aecf2].ExternalCoatingId“data val number=”字段ExternalCoatingId必须是一个数字。“data val=“true”data role=“combobox”aria disabled=“false”aria readonly=“false”

跨度“

但现在,当我尝试为该控件在UImap.uitest中添加此ID并尝试回放该测试时,会出现错误,显示“{”无法对隐藏控件执行“单击”。其他详细信息:\r\n技术名称:“Web”\r\n控制类型:“编辑”\r\n名称:“输入”\r\nId:“tank-component-external-coating-Roof-7341237e-a359-4fb9-b9a3-29a282c44480”\r\n名称:“屋顶[4400736d-2a50-40ae-87f2-41acdf200e1f]。外部涂层ID'\r\n'}” 我使用的是Visual Studio 2012 Premium、Windows 8操作系统和IE 10

我很抱歉对这个问题进行了详细的解释,但是我在任何论坛上都找不到任何具体的帮助。我发现很少有论坛帖子讨论“不能点击隐藏控件”,但与我的问题完全无关。 对于如何使用隐藏的控件ID并成功执行我的测试用例,我非常感谢您的建议

谢谢,
Raji

< P>我会考虑不使用隐藏的控件,而是关注真正的控件。我尝试的方法是使用
Contains(ExternalCoatingId\u输入)
指定搜索属性,并添加
Contains(Courses)
的过滤器属性。这可能就足够了。如果未找到,则尝试使用
FindMatchingControls()
,这将返回一个
uicontrol集合,其中包含找到的所有控件。然后,您可以搜索集合来找到您想要的控件,问题不说明这些搜索标准可能是什么。

< P>我会考虑不使用隐藏控件,而是将重点放在真正的控件上。我尝试的方法是使用
Contains(ExternalCoatingId\u输入)
指定搜索属性,并添加
Contains(Courses)
的过滤器属性。这可能就足够了。如果未找到,则尝试使用
FindMatchingControls()
,这将返回一个
uicontrol集合,其中包含找到的所有控件。然后,您可以搜索集合以找到所需的控件,问题并没有说明这些其他搜索条件可能是什么。

想到了两种解决方案

首先,您可以单击隐藏控件的位置-这是通过获取控件的边框并单击它来完成的-

Mouse.Click(new System.Drawing.Point(hiddenControl.BoundingRectangle.X + 5, hiddenControl.BoundingRectangle.Y + 5));
这对于单击控件很好,但是如果它是一个下拉列表或其他东西,并且您想要做的不仅仅是单击,那么您需要控件本身。在这种情况下,您需要找到隐藏控件和实际控件的公共父控件,该父控件不是另一个实际控件示例的父控件

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

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());
  }
}

显然,这要求隐藏控件和组合框共享一个父控件,并且该父控件不包含所有其他隐藏控件和组合框。干杯,祝你好运

我想到了两种解决方案