循环中的“control.Exists”第一次工作,而不是第二次编码ui

时间:2014-12-17 12:57:20

标签: coded-ui-tests

考虑代码

for(i = 0; i < 5; i++)
{
    if(control.Exists)
    {
        mouse.Click(button);
    }
}

在此,控件是一个弹出窗口。第一次执行时,control.Exists = true,第二次虽然控件存在,但它是假的。为什么会这样?如何使它成为现实?

提前致谢。

3 个答案:

答案 0 :(得分:2)

程序经常绘制另一个控件的副本,它看起来与眼睛完全相同但却不同。因此,循环control周围的第二次引用控件的旧版本,但它不再存在。

您的代码可能等同于

for(i = 0; i < 5; i++)
{
    if(top.middle.control.Exists)
    {
        mouse.Click(top.middle.button);
    }
}

UI控制层次结构中可能有更多级别,但有三个级别足以在此处进行解释。

正常修复是在使用控件之前找到控件的新副本。因此,将代码更改为

for(i = 0; i < 5; i++)
{
    top.middle.Find();
    if(top.middle.control.Exists)
    {
        mouse.Click(top.middle.button);
    }
}

如果这不起作用,因为middle也不可用,请使用top.Find();

要详细了解哪些控件可用,请尝试这样的代码,并观察屏幕的哪些部分用蓝色框突出显示。

for(i = 0; i < 5; i++)
{
    top.DrawHighLight();
    top.middle.DrawHighLight();
    top.middle.control.DrawHighLight();
    if(top.middle.control.Exists)
    {
        mouse.Click(top.middle.button);
    }
}

答案 1 :(得分:0)

改为使用TryFind(),并设置searchTimeout。

答案 2 :(得分:0)

您可以使用Inspect / UISpy检查控件的 RuntimeId 。我认为这是一种控制方式。 AdrianHHH的回复中描述的版本。

但是,让我最困惑的是我可以在第一次使用找到的控件,在以下循环中,虽然我的应用程序重新启动。