예제 #1
0
        private void MainForm_Load(object sender, EventArgs e)
        {
            Guid?  startingPageGUID = null;
            string startingUrl      = null;

            if (Arguments.Length > 4)
            {
                Guid tmp;
                if (Guid.TryParse(Arguments[0], out tmp))
                {
                    ServerGUID = tmp;
                }
                if (Guid.TryParse(Arguments[1], out tmp))
                {
                    ProcessGUID = tmp;
                }
                if (Guid.TryParse(Arguments[2], out tmp))
                {
                    startingPageGUID = tmp;
                }
                BaseUrl     = Arguments[3];
                startingUrl = Arguments[4];
            }

            if (ServerGUID == null || ProcessGUID == null || startingPageGUID == null || BaseUrl == null || startingUrl == null)
            {
                MessageBox.Show("Invalid arguments");
                Close();
                return;
            }

            refreshTimer.Enabled = true;

            //Send back process id related to guid
            PlayerCommunicationHelper.SendSyncSession(ServerGUID.Value, ProcessGUID.Value, Process.GetCurrentProcess().Id);

            this.Text = $"Session: {ProcessGUID.Value} Page: {0}";

            //MessageBox.Show($"Starting session-server {ProcessGUID.Value}");
            Server = new PlayerCommunicationServer(ProcessGUID.Value);
            Server.ServiceInstance.OnBrowserJob += ServiceInstanse_OnBrowserJob;

            PerformURLRequest(startingPageGUID.Value, BaseUrl.TrimEnd('/') + '/' + startingUrl.TrimStart('/'), RequestMethod.GET);

            RefreshUI();
        }
예제 #2
0
        private void Browser_OnJobCompleted(BrowserForm browser, Guid?logElementGUID, JobStatus jobStatus)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate
                {
                    textBox1.AppendText(logElementGUID.ToString() + Environment.NewLine);
                }));
            }
            else
            {
                textBox1.AppendText(logElementGUID.ToString() + Environment.NewLine);
            }

            //MessageBox.Show("Send BrowserJobComplete to player");
            //MessageBox.Show($"jobcomplete: logElementGUID={logElementGUID}");
            PlayerCommunicationHelper.SetLogElementAsDone(ServerGUID.Value, null, browser.PageGUID, logElementGUID, jobStatus); //, async: false);

//            NamedPipeHelper.SendBrowserJobComplete(ServerGUID.Value, new NamedPipeBrowserJob() { PageGUID = browser.PageGUID, LogElementGUID = logElementGUID });
        }
예제 #3
0
 private LogElementDTO Browser_OnHandlerJobCompleted(BrowserForm browser, LogType logType, string handlerUrl, JobStatus jobStatus)
 {
     return(PlayerCommunicationHelper.SetHandlerLogElementAsDone(ServerGUID.Value, browser.PageGUID, logType, handlerUrl, jobStatus)); //, async: false);
 }
