我正在使用UI Automation进行GUI测试。
我的窗口标题包含由文件名附加的应用程序名称。
所以,我想在我的Name PropertyCondition中指定Contains。
我检查了重载,但它与忽略名称值的大小有关。
任何人都可以告诉我如何在我的Name PropertyCondition中指定包含吗?
此致
kvk938
答案 0 :(得分:2)
据我所知,在使用name属性时他们无法进行包含,但你可以这样做。
/// <summary>
/// Returns the first automation element that is a child of the element you passed in and contains the string you passed in.
/// </summary>
public AutomationElement GetElementByName(AutomationElement aeElement, string sSearchTerm)
{
AutomationElement aeFirstChild = TreeWalker.RawViewWalker.GetFirstChild(aeElement);
AutomationElement aeSibling = null;
while ((aeSibling = TreeWalker.RawViewWalker.GetNextSibling(aeFirstChild)) != null)
{
if (aeSibling.Current.Name.Contains(sSearchTerm))
{
return aeSibling;
}
}
return aeSibling;
}
然后你会这样做以获取桌面并将带有字符串的桌面传递给上面的方法
/// <summary>
/// Finds the automation element for the desktop.
/// </summary>
/// <returns>Returns the automation element for the desktop.</returns>
public AutomationElement GetDesktop()
{
AutomationElement aeDesktop = AutomationElement.RootElement;
return aeDesktop;
}
完全使用看起来像
AutomationElement oAutomationElement = GetElementByName(GetDesktop(), "Part of my apps name");
答案 1 :(得分:0)
我已经尝试了Max Young的解决方案,但迫不及待想完成它。不确定我的视觉树太大了。我决定这是我的应用程序,应该使用我要搜索的具体元素类型的知识,就我而言,它是WPF TextBlock,所以我做到了这一点:
public AutomationElement FindElementBySubstring(AutomationElement element, ControlType controlType, string searchTerm)
{
AutomationElementCollection textDescendants = element.FindAll(
TreeScope.Descendants,
new PropertyCondition(AutomationElement.ControlTypeProperty, controlType));
foreach (AutomationElement el in textDescendants)
{
if (el.Current.Name.Contains(searchTerm))
return el;
}
return null;
}
示例用法:
AutomationElement textElement = FindElementBySubstring(parentElement, ControlType.Text, "whatever");
并且运行很快。