Change Silverlight Find Strategy

The default behavior of Test Studio and the Telerik Testing Framework is to time out after a certain interval if the element is not found.

I would like to avoid the Timeout Exception and perform a different set of steps depending on whether the element is found.

Solution

This is possible with a coded solution. Change the SilverlightApp or any FrameworkElement VisualFind.Strategy value to WhenNotVisibleReturnNull.

The example below is against this Silverlight demo site. After navigating there, click DataGrid in the left-hand menu. Then add a coded step:

SilverlightApp app = ActiveBrowser.SilverlightApps()[0];
FindStrategy originalStrategy = app.Find.Strategy;

try
{
    app.Find.Strategy = FindStrategy.WhenNotVisibleReturnNull;
    string gridName = "dataGrid";
    DataGrid grid = app.Find.ByName<DataGrid>(gridName);

    if (grid != null)
    {
        grid.Wait.ForVisible();
        //Perform actions on the DataGrid
    }
    else   
    {
        //You can throw an exception, or perform alternative steps
        throw new ArgumentException(string.Format("Unable to find the DataGrid named '{0}'!", gridName));
    }
}
finally
{
    app.Find.Strategy = originalStrategy;
}
Dim app As SilverlightApp = ActiveBrowser.SilverlightApps()(0)
Dim originalStrategy As FindStrategy = app.Find.Strategy

Try
    app.Find.Strategy = FindStrategy.WhenNotVisibleReturnNull
    Dim gridName As String = "dataGrid"
    Dim grid As DataGrid = app.Find.ByName(Of DataGrid)(gridName)

    If grid IsNot Nothing Then

        grid.Wait.ForVisible()
    Else

        Throw New ArgumentException(String.Format("Unable to find the DataGrid named '{0}'!", gridName))
    End If
Finally
    app.Find.Strategy = originalStrategy
End Try

Note: As is, the IF portion is executed. You can disable step two (treeview item 'DataGrid' select action) to see the ELSE portion execute.