You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让[UITestMethod]在WinUI3应用完全加载后执行?

解决WinUI3 UI测试等待App.Loaded事件触发的问题

要让UI测试在App的Loaded事件触发后再执行,核心思路是在测试代码中监听这个事件,通过异步等待机制确保测试逻辑晚于事件触发执行。以下是具体实现方案:

基于TaskCompletionSource的异步等待方案

在你的UI测试类中,通过TaskCompletionSource创建一个可等待的任务,订阅App的Loaded事件,当事件触发时完成这个任务,之后再执行测试逻辑:

[TestClass]
public class MainWindowUITests
{
    [TestMethod]
    public async Task ExecuteTestAfterAppLoaded()
    {
        // 获取当前App实例
        var appInstance = (App)Application.Current;
        var loadCompletionSource = new TaskCompletionSource<bool>();

        // 定义事件处理方法
        void AppLoadedHandler()
        {
            // 触发后立即取消订阅,避免内存泄漏
            appInstance.Loaded -= AppLoadedHandler;
            loadCompletionSource.SetResult(true);
        }

        // 订阅Loaded事件
        appInstance.Loaded += AppLoadedHandler;

        // 等待Loaded事件触发
        await loadCompletionSource.Task;

        // ------------------------------
        // 这里编写你的UI测试逻辑
        // 示例:验证主窗口内容是否已替换为Grid
        Assert.IsInstanceOfType(appInstance.MainWindow.Content, typeof(Grid));
        // ------------------------------
    }
}

关键说明

  1. 异步测试标记:测试方法必须标记为async Task,确保测试框架能正确处理异步等待逻辑。
  2. 事件订阅清理:在事件触发后立即移除订阅,防止后续测试出现不必要的事件绑定或内存泄漏。
  3. App实例获取:通过Application.Current获取当前运行的App实例,前提是你的测试项目已正确初始化并启动了WinUI3应用。

如果你的UI测试基于WinAppDriver等自动化框架,也可以通过监听界面元素的状态变化(比如等待目标元素出现)来间接实现等待,但直接监听App的Loaded事件是最直接可靠的方式。

内容的提问来源于stack exchange,提问作者Substitute

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:52:38