1

我今天正在学习 .NET UI 自动化框架。所以到目前为止我做了什么(参考各种文章)

  1. 有一个 WinForm,上面有 Listbox、PictureBox、TextBox 和 Button 控件。请参考图片:待测试的WinForm

  2. 我有一个控制台应用程序,其中包含所有 UI 自动化测试脚本或代码,可以自动执行 winform UI 测试。

工作: 从列表框中选择项目后,图片框会加载一些图像并显示它(要加载的代码在列表框的 SelectedIndexChanged 事件中)。

下面是 Forms listBox 控件的代码:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
        textBox1.BackColor = Color.White;
        pictureBox1.Image = imageCollection.ElementAtOrDefault(listBox1.SelectedIndex);
        textBox1.Text = pictureBox1.Image.GetHashCode().ToString();
        this.Refresh();
    }

现在我的 UIAutomation 测试脚本代码如下:(只显示了必要的部分)

        AutomationElement listBoxElement = mainFormWindowElement.FindFirst(TreeScope.Children,
            new PropertyCondition(AutomationElement.AutomationIdProperty, "listBox1"));

        Assert.IsNotNull(listBoxElement, "Cant find the listbox element");

        AutomationElementCollection listBoxItems = 
            listBoxElement.FindAll(TreeScope.Children,new PropertyCondition(AutomationElement.ControlTypeProperty,ControlType.ListItem));

        AutomationElement itemToSelectInListBox = listBoxItems[new Random().Next(0, listBoxItems.Count - 1)];

        Object selectPattern = null;

        if (itemToSelectInListBox.TryGetCurrentPattern(SelectionItemPattern.Pattern, out selectPattern))
        {
            (selectPattern as SelectionItemPattern).AddToSelection();
            (selectPattern as SelectionItemPattern).Select();

        }

执行代码后,Select() 方法确实有效,并且 Form 列表框项被选中,如下所示:在此处输入图像描述

正如您在图像中看到的,列表框项目被选中,但事件 SelectedIndexChange 没有被触发,并且图片框没有反映更改。

所以任何指针都有很大的帮助:)

谢谢

4

4 回答 4

1

@zenwalker 列表是否由数据绑定填充?如果是,则有可能选择事件不会触发。你能分享将数据绑定到列表框的代码吗?抱歉,我没有足够的代表来添加评论。

或者,您可以参考以下 SO 文章,了解我们如何对列表框Winforms、数据绑定、列表框和文本框进行数据绑定

于 2011-09-03T20:21:57.880 回答
1

如果将 SelectionMode 更改为 MultiSimple,这将起作用。我不确定为什么会这样。但如果 SelectionMode 为 One,则不会触发 selectedindexevent。

于 2012-01-12T05:45:27.500 回答
1

也许为时已晚,但我仍然希望这对某人有所帮助:

我有同样的问题。能够通过鼠标单击触发事件。对于以下代码,您需要参考 Microsoft.TestAPI ( http://www.nuget.org/packages/Microsoft.TestApi/0.6.0 ),但也有其他方法可以模拟点击。

    static AutomationElement SelectItem(AutomationElement item)
    {
        if (item != null)
        {
            ((SelectionItemPattern)item.GetCurrentPattern(SelectionItemPattern.Pattern)).Select();
            System.Windows.Point point = item.GetClickablePoint();
            Microsoft.Test.Input.Mouse.MoveTo(new System.Drawing.Point((int)point.X, (int)point.Y));
            Microsoft.Test.Input.Mouse.Click(MouseButton.Left);
        }

        return item;
    }
于 2017-01-13T06:58:28.660 回答
0

当设置为单个或一时,该事件SelectedIndexChanged不会被触发。SelectionMode

确保在SelectionChanged触发事件时也更新 PictureBox

于 2014-01-04T23:54:42.280 回答