Skip to content
Snippets Groups Projects
Program.cs 3.63 KiB
Newer Older
  • Learn to ignore specific revisions
  • using AutoWebPerf.Chrome;
    using AutoWebPerf.Chrome.Messages;
    using AutoWebPerf.Chrome.Messages.Network;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using WebSocket4Net;
    
    namespace AutoWebPerf
    {
        class Program
        {
            static void Main(string[] args)
            {
                IChromeProxy _chromeProxy = null;
                ChromeProcessInfo chromeProcessInfo = null;
    
                try
                {
                    chromeProcessInfo = StartChrome();
    
                    var c = new ChromeWrapper("http://localhost:" + ChromeRemoteDebuggingPort);
                    var sessions = c.GetAvailableSessions();
                    foreach (var s in sessions)
                        Console.WriteLine(s.url);
    
                    if (sessions.Count == 0)
                        throw new Exception("All debugging sessions are taken.");
                    
    
    
                    // Will drive first tab session
                    var sessionWSEndpoint = sessions.Last().webSocketDebuggerUrl;   // new tab window
                    c.SetActiveSession(sessionWSEndpoint);
                    c.NavigateTo("http://www.google.com");
                    
                    
                    var requestFactory = new RequestFactory();
                    _chromeProxy = new ChromeProxy(sessionWSEndpoint, new ResponseFactory(requestFactory));
                    _chromeProxy.Init().Wait();
                    var result = _chromeProxy.PublishAsync(requestFactory.CreateNetworkEnableRequest()).Result;
                    _chromeProxy.Subscribe<RequestWillBeSentResponse>((o, e) =>
                            {
                                Console.WriteLine("We got it!");
                            });
                    _chromeProxy.PublishAsync(requestFactory.CreateNavigateRequest("http://www.google.com")).Wait();
                    
    
                    Console.ReadLine();
                }
                finally
                {
                    if(null != _chromeProxy)
                    {
                        _chromeProxy.Dispose();
                    }
                    KillChrome(chromeProcessInfo);
                }
    
            }
    
            private static void KillChrome(ChromeProcessInfo chromeProcessInfo)
            {
                try
                {
                    chromeProcessInfo.ChromeProcess.Kill();
                } catch
                {
                    // right now, the process has been killed ... so i'm swallowing this during setup/testing
                }
                try
                {
                    chromeProcessInfo.ChromeUserDirectory.Delete(true);
                } catch
                {
                    Thread.Sleep(500);
                    chromeProcessInfo.ChromeUserDirectory.Delete(true);
                }
            }
    
            private static ChromeProcessInfo StartChrome()
            {
                string path = Path.GetRandomFileName();
                var directoryInfo = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), path));
                var remoteDebuggingArg = "--remote-debugging-port=" + ChromeRemoteDebuggingPort;
                var userDirectoryArg = "--user-data-dir=\"" + directoryInfo.FullName + "\"";
                var chromeProcessArgs = remoteDebuggingArg + " " + userDirectoryArg + " --bwsi --no-first-run";
                var processStartInfo = new ProcessStartInfo(@"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe", chromeProcessArgs);
                var chromeProcess = Process.Start(processStartInfo);
                return new ChromeProcessInfo
                {
                    ChromeProcess = chromeProcess,
                    ChromeUserDirectory = directoryInfo
                };
            }
    
            public const int ChromeRemoteDebuggingPort = 9222;
        }
    }