我真正想要的是一种检查控件是否存在而不会抛出错误的方法。
代码看起来像这样:
Control myControl = UIMap.MyMainWindow;
if (!myControl.Exists)
{
//Do something here
}
问题是控件会抛出错误,因为如果它不存在则无效,这实际上使exists属性无效。
解决方案是什么?
答案 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 Catch
或TryFind
快得多。因为它不等待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));
有关这些方法的更多信息,请参阅此链接: