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
相关产品推荐
相关产品推荐

