FlaUI无法识别Inspect可见元素及读取应用实际Value属性问题
问题解决方法
1. 适配UIA3模式并调整缓存配置
FlaUI默认的UIA3缓存策略会跳过动态渲染的自定义网格子项,初始化Automation对象时关闭默认缓存过滤、开启完整元素树遍历即可:
// 初始化时使用UIA3并禁用元素缓存过滤 using var automation = new UIA3Automation(); automation.CacheRequest.AutomationElementMode = AutomationElementMode.Full; // 显式请求需要的属性和模式 automation.CacheRequest.Add(AutomationObjectIds.ValuePattern); automation.CacheRequest.Add(AutomationObjectIds.LegacyIAccessiblePattern); automation.CacheRequest.Add(AutomationElement.NameProperty); automation.CacheRequest.Add(AutomationElement.AutomationIdProperty);
2. 解析资源ID占位符获取真实文本
你获取到的[#30093]是Win32类应用的字符串资源ID,可通过系统API加载对应进程的资源字符串拿到真实值:
// 匹配资源ID占位符的正则规则 var resourceMatch = Regex.Match(rawValue, @"\[#(\d+)\]"); if (resourceMatch.Success) { uint resId = uint.Parse(resourceMatch.Groups[1].Value); // 获取目标控件所属进程的句柄 var processHandle = Process.GetProcessById(targetElement.ProcessId).Handle; // 调用系统API加载资源字符串 StringBuilder sb = new StringBuilder(2048); LoadString(processHandle, resId, sb, sb.Capacity); string realValue = sb.ToString(); }
对应P/Invoke声明:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] static extern int LoadString(IntPtr hInstance, uint uID, StringBuilder lpBuffer, int nBufferMax);
3. 调整遍历深度参数
FlauInspect看不到子元素是因为默认遍历深度限制,查找元素时显式指定遍历深度和范围即可:
// 查找网格窗口时指定TreeScope为Subtree,关闭遍历深度限制 var gridWindow = automation.GetDesktop().FindFirstDescendant(cf => cf.ByName("你的网格窗口标题"), new TreeTraversalOptions { Depth = int.MaxValue }); // 强制刷新元素子树缓存 gridWindow.InvalidateChildrenCache(); var gridItems = gridWindow.FindAllDescendants(cf => cf.ByControlType(ControlType.ListItem));
4. 兼容读取方案
如果ValuePattern无法获取到有效值,尝试用LegacyIAccessible模式读取:
if (targetElement.TryGetPattern(out LegacyIAccessiblePattern legacyPattern)) { string realValue = legacyPattern.Name ?? legacyPattern.Value; }
内容的提问来源于stack exchange,提问作者SandyKrish
相关产品推荐
相关产品推荐

