Rough sketch.
Don't include parent in possible find results. Now, DesktopElement does not have to be findable and the base type of WpfElement and DesktopElement can be smaller.
Use weak reference to FrameworkElement so that we don't keep it alive.
Create WpfElement descendants in factory method.
Beautified ToString() for By: replaced variable references with constant values.
ElementFactory, injected into SearchSourceElement.
Extension method on Type for retreiving all base types. Gives more declarative and easier to read code.
Methods for displaying path to a WpfElement, for debugging and error messages.
WpfElement extension method that returns all search criteria for an element, including ancestors.
Rename file.
Project structure.
Added some support for TextBox, finding and typing in text.
Changed ElementFactory into a thread local singleton. Don't really like it, but otherwise the public API will be clumpsy. E.g. the Mouse ought to be a static class and it requires configuration which then has to be a singleton. Once I've started created singletons I might as well continue doing it.
Wait for UI thread to start using synchronization construct.
Converted Dispatcher into thread local singleton (named Invoker).
Made delays after mouse and keyboard actions configurable.
More stuff added to test UI.
Moved creation of Application to test thread, else Application was shutdown when killing the thread which lead to that running a second test failed. Added test for CheckBox.
Generic WpfElement so that each sub-type knows its type. Had to introduce UntypedWpfElement base class. A bit ugly, but acceptable.
Utility methods on WpfElement for invoking with a strong FrameworkElement reference. Simpler code, harder to make a mistake.