当从具有相同项目的列表中进行选择时,编码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
}

当从具有相同项目的列表中进行选择时,编码UI会感到困惑

有一个解决方法,但需要手工编码。此外,如果你能分享页面的代码,该列表位于,这将是更容易为我提供帮助。问这个问题是因为你可以使用亲子关系。假设这是一个标准的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代码通过简单地指定索引来单击其中的任何一个。

谢谢你的建议