当从具有相同项目的列表中进行选择时,编码UI会感到困惑
本文关键字:编码 选择 UI 行选 项目 列表 | 更新日期: 2023-09-27 18:17:17
在我的应用程序的一个窗口中,我有一个列表框显示2条记录:
约翰·史密斯约翰·史密斯这是两个不同的记录。当我用手点击第一张约翰·史密斯的唱片时,我应该看到他的电话号码(555- 5555 -5555),我也看到了。当我点击第二个John Smith记录时,我应该看到不同的电话号码(777-777-7777),我也这样做了。
然而,当我记录单击列表中的第一个项目时,我得到与单击列表中的第二个项目时完全相同的代码(CodedUI正在通过显示文本查找列表中的"John Smith"项目,然后选择它,而不是在我单击的任何列表索引中选择一个项目)。然后,当我想验证第二个John Smith的电话号码(777-777-7777)时,我的断言失败了,因为CodedUI选择了第一条记录,并获得了第一个John Smith的号码(555- 5555 -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
}
有一个解决方法,但需要手工编码。此外,如果你能分享页面的代码,该列表位于,这将是更容易为我提供帮助。问这个问题是因为你可以使用亲子关系。假设这是一个标准的html列表,id为
<ul id=”list”>
<li>John Smith</li>
<li>John Smith</li>
</ul>
你找到了你想要的John Smith,父子关系
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;
}
如果list是span在div或类似的东西里面,逻辑是一样的。首先通过一些控件找到父母(id或友好的名字是最好的),然后搜索children &这也可以在多个层面上完成。
我纠结了一段时间,然后意识到当我手动从列表中选择项目时,我只需单击列表中特定位置的项目。我可以在CodedUI代码中做同样的事情——
public void InOwnersRecordsWindowClickOnListItemAtIndex(int index)
{
#region Variable Declarations
WinList uIListBoxOwnersRecordsList = this.UIOwnersRecordsWindow.UIListBoxOwnersRecordsWindow.UIListBoxOwnersRecordsList;
#endregion
Mouse.Click(uIListBoxOwnersRecordsList.Items[index]);
}
以上是inownersrecordswindowclickonlisttitem()的修改版本,当我用鼠标单击列表项时,由Coded UI Test Builder记录。我必须将其移动到UIMap.cs中,以便在添加新测试时不会被覆盖。是的,它需要检查出界的索引值。现在我可以在列表中拥有任意数量的"John Smith",并且我可以让CodedUI代码通过简单地指定索引来单击其中的任何一个。
谢谢你的建议