我使用搜索UI元素的方法:
public static bool findtopuielm(string uiitemname)
{
bool res = false;
try
{
AutomationElement desktopelem = AutomationElement.RootElement;
if (desktopelem != null)
{
Condition condition = new PropertyCondition(AutomationElement.NameProperty, uiitemname);
AutomationElement appElement = desktopelem.FindFirst(TreeScope.Descendants, condition);
if (appElement != null)
{
res = true;
}
}
return res;
}
catch (Win32Exception)
{
// To do: error handling
return false;
}
}
此方法由另一个等待元素的方法调用,直到它出现在桌面上。
public static void waittopuielm(string appname, int retries = 1000, int retrytimeout = 1000)
{
for (int i = 1; i <= retries; i++)
{
if (findtopuielm(appname))
break;
Thread.Sleep(retrytimeout);
}
}
当我调用最后一个函数时,例如:
waittopuielm( “测试”);
即使找不到元素,它也总是返回true,在这种情况下我希望测试失败。 任何建议都会受到欢迎。
答案 0 :(得分:2)
看起来你的 waittopuielem 方法返回void - 你的意思是发布类似这个版本的东西,它返回一个bool?
public static bool waittopuielm(string appname, int retries = 1000, int retrytimeout = 1000)
{
bool foundMatch = false;
for (int i = 1; i <= retries; i++)
{
if (findtopuielm(appname))
{
foundMatch = true;
break;
}
else
{
Console.WriteLine("No match found, sleeping...");
}
Thread.Sleep(retrytimeout);
}
return foundMatch;
}
除此之外,您的代码似乎对我有效。
一个建议:在 findtopuielm 方法中,将桌面元素搜索中的TreeScope值从TreeScope.Descendants更改为TreeScope.Children:
AutomationElement appElement = desktopelem.FindFirst(TreeScope.Children, condition);
TreeScope.Descendants可能正在进行比你想要的更多的递归搜索 - 将搜索桌面元素的所有子元素,以及这些元素的每个子元素(即按钮,编辑控件等)。
因此,在搜索相对常见的字符串时找到错误元素的可能性很高,除非您将NameProperty PropertyCondition与AndCondition中的其他属性组合在一起以缩小搜索范围。