Esempio n. 1
0
        private TransferElementResponse ServiceInstanse_OnBrowserJobComplete(TransferElementBrowserJob namedPipeBrowserJob) //For clientside-events
        {
            //MessageBox.Show($"Received BrowserJobComplete {(namedPipeBrowserJob.LogElementGUID != null ? namedPipeBrowserJob.LogElementGUID.Value.ToString() : "null")}");
            Guid?         logElementGUID = namedPipeBrowserJob.LogElementGUID;
            LogElementDTO logElementDTO  = null;

            if (logElementGUID == null && !String.IsNullOrWhiteSpace(namedPipeBrowserJob.HandlerUrl) && namedPipeBrowserJob.LogType.HasValue)
            {
                logElementDTO  = eventsTable1.FetchLogElement(namedPipeBrowserJob.SessionGUID, namedPipeBrowserJob.PageGUID, namedPipeBrowserJob.LogType.Value, namedPipeBrowserJob.HandlerUrl).LogElementDTO;
                logElementGUID = logElementDTO?.GUID;
                if (logElementGUID == null)
                {
                    return new TransferElementResponse()
                           {
                               Success = false, Message = $"LogElement could not be located ({namedPipeBrowserJob.LogType.Value} : {namedPipeBrowserJob.HandlerUrl})"
                           }
                }
                ;
            }

            if (logElementGUID != null) //BrowserJobComplete with LogElementGUID = null means that browser has been spawned with new url
            {
                var newEvent = eventsTable1.SetSessionElementAsDone(logElementGUID.Value);
                //MessageBox.Show($"ServiceInstanse_OnBrowserJobComplete2: {namedPipeBrowserJob.LogElementGUID.Value} : {newEvent}");
                if (newEvent == EventsTable.NewEvent.None)
                {
                }
            }

            return(new TransferElementResponse()
            {
                Success = true, Data = logElementDTO
            });
        }
Esempio n. 2
0
 private TransferElementResponse ServiceInstance_OnLogElementHistory(LogElementDTO previousLogElement, LogElementDTO nextLogElement, AdditionalData additionalData)
 {
     LogElementHistory.Add(new Tuple <LogElementDTO, LogElementDTO, AdditionalData>(previousLogElement, nextLogElement, additionalData));
     return(new TransferElementResponse()
     {
         Success = true, Data = null
     });
 }
        private void WaitForSessionElementToBeCalledAutomatically(LogElementDTO logElementDTO)
        {
            Thread.Sleep(5000);
            var sessionElement = GetPlayingSessionElement(logElementDTO.GUID);

            if (sessionElement != null && sessionElement.State == SessionElementState.WaitingToTestIfCalledAutomatically)
            {
                if (InvokeRequired)
                {
                    Invoke(new MethodInvoker(delegate
                    {
                        OnPlayElement?.Invoke(logElementDTO, ableToWaitForExecution: false);
                    }));
                }
            }
        }
Esempio n. 4
0
        public void PerformLogElement(LogElementDTO logElement)
        {
            //function playEventFor(elementPath, logElement /*json*/) {

            var jsonLogElement = SerializationHelper.Serialize(logElement, SerializationType.Json);

            WaitTillDocumentIsComplete(delegate
            {
                //WaitTillWebBrowserIsNoLongerInUse($"javascript:logRecorderAndPlayer.pushLogElementGUID(\"{logElementGUID}\");window.scrollTo({browserScroll.left}, {browserScroll.top});window.external.SetLogElementAsDone(\"{logElementGUID}\");");
                WaitTillWebBrowserIsNoLongerInUse(webBrowser =>
                {
                    webBrowser.Document.InvokeScript("eval", new object[] { $"logRecorderAndPlayer.playLogElement({jsonLogElement})" });
                    return(true);
                });
            });
        }
Esempio n. 5
0
        private TransferElementResponse ServiceInstance_OnLogElementDifference(LogElementDTO previousLogElement, LogElementDTO nextLogElement)
        {
            if (previousLogElement.LogType != nextLogElement.LogType)
            {
                return new TransferElementResponse()
                       {
                           Success = false, Message = "LogTypes must be equal"
                       }
            }
            ;

            this.TopMost = true;
            try
            {
                switch (previousLogElement.LogType)
                {
                case LogType.OnWCFServiceRequest:
                {
                    var text          = "Difference found in service request, should we use the logged data?" + Environment.NewLine + Environment.NewLine + "Logged:" + Environment.NewLine + previousLogElement.Value + Environment.NewLine + Environment.NewLine + "New:" + Environment.NewLine + nextLogElement.Value;
                    var useLoggedData = MessageBox.Show(text, "Difference found", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes;
                    return(new TransferElementResponse()
                        {
                            Success = true, Data = useLoggedData
                        });
                }

                case LogType.OnWCFServiceResponse:
                {
                    var text          = "Difference found in service response, should we use the logged data?" + Environment.NewLine + Environment.NewLine + "Logged:" + Environment.NewLine + previousLogElement.Value + Environment.NewLine + Environment.NewLine + "New:" + Environment.NewLine + nextLogElement.Value;
                    var useLoggedData = MessageBox.Show(text, "Difference found", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes;
                    return(new TransferElementResponse()
                        {
                            Success = true, Data = useLoggedData
                        });
                }
                }
            }
            finally
            {
                this.TopMost = false;
            }

            return(new TransferElementResponse()
            {
                Success = true, Data = false                                  /*Use logged data*/
            });
        }
Esempio n. 6
0
        private TransferElementResponse ServiceInstanse_OnBrowserJob(LogElementDTO logElement)
        {
            //if (logElement.LogType == LogType.OnPageRequest)
            //{
            //    MessageBox.Show("what?");
            //}

            switch (logElement.LogType)
            {
            case LogType.OnResize:
                var browserResize = SerializationHelper.Deserialize <BrowserResize>(logElement.Value, SerializationType.Json);
                FindBrowserAndExec(logElement.PageGUID, x =>
                {
                    //MessageBox.Show($"Found Browser by pageGUID {logElement.PageGUID}");
                    x.ResizeBrowser(browserResize, logElement.GUID);
                });     //Hvis det er en redirect, så er PageGUID blevet ændret i response-html'et, men ikke opdateret i browseren endnu. Hvor længe skal jeg vente på at det sker?
                break;

            case LogType.OnPageRequest:
                var           requestParams = SerializationHelper.Deserialize <RequestParams>(logElement.Value, SerializationType.Json);
                RequestMethod requestMethod;
                if (!Enum.TryParse(requestParams.ServerVariables["REQUEST_METHOD"], true, out requestMethod))
                {
                    throw new Exception("PageRequest does not have a valid request method");
                }
                PerformURLRequest(logElement.PageGUID, BaseUrl.TrimEnd('/') + '/' + logElement.Element.TrimStart('/'), requestMethod);
                break;

            default:
                FindBrowserAndExec(logElement.PageGUID, x => x.PerformLogElement(logElement));
                break;
            }

            return(new TransferElementResponse()
            {
                Success = true
            });
        }
Esempio n. 7
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?");
            }
        }
Esempio n. 8
0
 public bool StoreLogElementHistory(LogElementDTO previousLogElement, LogElementDTO nextLogElement)
 {
     return(previousLogElement.LogType == LogType.OnPageRequest);
 }