Пример #1
0
        public async Task <string> CreateNewVariableAsync(string expression)
        {
            var key      = "fluffy-spoon-" + Guid.NewGuid().ToString();
            var accessor = GetAccessorFromKey(key);
            await _automationFrameworkInstance.EvaluateJavaScriptExpressionAsync($"{accessor} = {expression}");

            _variables.Add(key);
            return(accessor);
        }
        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);
                "));
        }
        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);
                "));
        }
        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());
        }