Example #1
0
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            IReadOnlyList <IDomElement> elements = null;

            if (_selector != null)
            {
                elements = await framework.FindDomElementsBySelectorAsync(
                    MethodChainOffset,
                    _selector);
            }

            if (_domElements != null)
            {
                elements = await framework
                           .FindDomElementsByCssSelectorsAsync(
                    MethodChainOffset,
                    _domElements
                    .Select(x => x.CssSelector)
                    .ToArray());
            }

            if (elements == null || elements.Count == 0)
            {
                throw ExpectationNotMetException.FromMethodChainNode(this, framework.UserAgentName, "No matching elements were found.");
            }
        }
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            var fromNode = Parent.Parent;
            var toNode   = Parent;

            if (fromNode.Elements.Count == 0)
            {
                throw new AutomationException("The drag/drop operation failed because the \"from\" selector did not match any element.");
            }

            if (toNode.Elements.Count == 0)
            {
                throw new AutomationException("The drag/drop operation failed because the \"to\" selector did not match any element.");
            }

            if (fromNode.Elements.Count > 1)
            {
                throw new AutomationException("The drag/drop operation failed because the \"from\" selector matched more than one element.");
            }

            if (toNode.Elements.Count > 1)
            {
                throw new AutomationException("The drag/drop operation failed because the \"to\" selector matched more than one element.");
            }

            await framework.DragDropAsync(
                fromNode.Elements.Single(),
                fromNode.OffsetX,
                fromNode.OffsetY,
                toNode.Elements.Single(),
                toNode.OffsetX,
                toNode.OffsetY);

            await base.OnExecuteAsync(framework);
        }
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            while (!await _predicate())
            {
                await Task.Delay(100);
            }

            await base.OnExecuteAsync(framework);
        }
