//public bool Connected { get; set; } = false;
        public override async Task Connect()
        {
            var sessions = await GetSessions(Port).ConfigureAwait(false);

            var endpointUrl = sessions.FirstOrDefault(s => s.Type == "page")?.WebSocketDebuggerUrl;

            if (endpointUrl == null)
            {
                throw new Exception("Cannot get page session from Chrome");
            }
            //var dir = wsProxyConfig.DevToolsFilesDir ?? Directory.GetCurrentDirectory();
            //await LoadDevToolsFiles(dir);
            if (_wsProxyConfig?.DoProxyHttpTraffic == true)
            {
                if (_wsProxyConfig.DevToolsFilesDir == null)
                {
                    _wsProxyConfig.DevToolsFilesDir = Directory.GetCurrentDirectory();
                }
                _wsProxyConfig.ChromePort = Port;
                _httpServer = new HttpServer(_wsProxyConfig); // dir, wsProxyConfig.HTTPServerPort, Port);
            }

            _proxyEndpointUrl = await OpenProxyWS(endpointUrl).ConfigureAwait(false);

            Session = new ChromeSession(_proxyEndpointUrl);
        }
Пример #2
0
        public async Task EnsureCaptureScreenshotHasData()
        {
            var s        = new SemaphoreSlim(0, 1);
            var fileName = $".\\{m_testContext.TestName}.png";

            using (var session = new ChromeSession(m_currentChromeSessionInfo.WebSocketDebuggerUrl))
            {
                await session.Page.Enable();

                session.Page.SubscribeToLoadEventFiredEvent(async(e) =>
                {
                    var screenshot = await session.Page.CaptureScreenshot(new Page.CaptureScreenshotCommand());
                    if (!string.IsNullOrWhiteSpace(screenshot.Data))
                    {
                        File.WriteAllBytes(fileName, Convert.FromBase64String(screenshot.Data));
                        m_testContext.WriteLine($"saved to {fileName}");
                        s.Release();
                    }
                });

                var navigateResult = await session.Page.Navigate(new Page.NavigateCommand
                {
                    Url = "https://www.google.com"
                });

                await s.WaitAsync();

                Assert.IsTrue(File.Exists(fileName));
            }
        }
Пример #3
0
        /// <summary>
        /// Connects to the specified chrome session.
        /// </summary>
        /// <param name="serviceProvider"></param>
        /// <param name="sessionInfo"></param>
        /// <returns></returns>
        public static async Task <SkraprDevTools> Connect(IServiceProvider serviceProvider, ChromeSessionInfo sessionInfo)
        {
            if (serviceProvider == null)
            {
                throw new ArgumentNullException(nameof(serviceProvider));
            }

            if (sessionInfo == null)
            {
                throw new ArgumentNullException(nameof(sessionInfo));
            }

            var chromeSessionLogger = serviceProvider
                                      .GetService <ILoggerFactory>()
                                      .CreateLogger <ChromeSession>();

            var devToolsLogger = serviceProvider
                                 .GetService <ILoggerFactory>()
                                 .CreateLogger <SkraprDevTools>();

            //Create a new session using the information in the session info.
            var session  = new ChromeSession(chromeSessionLogger, sessionInfo.WebSocketDebuggerUrl);
            var devTools = new SkraprDevTools(devToolsLogger, session, sessionInfo.Id);
            await devTools.Initialize();

            return(devTools);
        }
Пример #4
0
        private static ChromeSession CreateChromeSession(string sessionInfoUrl, List <string> titleClues, out List <ChromeSessionInfo> otherWsUrls)
        {
            otherWsUrls = null;
            var qnSessions = GetWebSocketSessionInfos(sessionInfoUrl);

            otherWsUrls = qnSessions.Where(k => !string.IsNullOrEmpty(k.WebSocketDebuggerUrl)).ToList();
            ChromeSessionInfo webSocketSessionInfo = null;

            foreach (var title in titleClues)
            {
                webSocketSessionInfo = otherWsUrls.FirstOrDefault(k => k.Title == title);
                if (webSocketSessionInfo != null)
                {
                    otherWsUrls.Remove(webSocketSessionInfo);
                    break;
                }
            }
            ChromeSession chromeSession = null;

            if (webSocketSessionInfo != null)
            {
                chromeSession = new ChromeSessionFactory().Create(webSocketSessionInfo.WebSocketDebuggerUrl, webSocketSessionInfo.Title);
            }
            return(chromeSession);
        }