예제 #4
0
        private PlayElementResponse EventsTable1_OnPlayElement(LogElementDTO logElement, bool ableToWaitForExecution)
        {
            var session = Sessions.FirstOrDefault(x => x.ProcessGUID.Equals(logElement.SessionGUID));

            if (session == null) //TODO Check if the logElement is both the first one of a bundle... and able to spawn a new session/browser
            {
                var baseUrl = txtBaseUrl.Text.TrimEnd('/');
                var url     = logElement.Element.TrimStart('/');
                url = LoggingHelper.SolutionLoggingPlayer?.FinalizeUrl(LogElementHistory, baseUrl + '/' + url);
                url = url.Substring(baseUrl.Length);

                SpawnSession(logElement.SessionGUID, logElement.PageGUID, baseUrl, url);

                return(PlayElementResponse.InProgress);
            }
            else
            {
                if (LogTypeHelper.IsClientsideUserEvent(logElement.LogType))
                {
                    PlayerCommunicationHelper.SendBrowserJob_ASYNC(session, logElement);
                    return(PlayElementResponse.InProgress);
                }
                else
                {
                    if (logElement.LogType == LogType.OnPageRequest) // || logElement.LogType == LogType.OnHandlerRequestReceived)
                    {
                        if (ableToWaitForExecution)
                        {
                            return(PlayElementResponse.WaitingToBeExecuted);
                        }

                        var baseUrl = txtBaseUrl.Text.TrimEnd('/');
                        var url     = logElement.Element.TrimStart('/');
                        url = LoggingHelper.SolutionLoggingPlayer?.FinalizeUrl(LogElementHistory, baseUrl + '/' + url);
                        url = url.Substring(baseUrl.Length);
                        logElement.Element = url;

                        PlayerCommunicationHelper.SendBrowserJob_ASYNC(session, logElement);
                        return(PlayElementResponse.InProgress);
                        //RequestMethods:
                        //GET:   Open new tab/window, unless logElement.PageGUID are found within the current LogSession
                        //OTHER:
                        //  Refresh: location.reload(true)
                        //  History: pt ignoreres denne sektion, selvom det er forkert... ved ikke helt præcist hvordan dette skal ordnes

                        //refresh and history-change should result in an existing pageGUID, but that pageGUID/browserWindow might in fact have been closed for some time at this point :(



                        //var value = LoggingPage.DeserializeRequestValue(logElement);
                        //var requestMethod = value.ServerVariables["REQUEST_METHOD"].ToUpper();
                        //if (requestMethod == "POST") //Cannot rely on requestMethod to be able to determine if it can be ignored from being executed by LogPlayer, because refresh/F5 is able to reproduce any requestMethod
                        //{
                        //    //Ignore event
                        //}
                    }
                    else
                    {
                        return(PlayElementResponse.Ignored);
                    }

                    //Ignore serverside.. they are handled by the webserver.... eh, this means we do no accept new pagerequests, we should only ignore postback events
                    //Typer pagerequests:

                    //Manuel url, tryk på anchor eller redirect via js-kode: !postback (burde jeg håndtere.. og checke om en af de allerede åbne browser sub-vinduer ikke længere har events, for ellers overtag en af disse)
                    //ved html-event (f.eks. click) vil denne aktion blive udført automatisk, så hvordan undersøger jeg om et pagerequest sker af sig selv eller det er nået jeg skal ordne?
                    //Skal jeg undersøge det via tid??
                    //ved form-submit får jeg et form-submit-event (nej, form-submit-eventet er på nuværende tidspunkt undladt i loggen, da det sker automatisk som en del af et flow udfra et klik..
                    //                                              men jeg kunne selvfølgelig logge at det er sket og hvis ikke, så er det jo noget logplayeren skal udføre? præcis samme problem... suk)

                    //Så fremgangsmåden er måske at udvidde loggningen ikke med henblik på at afspille det igen direkte, men lade automatikken ordne det inden for rimelig tid.. dvs opsætning af logging skal også ske for LogPlayeren)
                    //  Er det opsat i dag i Play-mode?
                    //    Nu er jeg pludselig i tvivl om det er vigtigt eller ej, da f.eks. form-submit jo kun ............ om igen

                    ///////////////////////////////

                    //Manuel url, tryk på anchor eller redirect via js-kode: !postback (burde jeg håndtere.. og checke om en af de allerede åbne browser sub-vinduer ikke længere har events, for ellers overtag en af disse)
                    //unload event (burde det også blive logget til information om siden er relevant?) Den får jeg jo både ved postback og url-redirect
                    //

                    //form-post via knap eller js-kode: postback

                    /////////////////////////////////////////////////

                    // Jeg får et page-request event her.. skal vide om jeg skal åbne nyt browser-vindue, overtage et eksisterende eller intet gøre da det er et form-post event, form-post event vil ALTID være i samme vindue.
                    // REQUEST_METHOD er placeret i logElement.Value for pagerequest objektet.. "GET", "PUT", "POST", "PATCH", "DELETE"  (http://www.restapitutorial.com/lessons/httpmethods.html)
                    // Burde jo være i første event, da vi har fingrene i OnPageSessionBefore med ret stor sikkerhed.. så det burde måske være det første event?
                    //   OnPageRequest kommer nu før OnPageSession, giver mest mening.
                }

                //TODO Spawn this a spawn session/browser event occurs more than once?!
                //MessageBox.Show("Error: Session is already open?");
            }
        }