Example #1
0
        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);
        }
Example #2
0
        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 }));
        }
Example #3
0
        protected UiObjectProxy(Type classToProxy, IEnumerable <Locator> locators, IUiElementLocator locator, bool cache, IUiElement parent = null)
            : base(classToProxy)
        {
            _locators = locators;
            _locator  = locator;

            _parent = parent;
            _cache  = cache;
        }
Example #4
0
        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);
        }
Example #5
0
        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);
                }
            }
        }
Example #6
0
 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();
Example #7
0
 public UiElementProxy(Type classToProxy, IEnumerable <Locator> locators, IUiElementLocator locator, bool cache, IUiElement parent = null)
     : base(classToProxy, locators, locator, cache, parent)
 {
 }
Example #8
0
 private static void InitUiElements <T>(T page, IUiElementLocator locator)
 => InitUiElements(page, locator, new DefaultPageObjectDecorator());
Example #9
0
        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.");
            }
        }