在WPF CodedUI中更快地搜索顶级窗口

本文关键字:搜索 窗口 WPF CodedUI | 更新日期: 2023-09-27 18:12:37

我的应用程序有几个部分应该关闭一个窗口。使用code - ui检查这些窗口是否已关闭是非常缓慢的。现在我的代码看起来像这样:

Assert.IsFalse(UIMap.SomeWindow.TryFind(),
            "X Window found when should be closed");

问题是,这需要大约30秒的时间来搜索,并且使用了大约5次,我有大约10个类似的窗口都在测试中。如果可能的话,我希望减少这个时间,因为它使我的测试变慢了。

我也尝试了一个动态的解决方案(这是基本相同的UIMap实现):

var window = new WpfWindow();
window.SearchProperties.Add(UITestControl.PropertyNames.Name, "Window Title");
Assert.IsFalse(window.TryFind());

这也一样慢。这将是很好的使用ApplicationUnderTest作为搜索父,但由于窗口是顶级的,它似乎不工作。

在我的系统中查看打开的窗口(5),并根据搜索参数检查它们的标题,这应该不会太难吧?

编辑:Using SearchConfiguration。VisibleOnly似乎也没有帮助。

在WPF CodedUI中更快地搜索顶级窗口

居然在LinkedIn上找到了我的答案。

现在使用:

Playback.PlaybackSettings.SearchTimeout = 1000; //in ms
Playback.PlaybackSettings.ShouldSearchFailFast = true;

来源:https://www.linkedin.com/grp/post/3828241 - 5843659258196959234

(C& p):

//Search Settings
// Value is in milliseconds. Default search timeout is 2 minutes. 
// The search engine will continue making passes until the timeout has expired 
// or the window has been found.
settings.SearchTimeout = 10000;
// Default search will make 3 attempts. 
// If true the default 3 attempts is applied. If false then only one attempt should take place. 
settings.ShouldSearchFailFast = true;

我想可能会有更好的答案。如果像这样设置一个全局配置,并且必须处理一个WPF表并找到一个特定的单元格,您可能会发现它不起作用。

如果有任何动态标题,使用Window name通常不是一个好主意,Control name是一个很好的常量。听起来你传递的搜索属性很差。您可以使用drawighlight()来查看CUI是否真的找到了您的控件。首先将主父窗口传递给close窗口方法,然后将其用作try。
public static WinWindow _mainParent(string MainParentCtlName)
    {
        var _mainForm = new WinWindow();
        _mainForm.SearchProperties.Add("ControlName", MainParentCtlName);
        return _mainForm;
    }
public static void CloseWindow(string MainWinCtlName)
    {
        var close = new WinButton(_mainParent(MainWinCtlName));
        close.SearchProperties.Add("Name", "Close");
        Mouse.Click(close);
    }
try
{CloseWindow("MainWindowForm")}
catch{}