public static T InitUiElements <T>(IUiElementLocator locator) { T page = default(T); Type pageClassType = typeof(T); ConstructorInfo ctor = pageClassType.GetConstructor(new Type[] { typeof(IBrowserDriver) }); if (ctor == null) { throw new ArgumentException($"No constructor for the specified class containing a single argument of type {nameof(IBrowserDriver)} can be found"); } if (locator == null) { throw new ArgumentNullException(nameof(locator), "locator cannot be null"); } IBrowserDriver driver = locator.UiElementFinder as IBrowserDriver; if (driver == null) { throw new ArgumentException("The ui element finder of the locator must implement IBrowesDriver", nameof(locator)); } page = (T)ctor.Invoke(new object[] { driver }); InitUiElements(page, locator); return(page); }
private static object CreateProxyObject(Type memberType, IUiElementLocator locator, IEnumerable <Locator> locators, bool cache, IUiElement parent = null) { MethodInfo method = null; if (memberType.IsGenericType) { var genericTypeDef = memberType.GetGenericTypeDefinition(); if (genericTypeDef.Equals(typeof(IList <>))) { var arguments = memberType.GetGenericArguments(); if (arguments.Length == 1 && (arguments[0].Equals(InterfaceToBeProxied) || InterfaceToBeProxied.IsAssignableFrom(arguments[0]))) { var proxyType = typeof(UiElementListProxy <>).MakeGenericType(arguments[0]); method = proxyType.GetMethod("CreateProxy", BindingFlags.Public | BindingFlags.Static); } } } else if (memberType.IsInterface && (memberType.GetInterface(InterfaceToBeProxied.Name) != null || memberType.IsAssignableFrom(InterfaceToBeProxied))) { var proxyType = typeof(UiElementProxy <>).MakeGenericType(memberType); method = proxyType.GetMethod("CreateProxy", BindingFlags.Public | BindingFlags.Static); } else { throw new ArgumentException($"Type of member '{memberType.Name}' isn't a IList<{InterfaceToBeProxied.Name}>,{InterfaceToBeProxied.Name} or derived interface."); } return(method.Invoke(null, new object[] { memberType, locators, locator, cache, parent })); }
protected UiObjectProxy(Type classToProxy, IEnumerable <Locator> locators, IUiElementLocator locator, bool cache, IUiElement parent = null) : base(classToProxy) { _locators = locators; _locator = locator; _parent = parent; _cache = cache; }
public static void InitUiElements(object page, IUiElementLocator locator, IPageObjectDecorator decorator) { if (page == null) { throw new ArgumentNullException(nameof(page), "page cannot be null"); } if (locator == null) { throw new ArgumentNullException(nameof(locator), "locator cannot be null"); } if (decorator == null) { throw new ArgumentNullException(nameof(decorator), "decorator cannot be null"); } decorator.Decorate(locator, page); }
private static void SetProxyToPageObject(MemberInfo member, IUiElementLocator locator, object pageObject, IUiElement parent = null) { var locators = CreateLocatorList(member); if (locators.Count > 0) { bool cache = ShouldCacheLookup(member); var proxyObject = CreateProxyObject(GetTargetType(member), locator, locators, cache, parent); var field = member as FieldInfo; var property = member as PropertyInfo; if (field != null) { field.SetValue(pageObject, proxyObject); } if (property != null) { property.SetValue(pageObject, proxyObject, null); } } }
public static object CreateProxy(Type classToProxy, IEnumerable <Locator> locators, IUiElementLocator locator, bool cache, IUiElement parent = null) => new UiElementProxy <T>(classToProxy, locators, locator, cache, parent).GetTransparentProxy();
public UiElementProxy(Type classToProxy, IEnumerable <Locator> locators, IUiElementLocator locator, bool cache, IUiElement parent = null) : base(classToProxy, locators, locator, cache, parent) { }
private static void InitUiElements <T>(T page, IUiElementLocator locator) => InitUiElements(page, locator, new DefaultPageObjectDecorator());
public void Decorate(IUiElementLocator locator, object page) { var dict = new Dictionary <MemberInfo, bool>(); var members = GetPageObjectMembers(page); members.ForEach(m => dict.Add(m, false)); var pageObjectType = page.GetType(); int attempts = 3; while (dict.Any(m => !m.Value) && attempts > 0) { foreach (var member in members) { if (dict[member]) { continue; } var locatedOfAttribute = member.GetCustomAttribute <LocatedOfAttribute>(true); if (locatedOfAttribute != null) { var parentMember = members.SingleOrDefault(m => m.Name.Equals(locatedOfAttribute.Member)); var targetParentMemberType = GetTargetType(parentMember); if (!InterfaceToBeProxied.IsAssignableFrom(targetParentMemberType)) { throw new Exception($"Page object '{pageObjectType}' doesn't have allowable member '{locatedOfAttribute.Member}'."); } IUiElement parent = null; var property = parentMember as PropertyInfo; var field = parentMember as FieldInfo; if (property != null) { parent = property.GetValue(page) as IUiElement; } if (field != null) { parent = field.GetValue(page) as IUiElement; } if (parent != null) { SetProxyToPageObject(member, locator, page, parent); dict[member] = true; } } else { SetProxyToPageObject(member, locator, page); dict[member] = true; } } attempts--; } if (dict.Any(m => !m.Value)) { throw new Exception($"Page object '{pageObjectType}' has looping elements or uninitialized members."); } }