1

我正在使用 codedUI 来自动化我的测试用例。我们的开发人员使用 Telerik 的 Kendo UI 控件。使用具有唯一名称的控件进行录制和播放时,我没有任何问题。但是我们很少有控件在同一个文档上动态呈现,并且只有名称作为唯一标识符,并且 html 是自动创建的,我们的开发人员无法控制修改名称或向该 html 添加 id。所以名称已经自动添加了 GUID,并且这个 GUID 在测试用例运行时大部分时间都会发生变化。我尝试在名称字段上使用控件而不是等于运算符,但由于 GUID 位于名称中间,因此很难使用它。例如,这些是两个控件的名称,“Courses[138a47d6-8313-4df4-b39f-caeffd0aecf2].ExternalCoatingId_input”和“ 包含 (ExternalCoatingId_input)) 不作为唯一搜索条件。我真正需要的是名称或 ID,例如“Courses_ExternalCoatingId_input_GUID”。所以我的开发人员理解了我的问题并以我请求的格式添加了 ID,但是由于他们无法控制自动生成的 html,他们创建了一个隐藏控件,该控件链接到具有上述名称的实际控件,并向其中添加了 ID。下面是该类型控件的示例 html 代码。包含 (ExternalCoatingId_input)) 不作为唯一搜索条件。我真正需要的是名称或 ID,例如“Courses_ExternalCoatingId_input_GUID”。所以我的开发人员理解了我的问题并以我请求的格式添加了 ID,但是由于他们无法控制自动生成的 html,他们创建了一个隐藏控件,该控件链接到具有上述名称的实际控件,并向其中添加了 ID。下面是该类型控件的示例 html 代码。他们创建了一个隐藏控件,该控件链接到具有上述名称的实际控件,并为其添加了 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">输入类="k-input" type="text" autocomplete="off" name="Courses[138a47d6-8313-4df4-b39f-caeffd0aecf2].ExternalCoatingId_input" style="width: 100%;" role="combobox" aria-expanded="false" placeholder="选择外部涂层..." tabindex="0" aria-disabled="false" aria-readonly="false" aria-autocomplete="both" aria-owns="tank-组件外部涂层课程-a490312e-c9f5-494a-8d3f-3ccdc33f7660_listbox" aria-activedescendant="坦克组件-外部涂层-课程-a490312e-c9f5-494a-8d3f-3ccdc33f7660_option_selected" aria-busy="false">

span class="k-select" unselectable="on" tabindex="-1"> span

输入 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"

跨度 ”

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

对于对问题的非常详尽的解释,我深表歉意,但我在任何特定的论坛中都找不到任何帮助。我发现很少有论坛帖子讨论“无法点击隐藏控件”,但与我的问题完全无关。对于我们如何使用该隐藏的控件 ID 并成功执行我的测试用例的任何建议,我很感激。

谢谢,拉吉

4

2 回答 2

1

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

于 2013-10-30T20:39:12.373 回答
0

想到了两个解决方案。

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

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

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

例如,假设你有你的隐藏控件(我们称之为它hiddenControl)和你的下拉列表(我们称之为它noIDList)。让我们进一步说它们都包含在同一个HtmlSpan. 首先,hiddenControl在你的 UI 地图中设置任何控件,使用它的 ID。然后,当您noIDList在 UIMap 中声明时,您可以将其父级缩小为与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());
  }
}

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

于 2013-10-31T14:18:00.397 回答