Searching and filtering for the UITestControl objects is a straight forward process you can read about in plenty of places. All of them will tell you on how to leverage the SearchProperties and FilterProperties of the object in order to get the access to the desired control.
In both of these properties once you add the new PropertyExpression to the collection, you need to provide the property name. Each class that is based on HtmlControl base class, by contract, implements and exposes a property called PropertyNames. In the property implementation all of the controls do inherit from HtmlControl.PropertyNames which on it’s own brings the content of the class UITestControl.PropertyNames, and extend them with some control specific properties. This class is just a collection of strings, indicating the name of the element we are in search off. As this can sound confusional I’ll make a simple example of my typical control search:
HtmlButton okButton = new HtmlButton(browserWindow); okButton.SearchProperties.Add(HtmlControl.PropertyNames.Id, "btnOk"); okButton.FilterProperties.Add(HtmlControl.PropertyNames.InnerText, "OK");
Now, no matter that the first parameter of the Add method is a string, and that PropertyNames collection is just that, a collection of strings, if the element you are searching for is not listed inside the PropertyNames collection and you try to set it by your custom constant like “style”, the control search will not be correctly performed.
popUpDiv.SearchProperties.Add("style", "display: block");
What is left for us to do in cases like this, is to explore the property called ControlDefinition. All of the attributes of the element we are exploring will be listed inside this property which is part of HtmlControl object. Luckily we can bring this property also inside the search and filtering criteria and we do not need to check the content of the controls in nasty loops and conditional operators.
In the following sample I am searching for my style setting and leveraging the PropertyExpressionOperator to imply a property value contains the given string.
popUpDiv.SearchProperties.Add( HtmlControl.PropertyNames.ControlDefinition, "display: block", PropertyExpressionOperator.Contains);
You also need to be sure on how is your element and it’s value written inside this property as it often has some custom way of picking these values up. The quickest way that works for me is to debug my automation code and check the content of this property.
What I usually do is, narrow the search as much as possible and then resolve all of the controls that match that criteria.
UITestControlCollection controls = popUpDiv.FindMatchingControls();
Once I found my control I do annotate the property value and use this information to setup my search or filtering.
I hope this tip saved you some time as this kind of things are not documented on MSDN nor are popular topic in the blogging community.
Happy coding!