从具有相同项目的列表中选择时,编码UI会混淆

时间:2016-11-10 23:51:43

标签: c# visual-studio coded-ui-tests

在我的一个应用程序窗口中,我有一个显示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
}

2 个答案:

答案 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代码点击其中任何一个。

感谢您的建议