如何在FLAUI中查找名称以指定字符开头或包含指定字符的子元素并关联Office文件窗口
解决FlaUI中按名称开头/包含特定字符定位窗口的问题
我刚好之前做过类似的FlaUI自动化Office文件的场景,来帮你搞定这个定位问题!
FlaUI的FindFirstChild默认的ByName是精确匹配,但我们可以用它内置的通配符支持或者自定义条件来实现开头/包含的匹配逻辑,下面分两种方案给你讲解:
方案1:用ByNameLike(通配符匹配)
FlaUI的ConditionFactory提供了ByNameLike方法,支持用*作为通配符:
*DOC*:匹配名称包含"DOC"的元素DOC*:匹配名称以"DOC"开头的元素
如果要同时匹配多个关键词(比如DOC/PPT/XLS/TXT),可以用Or把多个条件组合起来。修改你的代码如下:
// 把Automation实例提到循环外,避免重复创建 var automation = new UIA3Automation(); foreach (var file in listOfFiles) { if (file.Name.Contains("DOC") || file.Name.Contains("PPT") || file.Name.Contains("XLS") || file.Name.Contains("TXT")) { file.AsButton().Invoke(); var desktopWindow = automation.GetDesktop(); // 等待窗口出现,匹配名称包含DOC/PPT/XLS/TXT的窗口 desktopWindow = WaitForElement(() => desktopWindow.FindFirstChild(cr => cr.ByNameLike("*DOC*") .Or(cr.ByNameLike("*PPT*")) .Or(cr.ByNameLike("*XLS*")) .Or(cr.ByNameLike("*TXT*")) )); var app = FlaUI.Core.Application.Attach(desktopWindow.Properties.ProcessId); var application = app.GetMainWindow(automation); CloseingProcess(application.Name); } }
方案2:自定义PropertyCondition(更灵活的匹配)
如果你需要更精确的控制(比如严格的开头匹配,而不是通配符),可以直接使用PropertyCondition结合PropertyConditionOperator:
PropertyConditionOperator.BeginsWith:匹配名称以指定字符串开头的元素PropertyConditionOperator.Contains:匹配名称包含指定字符串的元素
同样用OrCondition组合多个条件,代码示例:
var automation = new UIA3Automation(); foreach (var file in listOfFiles) { if (file.Name.Contains("DOC") || file.Name.Contains("PPT") || file.Name.Contains("XLS") || file.Name.Contains("TXT")) { file.AsButton().Invoke(); var desktopWindow = automation.GetDesktop(); // 构建多个条件:名称以DOC/PPT/XLS/TXT开头,或者包含这些字符串(根据你的需求选一种) var condition = new OrCondition( new PropertyCondition(AutomationElement.NameProperty, "DOC", PropertyConditionOperator.BeginsWith), new PropertyCondition(AutomationElement.NameProperty, "PPT", PropertyConditionOperator.BeginsWith), new PropertyCondition(AutomationElement.NameProperty, "XLS", PropertyConditionOperator.BeginsWith), new PropertyCondition(AutomationElement.NameProperty, "TXT", PropertyConditionOperator.BeginsWith) // 如果要改成包含,把BeginsWith换成Contains即可 ); // 等待窗口出现 desktopWindow = WaitForElement(() => desktopWindow.FindFirstChild(condition)); var app = FlaUI.Core.Application.Attach(desktopWindow.Properties.ProcessId); var application = app.GetMainWindow(automation); CloseingProcess(application.Name); } }
注意事项
- 避免重复创建Automation实例:把
UIA3Automation的创建移到循环外面,减少资源开销。 - WaitForElement的超时:如果你的
WaitForElement方法支持设置超时时间,建议加上,避免无限等待(比如WaitForElement(..., timeout: TimeSpan.FromSeconds(10)))。 - 窗口名称的准确性:Office文件打开后的窗口名称通常是“文件名 - 软件名”(比如“test.docx - Word”),所以用
*DOC*或者BeginsWith("test.docx")都能匹配,根据你的实际需求调整。
内容的提问来源于stack exchange,提问作者phux
相关产品推荐
相关产品推荐

