事件不会触发列表框项目选择 - .Net UIAutomation框架

时间:2011-09-03 08:45:27

标签: c# winforms user-interface ui-automation microsoft-ui-automation

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

  1. 有一个带有Listbox,PictureBox,TextBox和Button控件的WinForm。请参考图片:WinForm to be tested

  2. 我有一个consoleapp,它拥有所有UI自动化测试脚本或自动执行winform UI测试的代码。

  3. 工作: 从列表框中选择项目后,图片框会加载一些图像并显示它(要加载的代码在列表框的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列表框项 :enter image description here

    正如您在图片中看到的那样,列表框项目已被选中但事件SelectedIndexChange未被触发且图片框未反映更改。

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

    由于

4 个答案:

答案 0 :(得分:1)

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

或者您可以参考以下SO文章,了解我们如何对数据库进行数据绑定Winforms, databinding, Listbox and textbox

答案 1 :(得分:1)

如果SelectionMode更改为MultiSimple,则此方法有效。我不确定为什么会这样。 但是如果SelectionMode为One,则不会触发selectedindexevent。

答案 2 :(得分: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;
    }

答案 3 :(得分:0)

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

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