在我的一个应用程序窗口中,我有一个显示2条记录的列表框:
John Smith
John Smith
这是两个不同的记录。当我在第一张约翰史密斯唱片上手动点击时,我应该看到他的电话号码(555-555-5555),而我这样做。当我点击第二个John Smith记录时,我应该看到不同的电话号码(777-777-7777),我也这样做。
然而,当我记录点击列表中的第一项时,我得到的代码与点击列表中的第二项完全相同(CodedUI正在寻找" John Smith"项目中的按显示文本列出然后选择它,而不是在我点击的任何列表索引中选择项目。 然后,当我想验证第二个John Smith的电话号码(777-777-7777)时,我的断言失败了,因为CodedUI选择了第一个记录并获得了第一个John Smith的号码(555-555-5555)。
我该如何解决?我需要支持名称相同的用户。不,我不想在第一个" John Smith"中添加任何额外的信息。使它显示与第二个" John Smith"略有不同。
/// <summary>
/// InOwnersRecordsWindowSelectFirstItem - Use 'InOwnersRecordsWindowSelectFirstItemParams' to pass parameters into this method.
/// </summary>
public void InOwnersRecordsWindowSelectFirstItem()
{
#region Variable Declarations
WinList uIListBoxOwnersRecordsList = this.UIOwnersRecordsWindow.UIListBoxOwnersRecordsWindow.UIListBoxOwnersRecordsList;
#endregion
// Select 'John Smith' in 'listBoxOwnersRecords' list box
uIListBoxOwnersRecordsList.SelectedItemsAsString = this.InOwnersRecordsWindowSelectFirstItemParams.UIListBoxOwnersRecordsListSelectedItemsAsString;
}
/// <summary>
/// InOwnersRecordsWindowSelectSecondItem - Use 'InOwnersRecordsWindowSelectSecondItemParams' to pass parameters into this method.
/// </summary>
public void InOwnersRecordsWindowSelectSecondItem()
{
#region Variable Declarations
WinList uIListBoxOwnersRecordsList = this.UIOwnersRecordsWindow.UIListBoxOwnersRecordsWindow.UIListBoxOwnersRecordsList;
#endregion
// Select 'John Smith' in 'listBoxOwnersRecords' list box
uIListBoxOwnersRecordsList.SelectedItemsAsString = this.InOwnersRecordsWindowSelectSecondItemParams.UIListBoxOwnersRecordsListSelectedItemsAsString;
}
/// <summary>
/// Parameters to be passed into 'InOwnersRecordsWindowSelectFirstItem'
/// </summary>
[GeneratedCode("Coded UITest Builder", "14.0.23107.0")]
public class InOwnersRecordsWindowSelectFirstItemParams
{
#region Fields
/// <summary>
/// Select 'John Smith' in 'listBoxOwnersRecords' list box
/// </summary>
public string UIListBoxOwnersRecordsListSelectedItemsAsString = "John Smith";
#endregion
}
/// <summary>
/// Parameters to be passed into 'InOwnersRecordsWindowSelectSecondItem'
/// </summary>
[GeneratedCode("Coded UITest Builder", "14.0.23107.0")]
public class InOwnersRecordsWindowSelectSecondItemParams
{
#region Fields
/// <summary>
/// Select 'John Smith' in 'listBoxOwnersRecords' list box
/// </summary>
public string UIListBoxOwnersRecordsListSelectedItemsAsString = "John Smith";
#endregion
}
答案 0 :(得分:1)
有一种解决方法,但需要手工编码。此外,如果您可以共享该列表所在的页面代码,那么我将更容易提供帮助。 问这个是因为你可以使用父子关系。 我们假设这是带有id的标准html列表。
<ul id=”list”>
<li>John Smith</li>
<li>John Smith</li>
</ul>
您可以通过父子关系找到您想要的约翰史密斯。
var parent = FindListById(browser, "list");
var child1 = parent.GetChildren()[0]; // this is 1st child of UL with id=list, in your case first John Smith
var child2 = parent.GetChildren()[1]; // this is 2nd child of UL with id=list, in your case second John Smith
Mouse.Click(child2);
public HtmlList FindListById(UITestControl parent, string id)
{
var parentlist= new HtmlList(parent);
parentlist.SearchProperties.Add(HtmlList.PropertyNames.Id, id);
return parentlist;
}
如果列表是div内部或类似的内容,则逻辑是相同的。首先通过一些控件找到父级(id或友好名称是最好的),然后搜索孩子 这也可以在多个级别上完成。
答案 1 :(得分:0)
我与它搏斗了一段时间,然后意识到当我手动从列表中选择项目时,我只需点击列表中特定位置的项目。 事实证明,我可以在CodedUI代码中完全相同 -
public void InOwnersRecordsWindowClickOnListItemAtIndex(int index)
{
#region Variable Declarations
WinList uIListBoxOwnersRecordsList = this.UIOwnersRecordsWindow.UIListBoxOwnersRecordsWindow.UIListBoxOwnersRecordsList;
#endregion
Mouse.Click(uIListBoxOwnersRecordsList.Items[index]);
}
以上是InOwnersRecordsWindowClickOnListItem()的修改版本,当我用鼠标单击列表项时,它由Coded UI Test Builder记录。 我不得不将它移动到UIMap.cs,因此每当添加新测试时它都不会被覆盖。是的,它需要检查越界索引值。现在我可以在列表中包含任意数量的“John Smith”,只需指定索引,我就可以通过CodedUI代码点击其中任何一个。
感谢您的建议