【发布时间】:2015-02-16 00:50:39
【问题描述】:
考虑代码
for(i = 0; i < 5; i++)
{
if(control.Exists)
{
mouse.Click(button);
}
}
在这里,控件是一个弹出窗口。第一次执行时,control.Exists = true,第二次执行时为 false,尽管控件存在。为什么呢?如何让它成为现实?
提前致谢。
【问题讨论】:
标签: coded-ui-tests
考虑代码
for(i = 0; i < 5; i++)
{
if(control.Exists)
{
mouse.Click(button);
}
}
在这里,控件是一个弹出窗口。第一次执行时,control.Exists = true,第二次执行时为 false,尽管控件存在。为什么呢?如何让它成为现实?
提前致谢。
【问题讨论】:
标签: coded-ui-tests
程序经常绘制一个控件的另一个副本,它看起来与眼睛相同但又不同。因此,第二次循环 control 指的是旧版本的控件,但它不再存在。
你的代码可能相当于
for(i = 0; i < 5; i++)
{
if(top.middle.control.Exists)
{
mouse.Click(top.middle.button);
}
}
UI Control 层次结构中可能有更多级别,但此处解释三个就足够了。
正常的解决方法是在使用之前找到控件的新副本。所以把代码改成
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);
}
}
【讨论】:
改用 TryFind(),并设置 searchTimeout。
【讨论】:
您可以使用 Inspect/UISpy 来检查控件的 RuntimeId。我认为这是 AdrianHHH 的回复中描述的控制版本。
但是,最让我困惑的是,我可以在第一次使用找到的控件,在下面的循环中,虽然我的应用程序被重新启动了。
【讨论】: