public static Point GetRandomSpotWithinRect(this Dom.Rect rect, int border = 2) { if (border < 0) { border = Math.Abs(border); } if (rect.Width <= border * 2 || rect.Height <= border * 2) { throw new ArgumentOutOfRangeException(nameof(border)); } if (border == 0) { return(new Point(RandomUtils.Random.NextDouble(rect.X, rect.X + rect.Width), RandomUtils.Random.NextDouble(rect.Y, rect.Y + rect.Height))); } return(GetRandomSpotWithinRect(new Dom.Rect { X = rect.X + border, Y = rect.Y + border, Width = rect.Width - (border * 2), Height = rect.Height - (border * 2) }, 0)); }
public override async Task PerformTask(ISkraprWorker worker) { var documentNode = await worker.Session.DOM.GetDocument(1); var pageDimensions = await worker.Session.Page.GetPageDimensions(documentNodeId: documentNode.NodeId); var nodeIds = await worker.Session.DOM.QuerySelectorAll(new Dom.QuerySelectorAllCommand { NodeId = documentNode.NodeId, Selector = Selector }); foreach (var nodeId in nodeIds.NodeIds) { var highlightObject = await worker.Session.DOM.GetHighlightObjectForTest(nodeId); var contentPath = highlightObject.Paths.FirstOrDefault(p => p.Name == "content"); var contentPathPoints = contentPath.GetQuad(); var targetRect = new Dom.Rect { X = contentPathPoints[0] / pageDimensions.DevicePixelRatio, Y = contentPathPoints[1] / pageDimensions.DevicePixelRatio, Width = highlightObject.ElementInfo.NodeWidth / pageDimensions.DevicePixelRatio, Height = highlightObject.ElementInfo.NodeHeight / pageDimensions.DevicePixelRatio //2.2 }; await worker.Session.DOM.HighlightRect(new Dom.HighlightRectCommand { X = (long)(targetRect.X), Y = (long)(targetRect.Y), Width = (long)(targetRect.Width), Height = (long)(targetRect.Height), Color = Color, OutlineColor = OutlineColor }); } }
public static Point GetMiddleOfRect(this Dom.Rect rect) { return(new Point(rect.X + (rect.Width / 2), rect.Y + (rect.Height / 2))); }
public override async Task PerformTask(ISkraprWorker worker) { var documentNode = await worker.Session.DOM.GetDocument(1); var nodeIds = await worker.Session.DOM.QuerySelectorAll(new Dom.QuerySelectorAllCommand { NodeId = documentNode.NodeId, Selector = Selector }); var nodeId = nodeIds.NodeIds.First(); if (nodeId < 1) { return; } var highlightObject = await worker.Session.DOM.GetHighlightObjectForTest(nodeId); var contentPath = highlightObject.Paths.FirstOrDefault(p => p.Name == "content"); var contentPathPoints = contentPath.GetQuad(); //var scaleFactor = await context.DevTools.GetPageScaleFactor(); //var xScaleFactor = scaleFactor.Item1; //var yScaleFactor = scaleFactor.Item2; var targetClickRect = new Dom.Rect { X = contentPathPoints[0], Y = contentPathPoints[1], Width = highlightObject.ElementInfo.NodeWidth, Height = highlightObject.ElementInfo.NodeHeight }; //var targetRect = new Dom.Rect //{ // X = contentPathPoints[0] / xScaleFactor, // Y = contentPathPoints[1] / yScaleFactor, // Width = highlightObject.ElementInfo.NodeWidth / xScaleFactor, // Height = highlightObject.ElementInfo.NodeHeight / yScaleFactor //2.2 //}; //await context.Session.DOM.HighlightRect(new Dom.HighlightRectCommand //{ // X = (long)(targetRect.X), // Y = (long)(targetRect.Y), // Width = (long)(targetRect.Width), // Height = (long)(targetRect.Height), // Color = new Dom.RGBA // { // R = 0, // G = 0, // B = 255, // A = 0.7 // }, // OutlineColor = new Dom.RGBA // { // R = 255, // G = 0, // B = 0, // A = 1 // }, //}); var target = targetClickRect.GetRandomSpotWithinRect(); ////Validation //var targetNodeId = await context.Session.DOM.GetNodeForLocation(new Dom.GetNodeForLocationCommand //{ // X = (long)target.X, // Y = (long)target.Y //}); //await context.Session.DOM.HighlightRect(new Dom.HighlightRectCommand //{ // X = (long)target.X, // Y = (long)target.Y, // Width = 1, // Height = 1, // Color = new Dom.RGBA // { // R = 255, // G = 255, // B = 0, // A = 1 // }, // OutlineColor = new Dom.RGBA // { // R = 255, // G = 255, // B = 0, // A = 1 // }, //}); //await context.Session.DOM.HighlightNode(new Dom.HighlightNodeCommand //{ // NodeId = targetNodeId.NodeId, // HighlightConfig = new Dom.HighlightConfig // { // ContentColor = new Dom.RGBA // { // R = 255, // G = 0, // B = 0, // A = 0.7 // } // } //}); //if (targetNodeId.NodeId != nodeId) // throw new InvalidOperationException("A hole was torn in the universe."); await worker.Session.Input.DispatchMouseEvent(new Input.DispatchMouseEventCommand { Button = "left", Type = "mousePressed", ClickCount = 1, Modifiers = 0, X = (long)target.X, Y = (long)target.Y, Timestamp = DateTimeOffset.Now.ToUniversalTime().ToUnixTimeSeconds() }, cancellationToken : worker.CancellationToken); await worker.Session.Input.DispatchMouseEvent(new Input.DispatchMouseEventCommand { Button = "left", Type = "mouseReleased", ClickCount = 1, Modifiers = 0, X = (long)target.X, Y = (long)target.Y, Timestamp = DateTimeOffset.Now.ToUniversalTime().ToUnixTimeSeconds() }, cancellationToken : worker.CancellationToken); if (IsNavigation) { await worker.DevTools.WaitForNextNavigation(cancellationToken : worker.CancellationToken); } }