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); }
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); }
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)); }