Пример #5
0
 public ChromeOperator(string sessionInfoUrl, HashSet <string> titles, bool isChatRecord)
 {
     this.hadevalinsertjs = false;
     this.Id = RandomEx.Rand.Next();
     this._isEnableChromeConsoleListening   = false;
     this._isEnableChromeInspectorListening = false;
     this.Session = CreateChromeSession(sessionInfoUrl, titles, isChatRecord);
 }
Пример #6
0
 private ChromeOperator(ChromeSession session)
 {
     this.hadevalinsertjs = false;
     this.Id = RandomEx.Rand.Next();
     this._isEnableChromeConsoleListening   = false;
     this._isEnableChromeInspectorListening = false;
     this.Session = session;
 }
Пример #7
0
        public virtual async Task Connect()
        {
            var sessions = await GetSessions(Port).ConfigureAwait(false);

            var endpointUrl = sessions.FirstOrDefault(s => s.Type == "page")?.WebSocketDebuggerUrl;

            Session = new ChromeSession(endpointUrl);
        }
Пример #8
0
        //Launch Chrome With
        //"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9223

        static async Task Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var sessions = await GetSessions("http://localhost:9223/");

            using (var session = new ChromeSession(sessions.First(s => s.Type == "page").WebSocketDebuggerUrl))
            {
                //Get the frame resource tree
                var resource = await session.Page.GetResourceTree(new Page.GetResourceTreeCommand());

                //Navigate to winamp.com
                var navigateResult = await session.Page.Navigate(new Page.NavigateCommand
                {
                    Url = "http://www.amazon.com"
                });

                long executionContextId = -1;
                var  s = new SemaphoreSlim(0, 1);

                //Subscribe to the eval command and determine the execution context id to use which
                //correlates to the page we navigated to.
                session.Runtime.SubscribeToExecutionContextCreatedEvent((e) =>
                {
                    var auxData = e.Context.AuxData as JObject;
                    var frameId = auxData["frameId"].Value <string>();

                    if (e.Context.Origin == "https://www.amazon.com" && frameId == navigateResult.FrameId)
                    {
                        executionContextId = e.Context.Id;
                        s.Release();
                    }
                });

                //Enable the runtime so that execution context events are raised.
                var result1 = await session.Runtime.Enable(new Runtime.EnableCommand());

                await s.WaitAsync();

                //Evaluate a complex answer.
                var result2 = await session.Runtime.Evaluate(new Runtime.EvaluateCommand
                {
                    ContextId   = executionContextId,
                    ObjectGroup = "test123",
                    Expression  = "6*7"
                });

                Console.WriteLine(result2.Result.Description);

                // New in Chrome 69, get a DOM snapshot.
                var result3 = await session.DOMSnapshot.CaptureSnapshot(new BaristaLabs.ChromeDevTools.Runtime.DOMSnapshot.CaptureSnapshotCommand()
                {
                    ComputedStyles = new string[0]
                });
            }
        }
Пример #9
0
Файл: Form1.cs Проект: zsea/QnPg
        private void cmbQnAccount_SelectedIndexChanged(object sender, EventArgs e)
        {
            var selectedItem   = cmbQnAccount.Items[cmbQnAccount.SelectedIndex].ToString();
            var qnHwnd         = QnAccounts.First(k => k.Key == selectedItem).Value;
            var sessionInfoUrl = GetSessionInfoUrl(qnHwnd);

            if (!ChromeSessions.ContainsKey(selectedItem))
            {
                ChromeSessions[selectedItem] = CreateChromeSession(sessionInfoUrl, ChatlogChromeTitles);
            }
            CurrentChromeSession = ChromeSessions[selectedItem];
        }
Пример #10
0
        public ChromeSession Create(string endpointUrl, string title)
        {
            // Sometimes binding to localhost might resolve wrong AddressFamily, force IPv4
            endpointUrl = endpointUrl.Replace("ws://localhost", "ws://127.0.0.1");
            var methodTypeMap   = new MethodTypeMap();
            var commandFactory  = new CommandFactory();
            var responseFactory = new CommandResponseFactory(methodTypeMap, commandFactory);
            var eventFactory    = new EventFactory(methodTypeMap);
            var session         = new ChromeSession(endpointUrl, commandFactory, responseFactory, eventFactory, title);

            return(session);
        }
