检查控件是否存在会引发错误

时间:2014-06-12 08:17:33

标签: coded-ui-tests

我真正想要的是一种检查控件是否存在而不会抛出错误的方法。

代码看起来像这样:

Control myControl = UIMap.MyMainWindow; 

if (!myControl.Exists)
{
   //Do something here
}

问题是控件会抛出错误,因为如果它不存在则无效,这实际上使exists属性无效。

解决方案是什么?

4 个答案:

答案 0 :(得分:3)

在这种情况下,我使用的是tryfind方法。

像这样:

            HtmlDiv list = new HtmlDiv(Window.GetWebtop());
            list.SearchConfigurations.Add(SearchConfiguration.AlwaysSearch);
            list.SearchProperties.Add(HtmlDiv.PropertyNames.InnerText, "Processing search", PropertyExpressionOperator.Contains);
            if (list.TryFind())
            {
                //DO Something
            }

答案 1 :(得分:1)

我正在重新发布kida给出的评论作为答案,因为我认为这是最好的解决方案。

Control myControl = UIMap.MyMainWindow; 

if (!myControl.FindMatchingControls().Count == 0)
{
   //Do something here
}

FindMatchingControls()。计数Try CatchTryFind快得多。因为它不等待SearchTimeout来检查元素现在是否存在。默认情况下,元素不会等待30秒,但我喜欢我的测试快速失败。

或者可以在Catch或TryFind之前降低Playback.PlaybackSettings.SearchTimeout并在之后恢复它,但如果你问我,这是不必要的代码。

答案 2 :(得分:0)

您可以执行以下两项操作之一:将代码包装在try-catch块中,以便吞下异常:

try
{
    if (!myControl.Exists)
    {
        // Do something here.
    }
}
catch (System.Exception ex)
{
}

或者,您可以添加更多条件:

if (!myControl.Exists)
{
    // Do something here.
}
else if (myControlExists)
{
    // Do something else.
}
else
{
    // If the others don't qualify 
    // (for example, if the object is null), this will be executed.
}

就个人而言,我喜欢catch块,因为如果我希望控件作为测试的一部分存在,我可以Assert.Fail(ex.ToString());在那里停止测试并记录错误消息以用于错误报告。

答案 3 :(得分:0)

如果您确定控制将在一段时间后存在或启用,则可以使用具有默认超时或指定超时的WaitForControlExist()或WaitForControlEnabled()方法。 我有这样的情况,我正在循环,直到控件可用:

bool isSaveButtonExist = uISaveButton.WaitForControlEnabled();

            while (!isSaveButtonExist )
            {
                try
                {
                    uISaveButton.SearchConfigurations.Add(SearchConfiguration.AlwaysSearch);
                    uISaveButton.SetFocus(); // setting focus for the save button if found
                    isSaveButtonExist = uISaveButton.WaitForControlExist(100);
                }
                catch (Exception ex)
                {
                    //Console.WriteLine(ex.Message); // exception for every set focus message if the control not exist
                }

            }
            // do something with found save button
            // Click 'Save' button
            Mouse.Click(uISaveButton, new Point(31, 37));

有关这些方法的更多信息,请参阅此链接:

Make playback wait methods