Example #1
0
        public void PreWebTestSave(object sender, PreWebTestSaveEventArgs e)
        {
            int ruleAddedCounter = 1;

            for (int i = 0; i < e.FiddlerWebTest.Sessions.Count; i++)
            {
                WebTestSession session = e.FiddlerWebTest.Sessions[i];
                if (session.FiddlerSession.requestBodyBytes != null && (long)session.FiddlerSession.requestBodyBytes.Length > (long)0)
                {
                    FormPostParameter param = session.RequestFormParams.GetParameter(this.Field);
                    if (param != null)
                    {
                        int j = i - 1;
                        while (j >= 0)
                        {
                            WebTestSession prevSession = e.FiddlerWebTest.Sessions[j];
                            session.FiddlerSession.utilDecodeResponse();
                            string responseString = CONFIG.oHeaderEncoding.GetString(prevSession.FiddlerSession.responseBodyBytes).Trim();
                            if (!responseString.Contains(param.Name) || !responseString.Contains(param.Value))
                            {
                                j--;
                            }
                            else
                            {
                                while (prevSession.ParentSession != null)
                                {
                                    prevSession = prevSession.ParentSession;
                                }
                                if (prevSession.FiddlerSession.oRequest.headers.ExistsAndContains("x-microsoftajax", "Delta=true"))
                                {
                                    ExtractionRule rule = new ExtractionRule("Microsoft.VisualStudio.TestTools.WebTesting.Rules.ExtractText, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
                                    {
                                        ContextParameterName = string.Concat("$HIDDEN", ruleAddedCounter.ToString(), ".", this.Field)
                                    };
                                    rule.Properties.Add(new RuleProperty("StartsWith", string.Concat(this.Field, "|")));
                                    rule.Properties.Add(new RuleProperty("EndsWith", "|"));
                                    rule.Properties.Add(new RuleProperty("IgnoreCase", "True"));
                                    rule.Properties.Add(new RuleProperty("UseRegularExpression", "False"));
                                    rule.Properties.Add(new RuleProperty("Required", "True"));
                                    rule.Properties.Add(new RuleProperty("Index", "0"));
                                    prevSession.ExtractionRules.Add(rule);
                                    param.Value = string.Concat(new string[] { "{{$HIDDEN", ruleAddedCounter.ToString(), ".", this.Field, "}}" });
                                }
                                else
                                {
                                    ExtractionRule rule = new ExtractionRule("Microsoft.VisualStudio.TestTools.WebTesting.Rules.ExtractFormField, Microsoft.VisualStudio.QualityTools.WebTestFramework, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
                                    {
                                        ContextParameterName = string.Concat("$HIDDEN", ruleAddedCounter.ToString(), ".", this.Field)
                                    };
                                    rule.Properties.Add(new RuleProperty("Name", this.Field));
                                    prevSession.ExtractionRules.Add(rule);
                                    param.Value = string.Concat(new string[] { "{{$HIDDEN", ruleAddedCounter.ToString(), ".", this.Field, "}}" });
                                }
                                ruleAddedCounter++;
                                break;
                            }
                        }
                    }
                }
            }
        }
        public void Save(string Path, EventHandler <ProgressCallbackEventArgs> evtProgressNotifications, bool bIncludeAutoGeneratedComments)
        {
            string sBaseURL;
            int    timeout;

            FiddlerWebTest.BodyType btBodyEncoding;
            try
            {
                this.InvokePreWebTestSave();
                bool          usingNex = false;
                XmlTextWriter oXML     = new XmlTextWriter(Path, Encoding.UTF8)
                {
                    Formatting = Formatting.Indented
                };
                oXML.WriteStartDocument();
                oXML.WriteStartElement("TestCase");
                oXML.WriteAttributeString("Name", "FiddlerGeneratedWebTest");
                oXML.WriteAttributeString("Id", string.Empty);
                oXML.WriteAttributeString("Owner", string.Empty);
                oXML.WriteAttributeString("Description", string.Empty);
                oXML.WriteAttributeString("Priority", "0");
                oXML.WriteAttributeString("Enabled", "True");
                oXML.WriteAttributeString("CssProjectStructure", string.Empty);
                oXML.WriteAttributeString("CssIteration", string.Empty);
                oXML.WriteAttributeString("DeploymentItemsEditable", string.Empty);
                oXML.WriteAttributeString("CredentialUserName", this.UserName);
                oXML.WriteAttributeString("CredentialPassword", this.Password);
                bool preAuthenticate = this.PreAuthenticate;
                oXML.WriteAttributeString("PreAuthenticate", preAuthenticate.ToString());
                oXML.WriteAttributeString("Proxy", this.Proxy);
                oXML.WriteAttributeString("RequestCallbackClass", string.Empty);
                oXML.WriteAttributeString("TestCaseCallbackClass", string.Empty);
                oXML.WriteStartElement("Items");
                int i = 0;
                while (i < this.Sessions.Count)
                {
                    Session m_session = this.Sessions[i].FiddlerSession;
                    if (!m_session.oFlags.ContainsKey("neXpert.Step") || !(m_session["neXpert.Step"] != string.Empty))
                    {
                        i++;
                    }
                    else
                    {
                        usingNex = true;
                        break;
                    }
                }
                string m_name = "Transaction1";
                if (usingNex)
                {
                    oXML.WriteStartElement("TransactionTimer");
                    i = 0;
                    while (i < this.Sessions.Count)
                    {
                        Session m_session = this.Sessions[i].FiddlerSession;
                        if (!m_session.oFlags.ContainsKey("neXpert.Step") || !(m_session["neXpert.Step"] != string.Empty))
                        {
                            i++;
                        }
                        else
                        {
                            m_name = m_session["neXpert.Step"];
                            break;
                        }
                    }
                    oXML.WriteAttributeString("Name", m_name);
                    oXML.WriteStartElement("Items");
                }
                bool newTrans = false;
                for (i = 0; i < this.Sessions.Count; i++)
                {
                    WebTestSession webTestSession = this.Sessions[i];
                    Session        oSession       = webTestSession.FiddlerSession;
                    if (usingNex)
                    {
                        if (newTrans)
                        {
                            oXML.WriteEndElement();
                            oXML.WriteEndElement();
                            m_name = string.Empty;
                            int j = i;
                            while (j < this.Sessions.Count)
                            {
                                Session m_session = this.Sessions[j].FiddlerSession;
                                if (!m_session.oFlags.ContainsKey("neXpert.Step") || !(m_session["neXpert.Step"] != string.Empty))
                                {
                                    j++;
                                }
                                else
                                {
                                    m_name = m_session["neXpert.Step"];
                                    break;
                                }
                            }
                            if (m_name == string.Empty)
                            {
                                m_name = "Transaction1";
                            }
                            oXML.WriteStartElement("TransactionTimer");
                            oXML.WriteAttributeString("Name", m_name);
                            oXML.WriteStartElement("Items");
                            newTrans = false;
                        }
                        if (oSession.oFlags.ContainsKey("neXpert.Step") && oSession["neXpert.Step"] != string.Empty)
                        {
                            newTrans = true;
                        }
                    }
                    if (!webTestSession.WriteToWebTest)
                    {
                        if (evtProgressNotifications != null)
                        {
                            evtProgressNotifications(null, new ProgressCallbackEventArgs((float)(i + 1) / (float)this.Sessions.Count, string.Concat("skipped writing ", i.ToString(), " to WebTest.")));
                        }
                        FiddlerWebTest._WriteSessionComment(oSession, oXML, false);
                    }
                    else if (oSession.oRequest == null || oSession.oRequest.headers == null)
                    {
                        if (evtProgressNotifications != null)
                        {
                            evtProgressNotifications(null, new ProgressCallbackEventArgs((float)(i + 1) / (float)this.Sessions.Count, string.Concat("Ignoring Session #", oSession.id, " for WebTest.")));
                        }
                        FiddlerWebTest._WriteSessionComment(oSession, oXML, false);
                    }
                    else if (!FiddlerWebTest.IsIgnoredRequest(oSession))
                    {
                        string thinkTime = "0";
                        int    j         = i + 1;
                        while (j < this.Sessions.Count)
                        {
                            if (!this.Sessions[j].WriteToWebTest)
                            {
                                j++;
                            }
                            else
                            {
                                TimeSpan thinkDiff = this.Sessions[j].FiddlerSession.Timers.ClientDoneRequest - webTestSession.FiddlerSession.Timers.ServerDoneResponse;
                                double   think     = Math.Round(thinkDiff.TotalSeconds, 0);
                                thinkTime = think.ToString();
                                break;
                            }
                        }
                        FiddlerWebTest._WriteSessionComment(oSession, oXML, bIncludeAutoGeneratedComments);
                        oXML.WriteStartElement("Request");
                        oXML.WriteAttributeString("Method", oSession.RequestMethod);
                        oXML.WriteAttributeString("Version", oSession.oRequest.headers.HTTPVersion.Substring(5));
                        string sReportingName = oSession["WebTest-ReportingName"];
                        if (!string.IsNullOrEmpty(sReportingName))
                        {
                            oXML.WriteAttributeString("ReportingName", sReportingName);
                        }
                        int ixQueryPart = oSession.url.IndexOf("?");
                        if (ixQueryPart <= -1)
                        {
                            sBaseURL = oSession.url;
                        }
                        else
                        {
                            sBaseURL = oSession.url.Substring(0, ixQueryPart);
                            string[] strArrays  = oSession.url.Substring(ixQueryPart + 1).Split(new char[] { '&' });
                            string   sNonNVPs   = string.Empty;
                            string[] strArrays1 = strArrays;
                            for (timeout = 0; timeout < (int)strArrays1.Length; timeout++)
                            {
                                string sNVP = strArrays1[timeout];
                                if (sNVP.Length > 0 && !sNVP.Contains("="))
                                {
                                    sNonNVPs = (sNonNVPs.Length != 0 ? string.Concat(sNonNVPs, "&") : "?");
                                    sNonNVPs = string.Concat(sNonNVPs, sNVP);
                                }
                            }
                            sBaseURL = string.Concat(sBaseURL, sNonNVPs);
                        }
                        oXML.WriteAttributeString("Url", string.Format("{0}://{1}", oSession.oRequest.headers.UriScheme, sBaseURL));
                        oXML.WriteAttributeString("ThinkTime", thinkTime);
                        timeout = webTestSession.Timeout;
                        oXML.WriteAttributeString("Timeout", timeout.ToString());
                        preAuthenticate = webTestSession.ParseDependentRequests;
                        oXML.WriteAttributeString("ParseDependentRequests", preAuthenticate.ToString());
                        preAuthenticate = webTestSession.FollowRedirects;
                        oXML.WriteAttributeString("FollowRedirects", preAuthenticate.ToString());
                        preAuthenticate = webTestSession.RecordResults;
                        oXML.WriteAttributeString("RecordResult", preAuthenticate.ToString());
                        preAuthenticate = webTestSession.CacheControl;
                        oXML.WriteAttributeString("Cache", preAuthenticate.ToString());
                        timeout = webTestSession.ResponseTimeGoal;
                        oXML.WriteAttributeString("ResponseTimeGoal", timeout.ToString());
                        oXML.WriteAttributeString("Encoding", webTestSession.TextEncoding);
                        oXML.WriteStartElement("Headers");
                        foreach (Header oHeader in webTestSession.Headers)
                        {
                            if (!oHeader.WriteToWebTest)
                            {
                                continue;
                            }
                            oXML.WriteStartElement("Header");
                            if (oHeader.Name != null)
                            {
                                oXML.WriteAttributeString("Name", oHeader.Name);
                            }
                            else
                            {
                                oXML.WriteAttributeString("Name", string.Empty);
                            }
                            if (oHeader.Value != null)
                            {
                                oXML.WriteAttributeString("Value", oHeader.Value);
                            }
                            else
                            {
                                oXML.WriteAttributeString("Value", string.Empty);
                            }
                            oXML.WriteEndElement();
                        }
                        oXML.WriteEndElement();
                        if (webTestSession.ValidationRules.Count > 0)
                        {
                            oXML.WriteStartElement("ValidationRules");
                            foreach (ValidationRule rule in webTestSession.ValidationRules)
                            {
                                oXML.WriteStartElement("ValidationRule");
                                oXML.WriteAttributeString("Classname", rule.Classname);
                                oXML.WriteAttributeString("Level", rule.ValidationLevel.ToString());
                                if (rule.Properties.Count > 0)
                                {
                                    oXML.WriteStartElement("RuleParameters");
                                    foreach (RuleProperty rProperty in rule.Properties)
                                    {
                                        oXML.WriteStartElement("RuleParameter");
                                        oXML.WriteAttributeString("Name", rProperty.Name);
                                        oXML.WriteAttributeString("Value", rProperty.Value);
                                        oXML.WriteEndElement();
                                    }
                                    oXML.WriteEndElement();
                                }
                                oXML.WriteEndElement();
                            }
                            oXML.WriteEndElement();
                        }
                        if (webTestSession.ExtractionRules.Count > 0)
                        {
                            oXML.WriteStartElement("ExtractionRules");
                            foreach (ExtractionRule rule in webTestSession.ExtractionRules)
                            {
                                oXML.WriteStartElement("ExtractionRule");
                                oXML.WriteAttributeString("Classname", rule.Classname);
                                if (rule.ContextParameterName != null)
                                {
                                    oXML.WriteAttributeString("VariableName", rule.ContextParameterName);
                                }
                                if (rule.Properties.Count > 0)
                                {
                                    oXML.WriteStartElement("RuleParameters");
                                    foreach (RuleProperty rProperty in rule.Properties)
                                    {
                                        oXML.WriteStartElement("RuleParameter");
                                        oXML.WriteAttributeString("Name", rProperty.Name);
                                        oXML.WriteAttributeString("Value", rProperty.Value);
                                        oXML.WriteEndElement();
                                    }
                                    oXML.WriteEndElement();
                                }
                                oXML.WriteEndElement();
                            }
                            oXML.WriteEndElement();
                        }
                        if (webTestSession.RequestQueryParams.Count > 0)
                        {
                            oXML.WriteStartElement("QueryStringParameters");
                            foreach (QueryStringParameter oQSP in webTestSession.RequestQueryParams)
                            {
                                oXML.WriteStartElement("QueryStringParameter");
                                if (oQSP.Name != null)
                                {
                                    oXML.WriteAttributeString("Name", oQSP.Name);
                                }
                                else
                                {
                                    oXML.WriteAttributeString("Name", string.Empty);
                                }
                                if (oQSP.Value != null)
                                {
                                    oXML.WriteAttributeString("Value", oQSP.Value);
                                }
                                else
                                {
                                    oXML.WriteAttributeString("Value", string.Empty);
                                }
                                preAuthenticate = oQSP.UrlEncode;
                                oXML.WriteAttributeString("UrlEncode", preAuthenticate.ToString());
                                preAuthenticate = oQSP.UseToGroupResults;
                                oXML.WriteAttributeString("UseToGroupResults", preAuthenticate.ToString());
                                oXML.WriteEndElement();
                            }
                            oXML.WriteEndElement();
                        }
                        if (!Utilities.IsNullOrEmpty(oSession.requestBodyBytes))
                        {
                            string sContentType = oSession.oRequest["Content-Type"];
                            if (oSession.oRequest.headers.ExistsAndContains("Content-Type", "application/x-www-form-urlencoded"))
                            {
                                btBodyEncoding = FiddlerWebTest.BodyType.URLEncoded;
                                oXML.WriteStartElement("FormPostHttpBody");
                            }
                            else if (!Utilities.IsBinaryMIME(sContentType))
                            {
                                btBodyEncoding = FiddlerWebTest.BodyType.String;
                                oXML.WriteStartElement("StringHttpBody");
                            }
                            else
                            {
                                oXML.WriteStartElement("BinaryHttpBody");
                                btBodyEncoding = FiddlerWebTest.BodyType.Binary;
                            }
                            if (!string.IsNullOrEmpty(sContentType))
                            {
                                oXML.WriteAttributeString("ContentType", sContentType);
                            }
                            switch (btBodyEncoding)
                            {
                            case FiddlerWebTest.BodyType.URLEncoded:
                            {
                                using (IEnumerator <FormPostParameter> enumerator = webTestSession.RequestFormParams.GetEnumerator())
                                {
                                    while (enumerator.MoveNext())
                                    {
                                        FormPostParameter formParam = enumerator.Current;
                                        oXML.WriteStartElement("FormPostParameter");
                                        if (formParam.Name != null)
                                        {
                                            oXML.WriteAttributeString("Name", formParam.Name);
                                        }
                                        else
                                        {
                                            oXML.WriteAttributeString("Name", string.Empty);
                                        }
                                        if (formParam.Value != null)
                                        {
                                            oXML.WriteAttributeString("Value", formParam.Value);
                                        }
                                        else
                                        {
                                            oXML.WriteAttributeString("Value", string.Empty);
                                        }
                                        preAuthenticate = formParam.UrlEncode;
                                        oXML.WriteAttributeString("UrlEncode", preAuthenticate.ToString());
                                        oXML.WriteEndElement();
                                    }
                                    break;
                                }
                                break;
                            }

                            case FiddlerWebTest.BodyType.String:
                            {
                                oXML.WriteString(Convert.ToBase64String(Encoding.Unicode.GetBytes(oSession.GetRequestBodyAsString())));
                                break;
                            }

                            case FiddlerWebTest.BodyType.Binary:
                            {
                                oXML.WriteString(Convert.ToBase64String(oSession.requestBodyBytes));
                                break;
                            }

                            default:
                            {
                                throw new NotImplementedException("Impossible: unknown format");
                            }
                            }
                            oXML.WriteEndElement();
                        }
                        oXML.WriteEndElement();
                        if (evtProgressNotifications != null)
                        {
                            timeout = i + 1;
                            evtProgressNotifications(null, new ProgressCallbackEventArgs((float)(i + 1) / (float)this.Sessions.Count, string.Concat("wrote ", timeout.ToString(), " sessions to WebTest.")));
                        }
                    }
                    else
                    {
                        if (evtProgressNotifications != null)
                        {
                            evtProgressNotifications(null, new ProgressCallbackEventArgs((float)(i + 1) / (float)this.Sessions.Count, string.Concat("Ignoring Session #", oSession.id, " for WebTest.")));
                        }
                        FiddlerWebTest._WriteSessionComment(oSession, oXML, false);
                    }
                }
                if (usingNex)
                {
                    oXML.WriteEndElement();
                    oXML.WriteEndElement();
                }
                oXML.WriteEndElement();
                oXML.WriteEndDocument();
                oXML.Close();
            }
            catch (Exception exception)
            {
                Exception eX = exception;
                MessageBox.Show(string.Concat("Failed to save test\n", eX.Message));
            }
        }