Пример #11
0
        public async Task <string> NavigateToPageInNewSession(ChromeSessionInfo sessionInfo, string address)
        {
            TestContext.WriteLine($"ThreadId: {Thread.CurrentThread.ManagedThreadId}");

            var    s         = new SemaphoreSlim(0, 1);
            string body      = null;
            string requestId = null;

            using (var session = new ChromeSession(sessionInfo.WebSocketDebuggerUrl))
            {
                await session.Page.Enable();

                await session.Network.Enable(new Network.EnableCommand()
                {
                });

                session.Network.SubscribeToResponseReceivedEvent((e2) =>
                {
                    if (e2.Response.Url != address)
                    {
                        return;
                    }

                    requestId = e2.RequestId;
                });

                session.Page.SubscribeToLoadEventFiredEvent(async(e) =>
                {
                    if (String.IsNullOrWhiteSpace(requestId))
                    {
                        throw new InvalidOperationException("RequestId not set");
                    }

                    var response = await session.Network.GetResponseBody(new Network.GetResponseBodyCommand()
                    {
                        RequestId = requestId
                    });

                    body = response.Body;
                    s.Release();
                });

                var navigateResult = await session.Page.Navigate(new Page.NavigateCommand
                {
                    Url = address
                });

                await s.WaitAsync();

                return(body);
            }
        }
Пример #12
0
        /// <summary>Opens a session to the chromium instance hosting MediaMonkey.</summary>
        public async Task OpenSessionAsync()
        {
            using (var webClient = new HttpClient())
            {
                webClient.BaseAddress = new Uri(RemoteDebuggingUri);
                string remoteSessions = await webClient.GetStringAsync("/json").ConfigureAwait(false);

                var webSockets = JsonConvert.DeserializeObject <ICollection <ChromeSessionInfo> >(remoteSessions);
                EndpointAddress          = (webSockets.First(s => s.Url == mmWebsocketUrl)).WebSocketDebuggerUrl.Replace("ws://localhost", "ws://127.0.0.1");
                mmSession                = new ChromeSession(EndpointAddress);
                mmSession.CommandTimeout = mmSessionTimeout;
            }
        }
Пример #13
0
        public static async Task<bool> hiveWaitUntilValueEquals<T>(this ChromeSession s, string key, T value, int timeout = 1000) where T : struct
        {
            return await asyncSpinlock.WaitUntil(async () =>
            {
                try
                {
                    return value.Equals(await s.EvalValue<T>(string.Format(hiveGetString, key)));
                }
                catch (Exception)
                {
                    return false;
                }
            }, timeout);

        }
Пример #14
0
        public NavigatorWatcher(ChromeSession session)
        {
            Session = session ?? throw new ArgumentNullException(nameof(session));

            session.Page.SubscribeToLoadEventFiredEvent((e) =>
            {
                if (m_loadSemaphore != null)
                {
                    lock (m_syncRoot)
                    {
                        if (m_loadSemaphore != null)
                        {
                            m_loadSemaphore.Release();
                        }
                    }
                }
            });

            session.Page.SubscribeToDomContentEventFiredEvent((e) =>
            {
                if (m_domContentLoadedSemaphore != null)
                {
                    lock (m_syncRoot)
                    {
                        if (m_domContentLoadedSemaphore != null)
                        {
                            m_domContentLoadedSemaphore.Release();
                        }
                    }
                }
            });

            session.Network.SubscribeToRequestWillBeSentEvent((e) =>
            {
                m_networkActivityCount++;
            });

            session.Network.SubscribeToResponseReceivedEvent((e) =>
            {
                m_networkActivityCount++;
            });

            session.Network.SubscribeToDataReceivedEvent((e) =>
            {
                m_networkActivityCount++;
            });
        }
Пример #15
0
        private bool disposedValue = false; // To detect redundant calls

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                //if (disposing)
                //{
                //    // dispose managed state (managed objects).
                //}

                if (mmSession != null)
                {
                    mmSession.Dispose();
                    mmSession = null;
                }
                disposedValue = true;
            }
        }
        public async Task AssertWSErrorExceptionCanBeCaught()
        {
            bool exceptionThrown = false;

            //Create a new chrome instance
            var chrome      = Chrome.OpenChrome(9226);
            var sessionInfo = await chrome.CreateNewSession();

            ChromeSession session = null;

            try
            {
                session = new ChromeSession(sessionInfo.WebSocketDebuggerUrl);
                await session.Page.Navigate(new Page.NavigateCommand {
                    Url = "https://www.google.com"
                });

                //Dispose of the chrome process, thus killing it.
                chrome.Dispose();

                //Wait a bit to ensure that the chrome process has been terminated.
                Thread.Sleep(2000);

                //Try another navigation -- this will raise the socket exception
                await session.Page.Navigate(new Page.NavigateCommand
                {
                    Url = "https://www.winamp.com"
                });
            }
            catch (System.Net.Sockets.SocketException)
            {
                exceptionThrown = true;
            }
            finally
            {
                //Ensure the session is disposed
                if (session != null)
                {
                    session.Dispose();
                }
            }

            Assert.IsTrue(exceptionThrown);
        }
