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

WPF应用如何通过Appium与WinAppDriver检测应用是否处于最小化状态

解决方案

方法1:通过WinAppDriver原生API直接获取WindowState属性

WinAppDriver 基于Windows UIAutomation框架实现,原生支持读取WPF窗口暴露的WindowState自动化属性,无需额外引入依赖,是优先推荐的方案:

[TestMethod]
public void TestMinimizeWindow()
{
    session.FindElementByAccessibilityId("MinimizeButton").Click();
    // 加短延迟等待窗口状态切换完成,避免异步渲染导致断言失败
    Thread.Sleep(100);
    
    // 定位应用顶层窗口,读取WindowState属性,返回值为字符串类型:Normal/Minimized/Maximized
    var windowStateStr = session.FindElementByXPath("//Window").GetAttribute("WindowState");
    var actualWindowState = Enum.Parse<System.Windows.WindowState>(windowStateStr);
    
    Assert.AreEqual(System.Windows.WindowState.Minimized, actualWindowState);
}

方法2:调用Windows系统API读取窗口状态(兼容极端场景)

如果你的自定义无框窗口没有正确暴露UIA属性,导致方法1拿不到值,可以直接调用Win32 API读取系统层的窗口状态,准确率100%:
首先提前引入API声明:

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
public struct WINDOWPLACEMENT
{
    public int length;
    public int flags;
    public int showCmd;
    public System.Drawing.Point ptMinPosition;
    public System.Drawing.Point ptMaxPosition;
    public System.Drawing.Rectangle rcNormalPosition;
}

[DllImport("user32.dll")]
private static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndpl);

private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;

测试用例写法:

[TestMethod]
public void TestMinimizeWindow()
{
    session.FindElementByAccessibilityId("MinimizeButton").Click();
    Thread.Sleep(100);
    
    // 从session中拿到应用窗口的句柄
    IntPtr hwnd = (IntPtr)Convert.ToInt32(session.CurrentWindowHandle, 16);
    WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
    placement.length = Marshal.SizeOf(placement);
    GetWindowPlacement(hwnd, ref placement);
    
    System.Windows.WindowState actualWindowState = placement.showCmd switch
    {
        SW_SHOWMINIMIZED => System.Windows.WindowState.Minimized,
        SW_SHOWMAXIMIZED => System.Windows.WindowState.Maximized,
        _ => System.Windows.WindowState.Normal
    };
    
    Assert.AreEqual(System.Windows.WindowState.Minimized, actualWindowState);
}

注意事项

  • 优先使用方法1,无需调用系统API,符合UI测试的标准实现逻辑
  • 两种方案都支持最小化、最大化、还原三种状态的校验,不需要修改应用的业务代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:09:02