diff --git a/source/ChromeDevTools/LocalChromeProcess.cs b/source/ChromeDevTools/LocalChromeProcess.cs index c0756368a9bbdfcf96208eeaa224f2f00bf4b3a7..7e04ce44d66e5aa0593e961aecfa76fbda4c1c6e 100644 --- a/source/ChromeDevTools/LocalChromeProcess.cs +++ b/source/ChromeDevTools/LocalChromeProcess.cs @@ -20,6 +20,8 @@ namespace MasterDevs.ChromeDevTools base.Dispose(); Process.Kill(); + Process.WaitForExit(); + Process.Close(); DisposeUserDirectory(); } } diff --git a/source/Sample/Program.cs b/source/Sample/Program.cs index ae7011a94ad25b36ebb8f8d3cb7c63cf611ba4c1..9c8cf0c5c8a1bfc3607c9f1fdffc2400cd05b768 100644 --- a/source/Sample/Program.cs +++ b/source/Sample/Program.cs @@ -1,16 +1,25 @@ using MasterDevs.ChromeDevTools.Protocol.Chrome.Page; using System; +using System.IO; using System.Linq; +using System.Threading; +using MasterDevs.ChromeDevTools.Protocol.Chrome.DOM; +using MasterDevs.ChromeDevTools.Protocol.Chrome.Emulation; using Task = System.Threading.Tasks.Task; namespace MasterDevs.ChromeDevTools.Sample { internal class Program { + const int ViewPortWidth = 1440; + const int ViewPortHeight = 900; private static void Main(string[] args) { Task.Run(async () => { + // synchronization + var screenshotDone = new ManualResetEventSlim(); + // STEP 1 - Run Chrome var chromeProcessFactory = new ChromeProcessFactory(new StubbornDirectoryCleaner()); using (var chromeProcess = chromeProcessFactory.Create(9222)) @@ -22,31 +31,68 @@ namespace MasterDevs.ChromeDevTools.Sample // STEP 3 - Send a command // - // Here we are sending a command to tell chrome to navigate to - // the specified URL - var navigateResponse = chromeSession.SendAsync(new NavigateCommand + // Here we are sending a commands to tell chrome to set the viewport size + // and navigate to the specified URL + await chromeSession.SendAsync(new SetVisibleSizeCommand + { + Width = ViewPortWidth, + Height = ViewPortHeight + }); + + var navigateResponse = await chromeSession.SendAsync(new NavigateCommand { Url = "http://www.google.com" - }) - .Result; + }); Console.WriteLine("NavigateResponse: " + navigateResponse.Id); // STEP 4 - Register for events (in this case, "Page" domain events) - // send an event to tell chrome to send us all Page events + // send an command to tell chrome to send us all Page events // but we only subscribe to certain events in this session - var pageEnableResult = chromeSession.SendAsync<ChromeDevTools.Protocol.Chrome.Page.EnableCommand>().Result; + var pageEnableResult = await chromeSession.SendAsync<Protocol.Chrome.Page.EnableCommand>(); Console.WriteLine("PageEnable: " + pageEnableResult.Id); - chromeSession.Subscribe<Protocol.Chrome.Page.DomContentEventFiredEvent>(domContentEvent => - { - Console.WriteLine("DomContentEvent: " + domContentEvent.Timestamp); - }); - // you might never see this, but that's what an event is ... right? - chromeSession.Subscribe<Protocol.Chrome.Page.FrameStartedLoadingEvent>(frameStartedLoadingEvent => + + chromeSession.Subscribe<LoadEventFiredEvent>(loadEventFired => { - Console.WriteLine("FrameStartedLoading: " + frameStartedLoadingEvent.FrameId); + // we cannot block in event handler, hence the task + Task.Run(async () => + { + Console.WriteLine("LoadEventFiredEvent: " + loadEventFired.Timestamp); + + var documentNodeId = + ((CommandResponse<GetDocumentCommandResponse>) + await chromeSession.SendAsync(new GetDocumentCommand())).Result.Root.NodeId; + var bodyNodeId = + ((CommandResponse<QuerySelectorCommandResponse>) + await chromeSession.SendAsync(new QuerySelectorCommand + { + NodeId = documentNodeId, + Selector = "body" + })).Result.NodeId; + var height = + ((CommandResponse<GetBoxModelCommandResponse>) + await chromeSession.SendAsync(new GetBoxModelCommand {NodeId = bodyNodeId})).Result + .Model.Height; + + await chromeSession.SendAsync(new SetVisibleSizeCommand {Width = ViewPortWidth, Height = height}); + + Console.WriteLine("Taking screenshot"); + var screenshot = + (CommandResponse<CaptureScreenshotCommandResponse>) + await chromeSession.SendAsync(new CaptureScreenshotCommand {Format = "png"}); + + var data = Convert.FromBase64String(screenshot.Result.Data); + File.WriteAllBytes("output.png", data); + Console.WriteLine("Screenshot stored"); + + // tell the main thread we are done + screenshotDone.Set(); + }); }); - Console.ReadLine(); + // wait for screenshoting thread to (start and) finish + screenshotDone.Wait(); + + Console.WriteLine("Exiting .."); } }).Wait(); }