Пример #17
0
        public SkraprWorker(ILogger logger, SkraprDefinition definition, ChromeSession session, SkraprDevTools devTools, bool isDebugEnabled = false)
        {
            m_logger = logger ?? throw new ArgumentNullException(nameof(logger));
            m_logger = logger;
            m_cts    = new CancellationTokenSource();

            m_mainFlow = new ActionBlock <ISkraprTask>(ProcessMainSkraprTask, new ExecutionDataflowBlockOptions
            {
                CancellationToken      = m_cts.Token,
                EnsureOrdered          = true,
                MaxDegreeOfParallelism = 1
            });

            m_devTools   = devTools ?? throw new ArgumentNullException(nameof(devTools));
            m_session    = session;
            m_definition = definition;

            m_isDebugEnabled = isDebugEnabled;
        }
Пример #18
0
        static void Main(string[] args)
        {
            //Launch Chrome With

            //"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9223

            Console.WriteLine("Hello World!");

            var sessions = GetSessions("http://localhost:9223/").GetAwaiter().GetResult();

            using (var session = new ChromeSession(sessions.First(s => s.Type == "page").WebSocketDebuggerUrl))
            {
                try
                {
                    //session.Page.SubscribeToLoadEventFiredEvent((e) =>
                    session.Page.SubscribeToDomContentEventFiredEvent((e) =>
                    {
                        Console.WriteLine("Page loaded");
                        ////NOT WORKS
                        //var screenshot = session.Page.CaptureScreenshot(new Page.CaptureScreenshotCommand(), new System.Threading.CancellationToken(), 5000).GetAwaiter().GetResult();
                        //SaveScreenshot(screenshot.Data);

                        // WORKS
                        Task.Run(() =>
                        {
                            var screenshot = session.Page.CaptureScreenshot(new Page.CaptureScreenshotCommand(), new System.Threading.CancellationToken(), 5000).GetAwaiter().GetResult();
                            SaveScreenshot(screenshot.Data);
                        });
                    });
                    session.Page.Enable(new Page.EnableCommand()).GetAwaiter().GetResult();
                    var navigateResult = session.Page.Navigate(new Page.NavigateCommand
                    {
                        Url = "https://www.google.com/"
                    }).GetAwaiter().GetResult();
                    Console.ReadLine();
                    session.Page.Disable(new Page.DisableCommand()).GetAwaiter().GetResult();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
        }
Пример #19
0
        public static async Task<dynamic> hiveWaitUntilGet(this ChromeSession s, string key, int timeout) {

            dynamic result = null;
            if (await asyncSpinlock.WaitUntil(async () =>
            {
                try
                {

                    result = await s.EvalObject(string.Format(hiveGetString, key));
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }, timeout))
            {
                return result;
            }
            throw new TimeoutException("The desired response was not ready.");
        }
Пример #20
0
        public static async Task<T> hiveWaitUntilGetValue<T>(this ChromeSession s, string key, int timeout = 1000) where T : struct
        {
            T result = default(T);
            if (await asyncSpinlock.WaitUntil(async () =>
             {
                 try
                 {

                     result = await s.EvalValue<T>(string.Format(hiveGetString, key));
                     return true;
                 }
                 catch (Exception)
                 {
                     return false;
                 }
             },timeout))
            {
                return result;
            }
            throw new TimeoutException("The desired response was not ready.");

        }
Пример #21
0
 public DatabaseAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
Пример #22
0
 public BackgroundServiceAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
Пример #23
0
 public HeapProfilerAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
 public TetheringAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
 public DOMSnapshotAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
 public CacheStorageAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
Пример #27
0
 public virtual void Disconnect()
 {
     Session?.Dispose();
     Session = null;
 }
Пример #28
0
 /// <summary>
 /// Creates a new instance of the SkraprDevTools using the provided sesion.
 /// </summary>
 /// <param name="session"></param>
 private SkraprDevTools(ILogger logger, ChromeSession session, string targetId)
 {
     m_logger   = logger ?? throw new ArgumentNullException(nameof(logger));
     m_session  = session ?? throw new ArgumentNullException(nameof(session));
     m_targetId = targetId;
 }
 public WebAudioAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }
Пример #30
0
 public IndexedDBAdapter(ChromeSession session)
 {
     m_session = session ?? throw new ArgumentNullException(nameof(session));
 }