Example #4
0
        public JavaScriptScope(
            IWebAutomationFrameworkInstance automationFrameworkInstance,
            IJavaScriptTunnel domTunnel)
        {
            _automationFrameworkInstance = automationFrameworkInstance;
            _domTunnel = domTunnel;

            _variables = new HashSet <string>();
        }
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            Elements = await framework.FindDomElementsBySelectorAsync(
                MethodChainOffset,
                _selector);

            if (DelegatedFrom != null)
            {
                DelegatedFrom.Elements = Elements;
            }
        }
        public async Task <IReadOnlyList <IDomElement> > FindDomElementsByCssSelectorsAsync(
            IWebAutomationFrameworkInstance automationFrameworkInstance,
            int methodChainOffset,
            string[] selectors)
        {
            var findElementsScript = GenerateFindElementsScriptFromCssSelectors(selectors);

            return(await GetDomElementsFromJavaScriptCode(
                       automationFrameworkInstance,
                       methodChainOffset,
                       $"return {findElementsScript}"));
        }
        public async Task <IReadOnlyList <IDomElement> > GetDomElementsFromSelector(
            IWebAutomationFrameworkInstance automationFrameworkInstance,
            int methodChainOffset,
            string selector)
        {
            var scriptToExecute =
                _domSelectorStrategy.DomSelectorLibraryJavaScript + "; " +
                _domSelectorStrategy.GetJavaScriptForRetrievingDomElements(selector);

            return(await GetDomElementsFromJavaScriptCode(
                       automationFrameworkInstance,
                       methodChainOffset,
                       scriptToExecute));
        }
        public async Task DispatchDomElementFocusEventAsync(
            IWebAutomationFrameworkInstance automationFrameworkInstance,
            IDomElement domElement,
            string eventName)
        {
            var findElementsScript = GenerateFindElementsScriptFromCssSelectors(domElement.CssSelector);

            await automationFrameworkInstance.EvaluateJavaScriptExpressionAsync(
                WrapJavaScriptInIsolatedFunction($@"
                    var e = new FocusEvent('{eventName}');

                    var element = [...{findElementsScript}][0];
                    element.dispatchEvent(e);
                "));
        }
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            if (_delegatedFrom != null)
            {
                if (_selector == null)
                {
                    _selector = _delegatedFrom._selector;
                }

                if (Elements == null && _delegatedFrom.Elements != null && _delegatedFrom.Elements.Count > 0)
                {
                    Elements = _delegatedFrom.Elements;
                }
            }

            var hasNoElements = Elements == null;

            if (hasNoElements && _selector == null)
            {
                throw new InvalidOperationException("Elements to target must be found either via a selector or a list of elements.");
            }

            if (hasNoElements)
            {
                Elements = await framework.FindDomElementsBySelectorAsync(
                    MethodChainOffset,
                    _selector);
            }

            if (_delegatedFrom != null)
            {
                _delegatedFrom.Elements = Elements;
            }

            await base.OnExecuteAsync(framework);

            if (_delegatedFrom != null)
            {
                _delegatedFrom.Elements = Elements;
            }
        }
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            var fileOffset = -1;

            foreach (var screenshot in Parent.Screenshots)
            {
                ++fileOffset;

                var fileName = _jpegFilePath(framework, fileOffset, screenshot.element);

                using (screenshot.bitmap)
                    using (var screenshotImage = SKImage.FromBitmap(screenshot.bitmap))
                        using (var screenshotBytes = screenshotImage.Encode(SKEncodedImageFormat.Jpeg, 100))
                            using (var fileStream = File.OpenWrite(fileName))
                            {
                                screenshotBytes.SaveTo(fileStream);
                            }
            }

            await base.OnExecuteAsync(framework);
        }
        public async Task DispatchDomElementDragEventAsync(
            IWebAutomationFrameworkInstance automationFrameworkInstance,
            IDomElement domElement,
            string eventName,
            string dataTransferExpression)
        {
            var findElementsScript = GenerateFindElementsScriptFromCssSelectors(domElement.CssSelector);

            await automationFrameworkInstance.EvaluateJavaScriptExpressionAsync(
                WrapJavaScriptInIsolatedFunction($@"
                    var e;
                    try {{
                        e = new DragEvent('{eventName}', {{ dataTransfer: {dataTransferExpression} }});
                    }} catch(ex) {{
                        e = document.createEvent('DragEvent');
                        e.initDragEvent('{eventName}', true, true, null, null, null, null, null, null, false, false, false, false, null, null, {dataTransferExpression});
                    }}

                    var element = [...{findElementsScript}][0];
                    element.dispatchEvent(e);
                "));
        }
 protected override Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
 {
     return(base.OnExecuteAsync(framework));
 }
        protected override async Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
        {
            await framework.OpenAsync(_uri);

            await base.OnExecuteAsync(framework);
        }
Example #14
0
 protected override Task OnExecuteAsync(IWebAutomationFrameworkInstance framework)
 {
     return(Task.CompletedTask);
 }
        public async Task <IReadOnlyList <IDomElement> > GetDomElementsFromJavaScriptCode(
            IWebAutomationFrameworkInstance automationFrameworkInstance,
            int methodChainOffset,
            string scriptToExecute)
        {
            var finalScriptToExecute = WrapJavaScriptInIsolatedFunction($@"
				var elements = {WrapJavaScriptInIsolatedFunction(scriptToExecute)};
				var returnValues = [];

				for(var i = 0; i < elements.length; i++) {{
					var element = elements[i];

					var attributes = [];
					var computedStyleProperties = [];

					var tag = element.getAttribute('data-fluffyspoon-tag') || '{methodChainOffset}-'+i;
					element.setAttribute('data-fluffyspoon-tag', tag);

					var o;

					for(o = 0; o < element.attributes.length; o++) {{
						var attribute = element.attributes[o];
						attributes.push({{
							name: attribute.name,
							value: attribute.value
						}});
					}}

					var computedStyle = getComputedStyle(element);
					for(o = 0; o < computedStyle.length; o++) {{
						var styleKey = computedStyle[o];
						computedStyleProperties.push({{
							property: styleKey,
							value: computedStyle.getPropertyValue(styleKey)
						}});
					}}

					var boundingClientRectangle = element.getBoundingClientRect();

					returnValues.push({{
						tag: tag,
						attributes: attributes,
						computedStyle: computedStyleProperties,
						textContent: element.textContent,
						innerText: element.innerText,
						value: element.value,
                        tagName: element.tagName,
						clientLeft: element.clientLeft,
						clientTop: element.clientTop,
						clientWidth: element.clientWidth,
						clientHeight: element.clientHeight,
                        updatedAt: new Date(),
						boundingClientRectangle: {{
							left: boundingClientRectangle.left,
							right: boundingClientRectangle.right,
							top: boundingClientRectangle.top,
							bottom: boundingClientRectangle.bottom
						}}
					}});
				}}

				return JSON.stringify(returnValues);
			"            );

            var resultJsonBlobs = await automationFrameworkInstance.EvaluateJavaScriptExpressionAsync(finalScriptToExecute);

            Debug.Assert(resultJsonBlobs != null, "result json blobs not null");

            var blobs = JsonConvert.DeserializeObject <ElementWrapper[]>(resultJsonBlobs);

            return(blobs
                   .Select(x =>
            {
                var attributes = new DomAttributes();
                foreach (var attribute in x.Attributes)
                {
                    attributes.Add(attribute.Name, attribute.Value);
                }

                var computedStyle = new DomStyle(x.ComputedStyle);

                var domElement = new DomElement(
                    cssSelector: "[data-fluffyspoon-tag='" + x.Tag + "']",
                    textContent: x.TextContent,
                    innerText: x.InnerText,
                    value: x.Value,
                    tagName: x.TagName,
                    clientLeft: x.ClientLeft,
                    clientTop: x.ClientTop,
                    clientWidth: x.ClientWidth,
                    clientHeight: x.ClientHeight,
                    boundingClientRectangle: x.BoundingClientRectangle,
                    attributes: attributes,
                    computedStyle: computedStyle,
                    updatedAt: x.UpdatedAt);

                return domElement;
            })
                   .ToArray());
        }
 public IJavaScriptScope DeclareScope(IWebAutomationFrameworkInstance automationFrameworkInstance)
 {
     return(new JavaScriptScope(
                automationFrameworkInstance,
                this));
 }