Skip to content

Instantly share code, notes, and snippets.

@jmarnold
Created October 26, 2010 19:22
Show Gist options
  • Save jmarnold/647589 to your computer and use it in GitHub Desktop.
Save jmarnold/647589 to your computer and use it in GitHub Desktop.
WatiN: jQuery Style
public class DomElement : DynamicObject
{
private readonly object _inner;
public DomElement(object inner)
{
_inner = inner;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
result = _inner
.GetType()
.GetMethod(binder.Name, BindingFlags.Instance | BindingFlags.Public)
.Invoke(_inner, args);
return true;
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = _inner
.GetType()
.GetMember(binder.Name, BindingFlags.Public | BindingFlags.Instance)
.First()
.As<PropertyInfo>()
.GetValue(_inner, null);
return true;
}
}
public class DomSelection : DynamicObject
{
private readonly IEnumerable<DomElement> _domElements;
private readonly IDictionary<string, Func<object[], object>> _methods;
public DomSelection(IEnumerable<DomElement> domElements)
{
_domElements = domElements;
_methods = new Dictionary<string, Func<object[], object>>();
RegisterMethods();
}
private void RegisterMethods()
{
_methods.Add("Any", args => _domElements.Any());
_methods.Add("Count", args => _domElements.Count());
_methods.Add("First", args => _domElements.First());
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
if(_methods.ContainsKey(binder.Name))
{
result = _methods[binder.Name](args);
return true;
}
result = null;
try
{
var localResult = result = null;
_domElements.Each(e => e.TryInvokeMember(binder, args, out localResult));
result = localResult;
}
catch (UnauthorizedAccessException) // COM errors...
{
}
return true;
}
}
public interface IBrowserDriver : IDisposable
{
void Open(string url);
string GetLocation();
dynamic Select(string selector);
}
public class WatinBrowserDriver : IBrowserDriver
{
private readonly string _baseUrl;
private readonly Browser _browser;
public WatinBrowserDriver(string baseUrl)
{
_baseUrl = baseUrl;
_browser = new IE(baseUrl);
}
public void Dispose()
{
_browser.Close();
_browser.Dispose();
}
public void Open(string url)
{
_browser.GoTo(_baseUrl + "/" + url);
}
public string GetLocation()
{
return _browser.Url.Replace(_baseUrl + "/", string.Empty);
}
public dynamic Select(string selector)
{
return new DomSelection(_browser.CssSelectAll(selector).Select(e => new DomElement(e)));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment