private List <AutomationElement> Find(TreeScope scope, Condition condition, bool findFirst) { // Parent and Ancestors scopes are not supported on // Windows (this is specified in MSDN, too). if ((scope & TreeScope.Parent) == TreeScope.Parent || (scope & TreeScope.Ancestors) == TreeScope.Ancestors) { throw new ArgumentException("scope"); } List <AutomationElement> found = new List <AutomationElement> (); if ((!findFirst || found.Count == 0) && (scope & TreeScope.Element) == TreeScope.Element && condition.AppliesTo(this) && (CacheRequest.Current == CacheRequest.DefaultRequest || CacheRequest.Current.TreeFilter.AppliesTo(this))) { // TODO: Need to check request's TreeScope, too? found.Add(GetUpdatedCache(CacheRequest.Current)); } if ((!findFirst || found.Count == 0) && ((scope & TreeScope.Children) == TreeScope.Children || (scope & TreeScope.Descendants) == TreeScope.Descendants)) { TreeScope childScope = TreeScope.Element; if ((scope & TreeScope.Descendants) == TreeScope.Descendants) { childScope = TreeScope.Subtree; } AutomationElement current = TreeWalker.RawViewWalker.GetFirstChild(this); while (current != null) { //Log.Debug ("Inspecting child: " + current.Current.Name); found.AddRange(current.Find(childScope, condition, findFirst)); if (findFirst && found.Count > 0) { break; } current = TreeWalker.RawViewWalker.GetNextSibling(current); } } return(found); }