/// <summary> /// This is the main method which will fetch xml data from Test Manager and parse it /// and call action method of test driver, and set OR dictionary value for each step. /// After execution of each step it will call method of reporting and pass step execution result. /// Updated this method for CSV files. /// </summary> /// <param name="testCaseId">Test Case ID</param> /// <param name="iterationTestCase">Optional field, if non nagetive value is present, that means, it is for child /// test case that have test data, it is like 1-1, 1-2, 2-4, ...</param> /// <param name="parentTestCaseId">Optional field, used for child test case data</param> /// <returns></returns> private static void ExecuteTestCase(string testCaseId, string iterationTestCase = null, string parentTestCaseId = null, string projectSpecific = null) { DataSet xmlTestCaseDataSet = null; int testCaseIdExists = -1; string projectSpecificTestCaseFile = string.Empty; Utility.SetVariable("reusabledefaultfile", testCaseId.Substring(0, testCaseId.IndexOf('.'))); #region Retrieve test case workflow from test manager and set to local dataset DataSet xmlTestCaseFlow; try { if (projectSpecific == "true") { #region project specific reusable test cases fetching string globalActionFileName = ""; if (!Path.GetExtension(Utility.GetVariable("reusabledefaultfile").ToLower().Trim()).Equals(Property.ExcelSheetExtension.ToLower())) globalActionFileName = Utility.GetVariable("reusabledefaultfile") + Property.ExcelSheetExtension; else globalActionFileName = Utility.GetVariable("reusabledefaultfile").Trim(); string TempglobalActionFileName = globalActionFileName.Substring(0, globalActionFileName.LastIndexOf('.')); if (Property.TestCaseIdParameter == 0) projectSpecificTestCaseFile = Common.Utility.GetParameter("TestCaseId"); else projectSpecificTestCaseFile = Property.TestCaseIdSeperator + TempglobalActionFileName; _objTestManager = container.Resolve<Manager>(new ResolverOverride[] { new ParameterOverride("testCaseId", projectSpecificTestCaseFile), new ParameterOverride("testCasefilename", globalActionFileName) }); //new Krypton.Manager(projectSpecificTestCaseFile, globalActionFileName); xmlTestCaseFlow = _objTestManager.GetTestCaseXml(Property.TestQuery,true,false); //checking if test case id exists in the file or not for (int drCnt = 0; drCnt < xmlTestCaseFlow.Tables[0].Rows.Count; drCnt++) { if (xmlTestCaseFlow.Tables[0].Rows[drCnt][KryptonConstants.TEST_CASE_ID].ToString().Equals(testCaseId, StringComparison.OrdinalIgnoreCase)) { testCaseIdExists = drCnt; break; } } if (testCaseIdExists < 0)//if not exists in the main test flow { #region KRYPTON0253 string[] sep = { Property.TestCaseIdSeperator}; string[] testFlowSheetName = testCaseId.Split(sep, StringSplitOptions.None); xmlTestCaseFlow = _objTestManager.GetTestCaseXml(testFlowSheetName[0], false, true); //checking if test case id exists in the file or not for (int drCnt = 0; drCnt < xmlTestCaseFlow.Tables[0].Rows.Count; drCnt++) { if (xmlTestCaseFlow.Tables[0].Rows[drCnt][KryptonConstants.TEST_CASE_ID].ToString().Equals(testCaseId, StringComparison.OrdinalIgnoreCase)) { testCaseIdExists = drCnt; break; } } if (testCaseIdExists < 0) { throw new KryptonException(Utility.GetCommonMsgVariable("KRYPTONERRCODE0049") + " [" + testCaseId + "] ", string.Empty); } #endregion } #endregion } else { _objTestManager = container.Resolve<Manager>(new ResolverOverride[] { new ParameterOverride("testCaseId", testCaseId), new ParameterOverride("testCasefilename", string.Empty) }); //new Manager(testCaseId); xmlTestCaseFlow = _objTestManager.GetTestCaseXml(Property.TestQuery, false, false); //checking if test case id exists in the file or not for (int drCnt = 0; drCnt < xmlTestCaseFlow.Tables[0].Rows.Count; drCnt++) { if (xmlTestCaseFlow.Tables[0].Rows[drCnt][KryptonConstants.TEST_CASE_ID].ToString().Equals(testCaseId, StringComparison.OrdinalIgnoreCase)) { testCaseIdExists = drCnt; break; } } if (testCaseIdExists < 0) { throw new KryptonException(Utility.GetCommonMsgVariable("KRYPTONERRCODE0049") + " [" + testCaseId + "] ", string.Empty); } } } catch (Exception exception) { using (StreamWriter sw = new StreamWriter(Property.ErrorLog)) { sw.WriteLine("In catch throw 0049exception 3"); } throw new KryptonException(Utility.GetCommonMsgVariable("KRYPTONERRCODE0049") + " [" + testCaseId + "] ", exception.Message); } #endregion //Retrieve test case data if required from test manage based on iteration specified bool isTestDataUsed = false; int startingDataRow = 1; int endingDataRow = 1; if (iterationTestCase.IsNullOrWhiteSpace()) { isTestDataUsed = false; } else { #region iteration step separtion //to fetch iteration step rows if (iterationTestCase.Contains('-')) iterationTestCase = iterationTestCase.Replace("-", "^"); string[] strIteration = iterationTestCase.Split('^'); if (Regex.IsMatch(strIteration[0], "([0-9]*)")) { startingDataRow = int.Parse(strIteration[0]); } if (strIteration.Length > 1) { if (Regex.IsMatch(strIteration[1], "([0-9]*)")) { endingDataRow = int.Parse(strIteration[1]); } } else { endingDataRow = startingDataRow; } #endregion isTestDataUsed = true; } string xmlTestCaseName = null; //intialize of test case name string xmlTestCaseBrowser = null; //intialize of test case browser //Start a loop for all test data records for (int testDataCounter = startingDataRow; testDataCounter < endingDataRow + 1; testDataCounter++) { //Storing the Iteration number to a Dictionary key 'Iteration'. Utility.SetVariable("Iteration", testDataCounter.ToString()); if (isTestDataUsed) { xmlTestCaseDataSet = null; } //to check if the loop reach the starting of the current test case records. bool currentTestCaseRecords = false; if (isTestDataUsed) { xmlTestCaseDataSet = null; } //Start a loop for all test case flow record for (int caseRowCnt = testCaseIdExists; caseRowCnt < xmlTestCaseFlow.Tables[0].Rows.Count; caseRowCnt++) { string xmlTestCaseId = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.TEST_CASE_ID].ToString(); #region to check record for current test case if (xmlTestCaseId.IsNullOrWhiteSpace() == false && xmlTestCaseId.Equals(testCaseId, StringComparison.OrdinalIgnoreCase)) currentTestCaseRecords = true; else if (xmlTestCaseId.IsNullOrWhiteSpace() == false && xmlTestCaseId.Equals(testCaseId, StringComparison.OrdinalIgnoreCase) == false) currentTestCaseRecords = false; if (xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.STEP_ACTION].ToString().Trim().IsNullOrWhiteSpace()) currentTestCaseRecords = false; if (currentTestCaseRecords == false) continue; #endregion //set test case name attribute to xml log file and that will be call once if (xmlTestCaseName == null && parentTestCaseId.IsNullOrWhiteSpace()) { xmlTestCaseName = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.TEST_SCENARIO].ToString(); XmlLog.AddTestAttribute("TestCase Name", xmlTestCaseName); } #region variable declaration and set value string xmlTestCaseStepAction = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.STEP_ACTION].ToString().Trim(); string xmlTestCaseIteration = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.ITERATION].ToString().Trim(); string xmlTestCaseData = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.DATA].ToString().Trim(); string xmlTestCaseObj = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.TEST_OBJECT].ToString().Trim(); string xmlTestCaseParent = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.PARENT].ToString().Trim(); string xmlTestCaseOption = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.OPTIONS].ToString().Trim(); string xmlTestCaseComment = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt][KryptonConstants.COMMENTS].ToString().Trim(); //Replace variables in string here for all columns and pass on xmlTestCaseStepAction = Utility.ReplaceVariablesInString(xmlTestCaseStepAction); xmlTestCaseData = Utility.ReplaceVariablesInString(xmlTestCaseData); xmlTestCaseParent = Utility.ReplaceVariablesInString(xmlTestCaseParent); xmlTestCaseObj = Utility.ReplaceVariablesInString(xmlTestCaseObj); xmlTestCaseOption = Utility.ReplaceVariablesInString(xmlTestCaseOption); xmlTestCaseComment = Utility.ReplaceVariablesInString(xmlTestCaseComment); xmlTestCaseIteration = Utility.ReplaceVariablesInString(xmlTestCaseIteration); #endregion #region Read individual column values from Test Case Flow and pass on to test driver if (xmlTestCaseStepAction.IsNullOrWhiteSpace() == false && ValidStepOption(xmlTestCaseOption) && Property.EndExecutionFlag != true) { string cleanUpString = Utility.GetCleanupTestCase(xmlTestCaseOption, "cleanuptestcaseid"); //capture Clean up test case id with options if (!cleanUpString.Equals(string.Empty)) _cleanupTestCase = cleanUpString; if (xmlTestCaseStepAction.Equals("runExcelTestCase", StringComparison.OrdinalIgnoreCase) == true) { //iteration method call for internal test case ExecuteTestCase(xmlTestCaseData, xmlTestCaseIteration, testCaseId, null); } else { string testCaseData; if (isTestDataUsed) { if (xmlTestCaseDataSet == null) // will call test data method only once { #region call to test case data method to fetch corresponding data try { //fetching test data sheet name from the option field in the first line of the nested test case and set for the whole test case string[] testDataSheet1 = Utility.GetTestMode(xmlTestCaseOption, "TestDataSheet").Split(','); var testDataSheet = testDataSheet1.Length > 1 ? testDataSheet1[1] : "test_data"; Property.TestDataSheet = testDataSheet; if (projectSpecific == "true") { xmlTestCaseDataSet = TestCaseData(parentTestCaseId, testDataCounter.ToString(), xmlTestCaseObj, true); } else { xmlTestCaseDataSet = TestCaseData(testCaseId, testDataCounter.ToString(), xmlTestCaseObj, false); } } catch (Exception exception) { _stepNos++; throw new KryptonException(Utility.GetCommonMsgVariable("KRYPTONERRCODE0050"), exception.Message); } #endregion } if (xmlTestCaseFlow.Tables[0].Rows[caseRowCnt]["data"].ToString().IsNullOrWhiteSpace() == false) { testCaseData = xmlTestCaseFlow.Tables[0].Rows[caseRowCnt]["data"].ToString(); } else { //to fetch by [td] variable testCaseData = "{$[TD]" + xmlTestCaseObj + "}"; } } else testCaseData = xmlTestCaseData; #region Handling test data situations for verifyDatabase if (xmlTestCaseStepAction.Equals("verifyDatabase", StringComparison.OrdinalIgnoreCase)) { //for data from DBTestData sheet try { DbTestData(testCaseId, xmlTestCaseData, xmlTestCaseObj); testCaseData = xmlTestCaseData; } catch (Exception exception) { _stepNos++; throw new KryptonException(Utility.GetCommonMsgVariable("KRYPTONERRCODE0050"), exception.Message); } } #endregion testCaseData = testCaseData.Trim(); #region Starting special script based on data given in options column. string[] scriptToRunContents = Utility.GetTestMode(xmlTestCaseOption, "script").Split(','); if (scriptToRunContents.Length > 1) { var scriptToRun = scriptToRunContents[1].ToLower(); try { if (!(scriptToRun.Contains(".exe"))) // Updated to Check if script provided already contains an extension { scriptToRun = scriptToRun + ".exe"; } Console.WriteLine("Executing special script: " + scriptToRun); Utility.SetProcessParameter(scriptToRun); //Add process name to process array before starting it. if ((scriptToRun.Equals("KillTPRecoveryforCSA.exe", StringComparison.OrdinalIgnoreCase)) || (scriptToRun.Equals("KillParallelRecovery.exe", StringComparison.OrdinalIgnoreCase))) { foreach (Process process in Process.GetProcesses()) { if (process.ProcessName.Equals("KryptonParallelRecovery", StringComparison.OrdinalIgnoreCase)) { process.Kill(); break; } } } else { // Create process information and assign data Process specialScriptProcess = new Process(); specialScriptProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; specialScriptProcess.StartInfo.UseShellExecute = false; specialScriptProcess.StartInfo.FileName = scriptToRun; specialScriptProcess.StartInfo.ErrorDialog = false; // Start the process specialScriptProcess.Start(); specialScriptProcess.WaitForExit(10000); } } catch (Exception ex) { KryptonException.Writeexception(ex); } } #endregion //Replace variables in string here for all columns and pass on xmlTestCaseStepAction = Utility.ReplaceVariablesInString(xmlTestCaseStepAction); xmlTestCaseParent = Utility.ReplaceVariablesInString(xmlTestCaseParent); xmlTestCaseObj = Utility.ReplaceVariablesInString(xmlTestCaseObj); xmlTestCaseOption = Utility.ReplaceVariablesInString(xmlTestCaseOption); xmlTestCaseComment = Utility.ReplaceVariablesInString(xmlTestCaseComment); xmlTestCaseIteration = Utility.ReplaceVariablesInString(xmlTestCaseIteration); testCaseData = Utility.ReplaceVariablesInString(testCaseData); if (xmlTestCaseOption.IndexOf("{append}", StringComparison.OrdinalIgnoreCase) >= 0) { testCaseData = Utility.ReplaceVariablesInString("{$" + xmlTestCaseObj + "}") + testCaseData; } //Replace variable with special charecters) if (ValidStepOption(testCaseData) == false) continue; #region call to TestDriver Action.Do method try { //Initialize Step Log. Property.InitializeStepLog(); if (xmlTestCaseOption.IndexOf("{optional}", StringComparison.OrdinalIgnoreCase) < 0 && !(xmlTestCaseStepAction.ToLower().Equals("setvariable") && Property.DebugMode.Equals("false"))) { _stepNos++; Property.StepNumber = _stepNos.ToString(); } Console.WriteLine("Parent:" + xmlTestCaseParent); Console.WriteLine("Object:" + xmlTestCaseObj); Console.WriteLine("Step Action:" + xmlTestCaseStepAction); if (testCaseData.IndexOf("{$[TD]", StringComparison.OrdinalIgnoreCase) < 0) Console.WriteLine("Data:" + testCaseData); else Console.WriteLine("Data:"); //Set TestDriver object dictionary TestDriver.Action.ObjDataRow = GetTestOrData(xmlTestCaseParent, xmlTestCaseObj); // In case of DragAndDrop, there are two objects to be handled simultaneously. // Set second object dictionary if (xmlTestCaseStepAction.Equals("DragAndDrop", StringComparison.OrdinalIgnoreCase) == true) TestDriver.Action.ObjSecondDataRow = GetTestOrData(xmlTestCaseParent, xmlTestCaseData); if (TestDriver.Action.ObjDataRow.ContainsKey(KryptonConstants.WHAT)) Console.WriteLine("OR Locator:" + TestDriver.Action.ObjDataRow[KryptonConstants.WHAT]); else Console.WriteLine("OR Locator:"); Property.ExecutionDate = DateTime.Now.ToString(Utility.GetParameter("DateFormat")); Property.ExecutionTime = DateTime.Now.ToString(Utility.GetParameter("TimeFormat")); TestStepAction.Do(xmlTestCaseStepAction, xmlTestCaseParent, xmlTestCaseObj, testCaseData, xmlTestCaseOption); if (xmlTestCaseStepAction.Equals("closeallbrowsers",StringComparison.OrdinalIgnoreCase)) { Utility.SetVariable("FirefoxProfilePath", Utility.GetParameter("FirefoxProfilePath")); } //if action method is not implemented is returned, need to check for project specific functions if (Property.Remarks.IndexOf(Utility.GetCommonMsgVariable("KRYPTONERRCODE0025"), StringComparison.OrdinalIgnoreCase) >= 0) { #region checkprojectspecificfunction if (xmlTestCaseStepAction.IndexOf(Property.TestCaseIdSeperator, StringComparison.OrdinalIgnoreCase) >= 0) { if (xmlTestCaseOption.IndexOf("{optional}", StringComparison.OrdinalIgnoreCase) < 0) { _stepNos--; } #region KRYPTON0252 string[] argument = testCaseData.Split(Property.Seprator); if (argument.Length > 0) { for (int argCount = 0; argCount < argument.Length; argCount++) { Utility.SetVariable("argument" + (argCount + 1), argument[argCount].Trim()); } } #endregion ExecuteTestCase(xmlTestCaseStepAction, xmlTestCaseIteration, testCaseId, "true"); continue; } #endregion } { bool flag = xmlTestCaseOption.Equals("{NoReporting}") && Property.Status == ExecutionStatus.Fail || xmlTestCaseOption.Equals("{NoReporting}").Equals(false); if ((xmlTestCaseOption.IndexOf("{optional}", StringComparison.OrdinalIgnoreCase) < 0)) { if (flag) { if (Property.Status == ExecutionStatus.Fail && xmlTestCaseStepAction.IndexOf("verify", StringComparison.OrdinalIgnoreCase) < 0) { TestSuiteResult = 1; //process fail //Increment Failure Count only in case of non optional and non ignored step cases. _failureCount++; if ((_failureCount == int.Parse(Utility.GetParameter("FailedCountForExit")) && int.Parse(Utility.GetParameter("FailedCountForExit")) > 0) || Property.EndExecutionFlag == true) { if (Property.EndExecutionFlag == true) Console.WriteLine(ConsoleMessages.MSG_EXCEUTION_ENDS); else Console.WriteLine(ConsoleMessages.MSG_FAILURE_EXCEED); Property.StepComments = xmlTestCaseComment + ": End execution due to nos. of failure(s) exceeds failed counter defined in parameter file -" + _failureCount + "."; XmlLog.WriteExecutionLog(); Property.EndExecutionFlag = true; return; } Property.StepComments = xmlTestCaseComment; XmlLog.WriteExecutionLog(); Console.WriteLine("Status:" + Property.Status); Console.WriteLine("Remarks:" + Property.Remarks); } else { Property.StepComments = xmlTestCaseComment; if (!(xmlTestCaseStepAction.ToLower().Equals("setvariable") && Property.DebugMode.Equals("false"))) XmlLog.WriteExecutionLog(); Console.WriteLine("Status:" + Property.Status); Console.WriteLine("Remarks:" + Property.Remarks); } } } //set browser attribute to xml log file and that will be call once if (xmlTestCaseBrowser == null && !Utility.GetVariable(Property.BrowserVersion).Equals("version", StringComparison.OrdinalIgnoreCase)) { xmlTestCaseBrowser = Utility.GetVariable(Property.BrowserString) + Utility.GetVariable(Property.BrowserVersion); XmlLog.AddTestAttribute("Browser", Utility.GetVariable(Property.BrowserString) + Utility.GetVariable(Property.BrowserVersion)); } } } catch (ArgumentOutOfRangeException ex) { throw new Exception("Syntax error in test input."); } catch (Exception exception) { throw new Exception(Utility.GetCommonMsgVariable("KRYPTONERRCODE0051").Replace("{MSG}", exception.Message)); } Console.WriteLine(ConsoleMessages.MSG_DASHED); if (xmlTestCaseOption.IndexOf("{optional}", StringComparison.OrdinalIgnoreCase) < 0) { XmlLog.SaveXmlLog(); //Generation of xml log file } #endregion } } } } }
/// <summary> /// This method will copy report files from a temporary location used by Reporting module /// to a given location that can be used by the QC or XStudio or similar test management modules. It also /// generates a text file containing all result files' path for XStudio. /// Source and destination paths will be fetched from the Property.cs file. /// </summary> /// <returns>True on success else False</returns> public static bool UploadTestExecutionResults(List<string> inputTestIds = null) { bool res; try { _strResultsSource = new DirectoryInfo(Property.ResultsSourcePath).Parent; _strResultsDestination = new DirectoryInfo(Property.ResultsDestinationPath); // Copy all result files from source directory to destination directory. res = CopyAll(_strResultsSource, _strResultsDestination); // Create a temporary file to make sure that the copy process has been completed. bool resFinished = true; if (_strResultsDestination.Parent != null) { StreamWriter sw = new StreamWriter(_strResultsDestination.Parent.FullName + "/ResultCopyCompleted.txt"); sw.WriteLine("Key: Copy Process Completed!"); sw.Close(); } var directoryInfo = new DirectoryInfo(Property.ResultsSourcePath).Parent; if (directoryInfo != null) { DirectoryInfo drParent = directoryInfo.Parent; //to check if user wants to keep report history string fileExt = string.Empty; if (_strResultsDestination.Name.LastIndexOf('-') >= 0 && Utility.GetParameter("KeepReportHistory").Equals("true", StringComparison.OrdinalIgnoreCase) == true) fileExt = _strResultsDestination.Name.Substring(_strResultsDestination.Name.LastIndexOf('-'), _strResultsDestination.Name.Length - _strResultsDestination.Name.LastIndexOf('-')); string rcProcessId = string.Empty; if (!string.IsNullOrWhiteSpace(Property.RcProcessId)) rcProcessId = "-" + Property.RcProcessId; //Adding process id for Remote execution if (drParent != null) foreach (FileInfo fi in drParent.GetFiles()) { if (fi.Name.IndexOf("HtmlReport", StringComparison.OrdinalIgnoreCase) >= 0 || fi.Name.IndexOf("logo", StringComparison.OrdinalIgnoreCase) >= 0 || fi.Name.IndexOf(Property.ReportZipFileName, StringComparison.OrdinalIgnoreCase) >= 0 || fi.Name.IndexOf("." + Property.ScriptLanguage, StringComparison.OrdinalIgnoreCase) >= 0) { if (fi.Name.IndexOf("mail.html", StringComparison.OrdinalIgnoreCase) >= 0) // no need to copy this file to krypton result folder while sending mail through krypton continue; string fileName; if (fi.Name.IndexOf("logo", StringComparison.OrdinalIgnoreCase) >= 0) { fileName = fi.Name; } else if (fi.Name.IndexOf("HtmlReport", StringComparison.OrdinalIgnoreCase) >= 0) { string htmlFileExt; if (!string.IsNullOrWhiteSpace(Utility.GetParameter("TestSuite"))) { htmlFileExt = Utility.GetParameter("TestSuite"); } else { string[] testCaseIds = Utility.GetParameter("TestCaseId").Split(','); if (testCaseIds.Length > 1) htmlFileExt = testCaseIds[0] + "...multiple"; else htmlFileExt = Utility.GetParameter("TestCaseId"); } htmlFileExt = htmlFileExt + rcProcessId; if (fi.Name.IndexOf("HtmlReports", StringComparison.OrdinalIgnoreCase) >= 0) fileName = fi.Name.Substring(0, fi.Name.LastIndexOf('.')) + "-" + htmlFileExt + fileExt + "s" + fi.Name.Substring(fi.Name.LastIndexOf('.'), fi.Name.Length - fi.Name.LastIndexOf('.')); else fileName = fi.Name.Substring(0, fi.Name.LastIndexOf('.')) + "-" + htmlFileExt + fileExt + fi.Name.Substring(fi.Name.LastIndexOf('.'), fi.Name.Length - fi.Name.LastIndexOf('.')); } else { fileName = fi.Name.Substring(0, fi.Name.LastIndexOf('.')) + fileExt + fi.Name.Substring(fi.Name.LastIndexOf('.'), fi.Name.Length - fi.Name.LastIndexOf('.')); } if (_strResultsDestination.Parent != null) { fi.CopyTo(_strResultsDestination.Parent.FullName + "/" + fileName, true); //if user wants to keep report history, folder name will be different, so need to change links in the html file also if (string.IsNullOrWhiteSpace(fileExt) == false && fi.Name.Contains("HtmlReport")) { string htmlStr = File.ReadAllText(_strResultsDestination.Parent.FullName + "/" + fileName, Encoding.UTF8); string testCaseId = string.Empty; //Handle Test Case Id conditions #region check for test suite string testSuite = Utility.GetParameter("TestSuite"); if (!string.IsNullOrWhiteSpace(testSuite.Trim()) && string.IsNullOrWhiteSpace(Utility.GetParameter("TestCaseId").Trim())) { SetTestFilesLocation(Property.ManagerType); // get ManagerType from property.cs Manager objTestManagerSuite = new Manager(testSuite); var testSuiteData = objTestManagerSuite.GetTestCaseXml(Property.TestQuery, false, false); for (int testCaseCnt = 0; testCaseCnt < testSuiteData.Tables[0].Rows.Count; testCaseCnt++) { if (!string.IsNullOrWhiteSpace(testSuiteData.Tables[0].Rows[testCaseCnt][KryptonConstants.TEST_CASE_ID].ToString().Trim())) { if (string.IsNullOrWhiteSpace(testCaseId)) testCaseId = testSuiteData.Tables[0].Rows[testCaseCnt][KryptonConstants.TEST_CASE_ID].ToString(); else testCaseId = testCaseId + "," + testSuiteData.Tables[0].Rows[testCaseCnt][KryptonConstants.TEST_CASE_ID]; } } } else { testCaseId = Utility.GetParameter("TestCaseId");//override testcaseid parameter over test suite } #endregion var testCases = inputTestIds != null ? inputTestIds.ToArray() : testCaseId.Split(','); string[] testCasesIds = new string[testCases.Length]; int k = 0; foreach (string testCase in testCases) { if (string.Join(";", testCasesIds).Contains(testCase + ";") == false) { testCasesIds[k] = testCase; htmlStr = htmlStr.Replace("href='" + testCase + "\\", "href='" + testCase + rcProcessId + fileExt + "\\"); k++; } } File.WriteAllText(_strResultsDestination.Parent.FullName + "/" + fileName, htmlStr, Encoding.UTF8); } } } } } int resCheckLimit = 0; do { if (_strResultsDestination.Parent != null && File.Exists(_strResultsDestination.Parent.FullName + "/ResultCopyCompleted.txt")) { File.Delete(_strResultsDestination.Parent.FullName + "/ResultCopyCompleted.txt"); resFinished = false; } else { if (resCheckLimit++ < 6) Thread.Sleep(5000); else resFinished = false; } } while (resFinished); } catch (Exception exception) { throw new KryptonException("error", exception.Message); } var fileUploadPath = Property.ResultsDestinationPath + "/" + (new DirectoryInfo(Property.ResultsSourcePath).Name); // Extra actions are performed for particular test manager. switch (_strManagerType.ToLower()) { case "qc": // Not Functional yet break; case "xstudio": // XStudio requires a trigger that tells about the end of the execution. // Generation of test_completed.txt file will notify XStudio. TestManager.UploadTestResults(_resultFilesList, fileUploadPath); break; case "mstestmanager": // Not Functional yet TestManager.UploadTestResults(Property.FinalXmlPath, Property.FinalExecutionStatus); break; } return res; }
/// <summary> /// This is Main console engine /// execute test cases and generate log file /// </summary> /// <param name="args">console arguments which will override parameter.ini default parameters</param> /// <returns></returns> static int Main(string[] args) { string version = ConfigurationSettings.AppSettings["Version"]; RegisterDependencies(); Console.Title = "Krypton" + " v" + "2.0.1"; try { //To find application startup path. string applicationPath = Application.StartupPath; if (applicationPath.Length > 0) { Property.ApplicationPath = applicationPath + "\\"; } else { DirectoryInfo dr = new DirectoryInfo("./"); Property.ApplicationPath = dr.FullName; } InitializeIniPath(args); Utility.SetParameter("ApplicationPath", Property.ApplicationPath); Utility.SetVariable("ApplicationPath", Property.ApplicationPath); Utility.GetCommonMessageData(); //Parse ini file and put all parameters into global dictionary #region Adding internal parameter, runbyevents. /* Parameter "runbyevents" means, certain methods will run using browser events instead of using native driver implemented methods. This can also be passed from command line arguments, but is not added in parameter.ini file. When its value is true, browser events will be used to perform operations instead of native methods. E.g. arguments[0].click(); will be used instead of testobject.click when this parameter is true */ Property.Parameterdic.Add("runbyevents", "false"); Property.Runtimedic.Add("runbyevents", "false"); Utility.SetParameter("keyword", string.Empty); Utility.SetVariable("keyword", string.Empty); Utility.SetParameter("currentRelease", "0"); Utility.SetVariable("currentRelease", "0"); if (Path.IsPathRooted(Property.DestinationFolderDownload)) { Utility.SetParameter("downloadpath", Property.DestinationFolderDownload); Utility.SetVariable("downloadpath", Property.DestinationFolderDownload); } else { Utility.SetParameter("downloadpath", string.Concat(Property.ApplicationPath, Property.DestinationFolderDownload)); Utility.SetVariable("downloadpath", string.Concat(Property.ApplicationPath, Property.DestinationFolderDownload)); } #endregion Utility.CollectkeyValuePairs(); #region Parse arguments passed to executable. This may over-write ini file parameters, if names are same if (args.Length != 0) { for (int i = 0; i < args.Length; i++) { string[] keyValuePair = args[i].Trim().Split('='); string key = keyValuePair[0].Trim().ToLower(); string value = keyValuePair[1].Trim(); Utility.SetParameter(key, value); Utility.SetVariable(key, value); } } #endregion // Set Environment File Paths Property.EnvironmentFileLocation = Path.IsPathRooted(Utility.GetParameter("EnvironmentFileLocation")) ? Utility.GetParameter("EnvironmentFileLocation") : Path.Combine(Property.IniPath, Utility.GetParameter("EnvironmentFileLocation")); Utility.UpdateKeyValuePairs(); Utility.ValidateParameters(); Property.RecoveryCount = Convert.ToInt16(Utility.GetParameter("recoverycount")); // modified to set the value only if it is given in parameters.ini if (Utility.GetParameter("globaltimeout") != string.Empty) Property.GlobalTimeOut = Utility.GetParameter("globaltimeout"); //In case manager type is MSTestManager, user can pass on any of the following options: //MSTestManager,MSTM,MTM,VSTM,VSTestManager if (Utility.GetParameter("ManagerType").StartsWith("MSTestManager", StringComparison.OrdinalIgnoreCase) || Utility.GetParameter("ManagerType").StartsWith("MSTM", StringComparison.OrdinalIgnoreCase) || Utility.GetParameter("ManagerType").StartsWith("MTM", StringComparison.OrdinalIgnoreCase) || Utility.GetParameter("ManagerType").StartsWith("VSTM", StringComparison.OrdinalIgnoreCase) || Utility.GetParameter("ManagerType").StartsWith("VSTestManager", StringComparison.OrdinalIgnoreCase)) { Utility.SetParameter("ManagerType", "MSTestManager"); Utility.SetVariable("ManagerType", "MSTestManager"); } //Get browser settings Utility.InitializeBrowser(Utility.GetParameter(Property.BrowserString)); Property.ApplicationUrl = Utility.GetParameter("ApplicationURL"); int num; if (Property.Parameterdic.ContainsKey("waitforalert")) if (!string.IsNullOrEmpty(Utility.GetParameter("Waitforalert")) && int.TryParse(Utility.GetParameter("Waitforalert"), out num)) Property.Waitforalert = int.Parse(Utility.GetParameter("Waitforalert")); Property.ExcelSheetExtension = Utility.GetParameter("TestCaseFileExtension"); if (!Property.ExcelSheetExtension.StartsWith(".")) { Property.ExcelSheetExtension = "." + Property.ExcelSheetExtension; } //Get Test Case File path Property.TestCaseFilepath = Path.IsPathRooted(Utility.GetParameter("TestCaseLocation")) ? Utility.GetParameter("TestCaseLocation") : Path.Combine(Property.IniPath, Utility.GetParameter("TestCaseLocation")); //set the ManagerType if (Utility.GetParameter("ManagerType").IsNullOrWhiteSpace() == false) Property.ManagerType = Utility.GetParameter("ManagerType"); if (Utility.GetParameter("ListOfUniqueCharacters").IsNullOrWhiteSpace() == false) { Property.ListOfUniqueCharacters = Utility.GetParameter("ListOfUniqueCharacters").Split(','); } //Handle Test Case Id conditions #region check for test suite if (Utility.GetParameter("TestSuite").Trim().IsNullOrWhiteSpace() && Utility.GetParameter("TestSuite") != string.Empty) { Utility.SetParameter("TestSuite", Utility.GetParameter("TestCaseId").Trim().Split('.')[0]); } else { TestSuite = Utility.GetParameter("TestSuite").Trim(); } if (Property.Parameterdic["testsuite"] != string.Empty && Property.Parameterdic["testcaseid"] != string.Empty) { Property.Runtimedic["testcaseid"] = Property.Parameterdic["testcaseid"]; Utility.SetParameter("TestSuite", string.Empty); Property.Runtimedic["testsuite"] = string.Empty; } if (Utility.GetParameter("TestSuite") != string.Empty) { var testsuiteFilePath = Path.GetFullPath(Property.IniPath + "/" + Utility.GetParameter("TestSuiteLocation") + "/" + Utility.GetParameter("TestSuite")); //Read the suite excel file to dataset DataSet suiteFileDataSet = Manager.GetSuiteDataSet(testsuiteFilePath); Utility.SetParameter("TestCaseId", Utility.GetTestCaseIdFromSuiteDataset(suiteFileDataSet)); Property.Runtimedic["testcaseid"] = string.Empty; } if (!Utility.GetParameter("TestCaseId").Trim().IsNullOrWhiteSpace()) TestSuite = Utility.GetParameter("TestCaseId").Trim().Split('.')[0]; TestCaseId = Utility.GetParameter("TestCaseId"); Manager.IsTestSuite = false; //Test Cases that Input From the Parameter.ini #endregion //Test Cases that are exit in file string[] matchingTestCase = TestCaseId.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); string finalTestCases = null; finalTestCases = Property.Runtimedic["testcaseid"]; if (Utility.GetParameter("TestSuite") != string.Empty) { finalTestCases = matchingTestCase.Aggregate(finalTestCases, (current, item) => current + "," + item); finalTestCases = finalTestCases.Substring(1); } TestCases = finalTestCases.Split(','); // Check if there is at least one test case id for test execution if (TestCases.Length.Equals(0)) { Console.WriteLine(Exceptions.ERROR_NOTESTCASEFOUND); return TestSuiteResult; } KryptonUtility.SetProjectFilesPaths(); #region to get database from different ini files string[] sqlConnectionStr = Property.DbConnectionString.Trim().Split(';'); for (int sqlParamCnt = 0; sqlParamCnt < sqlConnectionStr.Length; sqlParamCnt++) { if (sqlConnectionStr[sqlParamCnt].Trim().IndexOf("database", StringComparison.OrdinalIgnoreCase) >= 0) { string oriDatabase = sqlConnectionStr[sqlParamCnt]; sqlConnectionStr[sqlParamCnt] = Utility.GetParameter("write").IsNullOrWhiteSpace() == false ? "database=" + Utility.GetParameter("write") : oriDatabase; Property.SqlConnectionStringWrite = string.Join(";", sqlConnectionStr); sqlConnectionStr[sqlParamCnt] = Utility.GetParameter("read").IsNullOrWhiteSpace() == false ? "database=" + Utility.GetParameter("read") : oriDatabase; Property.SqlConnectionStringRead = string.Join(";", sqlConnectionStr); } } #endregion //dbtestdata file path Property.SqlQueryFilePath = Path.IsPathRooted(Utility.GetParameter("DBQueryFilePath")) ? Utility.GetParameter("DBQueryFilePath") : string.Concat(Property.IniPath, Utility.GetParameter("DBQueryFilePath")); //to split testcaseid for test case excel file Property.TestCaseIdSeperator = Utility.GetParameter("TestCaseIDSeperator"); //to fetch test case excel file from testcaseid Property.TestCaseIdParameter = int.Parse(Utility.GetParameter("TestCaseIDParameter")); Property.DebugMode = Utility.GetParameter("debugmode").Trim(); //for snapshot option Property.SnapshotOption = Utility.GetParameter("SnapshotOption"); //for remote execution initialization Property.IsRemoteExecution = Utility.GetParameter("RunRemoteExecution"); //Force snapshot option in case of remote driver if (Property.IsRemoteExecution.Equals("true") && Property.SnapshotOption.Equals("always")) { Property.SnapshotOption = "on page change"; } Property.RemoteUrl = Utility.GetParameter("RunOnRemoteBrowserUrl"); //for email templates Property.EmailStartTemplate = Path.IsPathRooted(Utility.GetParameter("EmailStartTemplate")) ? Utility.GetParameter("EmailStartTemplate") : string.Concat(Property.IniPath, Utility.GetParameter("EmailStartTemplate")); Property.EmailEndTemplate = Path.IsPathRooted(Utility.GetParameter("EmailEndTemplate")) ? Utility.GetParameter("EmailEndTemplate") : string.Concat(Property.IniPath, Utility.GetParameter("EmailEndTemplate")); //scripting language if (!Utility.GetVariable("ScriptLanguage").IsNullOrWhiteSpace()) Property.ScriptLanguage = Utility.GetVariable("ScriptLanguage"); } catch (Exception exception) { Console.WriteLine(new KryptonException(exception.Message)); return TestSuiteResult; } if (!Utility.GetVariable("RCProcessId").IsNullOrWhiteSpace() && !Utility.GetVariable("RCProcessId").Equals("RCProcessId", StringComparison.OrdinalIgnoreCase)) Property.RcProcessId = Utility.GetVariable("RCProcessId"); if (!Utility.GetVariable("RCMachineId").IsNullOrWhiteSpace() && !Utility.GetVariable("RCMachineId").Equals("RCMachineId", StringComparison.OrdinalIgnoreCase)) { Property.RcMachineId = Utility.GetVariable("RCMachineId"); //Update saucelabs machine status to protect identity of username and api key if (Property.RcMachineId.ToLower().Contains(KryptonConstants.BROWSER_SAUCELABS)) Property.RcMachineId = KryptonConstants.BROWSER_SAUCELABS; } else { Property.RcMachineId = Environment.MachineName; Utility.SetVariable("RCMachineId", Environment.MachineName); Utility.SetParameter("RCMachineId", Environment.MachineName); } if (!Environment.UserName.IsNullOrWhiteSpace()) Property.RcUserName = Environment.UserName; //set logged in username if (Utility.GetParameter("FailedCountForExit").IsNullOrWhiteSpace()) { Utility.SetParameter("FailedCountForExit", Property.FailedCountForExit); } if (Utility.GetParameter("StartParallelRecovery").IsNullOrWhiteSpace()) { Utility.SetParameter("StartParallelRecovery", Property.StartParallelRecovery); } Property.Date_Time = Utility.GetParameter("DateTimeFormat").Replace("/", "\\/"); //Execution start date and time set DateTime dtNow = DateTime.Now; #region source path location and clear temp folder var sourcePath = "KRYPTONResults-" + Guid.NewGuid(); //HTML File location Property.HtmlFileLocation = string.Format("{0}{1}", Path.GetTempPath(), sourcePath); Property.ListOfFilesInTempFolder.Add(Property.HtmlFileLocation); #endregion Property.ExecutionStartDateTime = dtNow.ToString(Property.Date_Time); FilePath = new string[TestCases.Length]; bool validation = false; //need to capture the validation steps so that it will not check for each test case //when running in batch mode (more than one test case or in test suite), value of this parameter is always true, irrespective of what user specified if (TestCases.Length > 1) Utility.SetParameter("closebrowseroncompletion", "true"); // final test case id to be stored in final test case variable Property.FinalTestCase = TestCases[TestCases.Length - 1]; #region Setup Test Environment on Local Workstation for (int testCaseCnt = 0; testCaseCnt < TestCases.Length; testCaseCnt++) { // This section handles setting test environment using command line provided in Environment specific ini files // Retrieve command to be executed from variables string envSetupCommand = Utility.GetVariable("EnvironmentSetupBatch"); envSetupCommand = Utility.ReplaceVariablesInString(envSetupCommand); // Do not attempt to setup environment if no script needs to be executed if (!(envSetupCommand.IsNullOrWhiteSpace())) { if (File.Exists(Path.Combine(Property.EnvironmentFileLocation, envSetupCommand))) { Process setupProcess = new Process { StartInfo = { WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, FileName = Path.Combine(Property.EnvironmentFileLocation, envSetupCommand), ErrorDialog = false, Arguments = Utility.GetParameter("Browser") + " " + Utility.GetParameter("Environment") + " " + "\"" + Utility.GetParameter("TestSuite").Trim() + "\"" + " " + "\"" + Property.RcProcessId + "\"" } }; //Pass on couple of extra arguments to setup batch file //These includes BrowserType, TestEnvironment // Start the process setupProcess.Start(); setupProcess.WaitForExit(); try { if (!setupProcess.HasExited) { setupProcess.Kill(); } } catch (Exception e) { KryptonException.Writeexception(e); } } else { Console.WriteLine(new KryptonException("Environment file: " + Property.ApplicationPath + envSetupCommand + " is not exist.")); return TestSuiteResult; } } #endregion string logDestinationExt = string.Empty; if (Utility.GetParameter("KeepReportHistory").Equals("true", StringComparison.OrdinalIgnoreCase)) { logDestinationExt = "-" + dtNow.ToString("ddMMyyhhmmss"); Property.DateTime = logDestinationExt; } Property.ResultsSourcePath = string.Format("{0}{1}\\{2}\\{3}", Path.GetTempPath(), sourcePath, TestCases[testCaseCnt].Trim(), (testCaseCnt + 1).ToString()); //if user wants to keep report history, it will be available with dateandtime appended in the log destination folder if (!Property.RcProcessId.IsNullOrWhiteSpace()) logDestinationExt = "-" + Property.RcProcessId + logDestinationExt; if (Path.IsPathRooted(Utility.GetParameter("LogDestinationFolder"))) Property.ResultsDestinationPath = string.Format("{0}\\{1}{2}", Utility.GetParameter("LogDestinationFolder"), TestCases[testCaseCnt].Trim(), logDestinationExt); else Property.ResultsDestinationPath = string.Format("{0}\\{1}{2}", string.Concat(Property.IniPath, Utility.GetParameter("LogDestinationFolder")), TestCases[testCaseCnt].Trim(), logDestinationExt); //Initialize the logwriter to record any message/exception after test step completion try { Logwriter = container.Resolve<IKryptonLogger>(new ResolverOverride[] { new ParameterOverride("testcasecnt",testCaseCnt) }); //new KryptonFileLogWriter(testCaseCnt); } catch (Exception e) { KryptonException.Writeexception(e); Console.WriteLine(Exceptions.ERROR_INVALIDTESTID + TestCases[testCaseCnt] + "in Test Suite: " + TestSuite); // If test case Id will be of more than 255 characters.. return TestSuiteResult; } #region Creating the xml log file path try { FilePath[testCaseCnt] = string.Format("{0}\\{1}", Property.ResultsSourcePath, Property.LogFileName); Reporting.LogFile.filePathName = FilePath[testCaseCnt]; XmlLog = Reporting.LogFile.Instance; //xml log file initialization XmlLog.AddTestAttribute("TestCase Id", TestCases[testCaseCnt].Trim()); if (!Property.RcMachineId.IsNullOrWhiteSpace()) XmlLog.AddTestAttribute("RCMachineId", Property.RcMachineId); } catch (Exception exception) { Console.WriteLine(new KryptonException(exception.Message)); return TestSuiteResult; } #endregion Property.ValidateSetup = Utility.GetParameter("ValidateSetup"); if (Property.ValidateSetup.Equals("true", StringComparison.OrdinalIgnoreCase)) { #region validation //once it validates it will not run for each test case try { if (validation != true) { Validate.GetDriverValidation( Utility.GetParameter(Property.DriverString).ToLower()); Property.Status = Validate.validate.ValidationProcess(); if (Property.Status == ExecutionStatus.Fail) { ReportHandler.WriteExceptionLog(new KryptonException("Validation Faild"), 0, "Validation"); return TestSuiteResult; } validation = true; } } catch (Exception exception) { ReportHandler.WriteExceptionLog(new KryptonException(exception.Message), 0, "Validation"); return TestSuiteResult; } #endregion } else { validation = true; } //Added code for focus mouse to origin if (testCaseCnt == 0 && Property.IsRemoteExecution.ToLower().Equals("false")) { Cursor.Position = new Point(0, 0); } _objTestManager = container.Resolve<Manager>(new ResolverOverride[] { new ParameterOverride("testCaseId", TestCases[testCaseCnt].Trim()), new ParameterOverride("testCasefilename", string.Empty) }); //Call InitExecution method to allow manager pass on control //to respective test manager for required settings try { Manager.InitTestCaseExecution(); } catch (Exception e) { Console.WriteLine(e.Message); } #region Fetch OR data ////if OR data is fetched, this step will not execute for each test case DataSet xmlRecoverFromPopupFlow = new DataSet(); DataSet xmlRecoverFromBrowserFlow = new DataSet(); try { if (_orTestData == null) { if (!Path.GetExtension(Utility.GetParameter("ORFileName")).ToLower().Equals(Property.ExcelSheetExtension.ToLower())) Property.ObjectRepositoryFilename = Utility.GetParameter("ORFileName").ToLower() + Property.ExcelSheetExtension; else Property.ObjectRepositoryFilename = Utility.GetParameter("ORFileName").ToLower(); Manager.SetTestFilesLocation(Property.ManagerType); // get ManagerType from property.cs OrData(); //To Fetch object Repository data and set in private global dataset if (testCaseCnt == 0 && !Utility.GetParameter("RunRemoteExecution").ToLower().Equals("true")) { //reading RecoverPopup File. xmlRecoverFromPopupFlow = _objTestManager.GetRecoverFromPopupXml(); xmlRecoverFromBrowserFlow = _objTestManager.GetRecoverFromBrowserXml(); #region Start Exe for Popups handling. try { if (String.Compare(Utility.GetVariable("StartParallelRecovery"), "true", StringComparison.OrdinalIgnoreCase) == 0) { string ext = Path.GetExtension(Property.ParallelRecoverySheetName); if (string.IsNullOrEmpty(ext)) Property.ParallelRecoverySheetName = Property.ParallelRecoverySheetName + Property.ExcelSheetExtension; if (!File.Exists(Path.Combine(Property.RecoverFromPopupFilepath, Property.ParallelRecoverySheetName))) { Console.WriteLine(ConsoleMessages.MSG_PARALLEL_RECOVERY); Console.WriteLine("Please make sure " + Property.ParallelRecoverySheetName + " exist at " + Property.RecoverFromPopupFilepath + " directory."); return TestSuiteResult; } ProcessStartInfo processInfo = new ProcessStartInfo { FileName = Property.ApplicationPath + "KryptonParallelRecovery.exe", CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden, Arguments = "\"" + Property.RecoverFromPopupFilepath + "/" + Property.ParallelRecoverySheetName + "\"" + " " + "\"" + Property.Popup_Sheetname + "\"" + " " + Process.GetCurrentProcess().Id }; Utility.SetProcessParameter("KryptonParallelRecovery.exe"); Process parallelProcess = Process.Start(processInfo); Thread.Sleep(1000); if (parallelProcess.Id == 0 || parallelProcess.HasExited) { Console.WriteLine(Exceptions.ERROR_AUTOIT); Console.WriteLine(Exceptions.ERROR_RECOVERY); return TestSuiteResult; } } } catch (Exception e) { //Please register AutoIt dll Console.WriteLine(Exceptions.ERROR_RECOVERY + e.Message); Console.WriteLine(Exceptions.ERROR_AUTOIT); return TestSuiteResult; } #endregion } } } catch (Exception exception) { ReportHandler.WriteExceptionLog(new KryptonException(exception.Message), 0, Exceptions.ERROR_OBJECTREPOSITORY); return TestSuiteResult; } #endregion if (TestStepAction == null) //so that driver will not initialize every time TestStepAction = new TestDriver.Action(xmlRecoverFromPopupFlow, xmlRecoverFromBrowserFlow, _orTestData); try { DateTime dtNow1 = DateTime.Now; XmlLog.AddTestAttribute("ExecutionStartTime", dtNow1.ToString(Property.Date_Time)); Console.WriteLine(ConsoleMessages.MSG_DASHED); Console.WriteLine("Starting Test Case: " + TestCases[testCaseCnt].Trim()); Console.WriteLine(ConsoleMessages.MSG_DASHED); _failureCount = 0; _stepNos = 0; //initialize the counter Property.EndExecutionFlag = false; ExecuteTestCase(TestCases[testCaseCnt].Trim()); //actual test flow Property.EndExecutionFlag = false; //Shutting down the driver if CloseBrowserOnCompletion is set to true. if (Utility.GetParameter("closebrowseroncompletion").ToLower().Trim().Equals("true") || TestCases.Length > 1) TestStepAction.Do("closeallbrowsers", "", "", "", ""); Console.WriteLine(ConsoleMessages.MSG_DASHED); #region cleanup test flow string[] cleanupCase = _cleanupTestCase.Split(','); string cleanupTestCaseId = string.Empty; if (cleanupCase.Length > 0 && cleanupCase[0].ToLower().Contains("cleanuptestcaseid")) { cleanupTestCaseId = cleanupCase[0].Split('=')[1].Replace("\"", ""); } if (cleanupCase.Length > 1 && cleanupCase[1].ToLower().Contains("data")) { string[] argument = cleanupTestCaseId.Split(Property.Seprator); for (int argCount = 0; argCount < argument.Length; argCount++) { Utility.SetVariable("argument" + (argCount + 1), argument[argCount].Trim()); } } string cleanupTestCaseIteration = null; if (cleanupCase.Length > 2 && cleanupCase[2].ToLower().Contains("iteration")) { cleanupTestCaseIteration = cleanupCase[2].Split('=')[1].Replace("\"", ""); ; } if (cleanupTestCaseId.IsNullOrWhiteSpace() == false) ExecuteTestCase(cleanupTestCaseId, cleanupTestCaseIteration, TestCaseId, "true"); #endregion Console.WriteLine("Ending Test Case: " + TestCases[testCaseCnt].Trim()); Console.WriteLine(ConsoleMessages.MSG_DASHED); XmlLog.AddTestAttribute("RCMachineId", Property.RcMachineId); Utility.ClearRunTimeDic(); //clear run time dictionary and copy parameter dictionary in run time dictionary //Calculate test execution duration TimeSpan tcDurationSpan = (DateTime.Now - dtNow1); TimeSpan tcDuration = new TimeSpan(tcDurationSpan.Hours, tcDurationSpan.Minutes, tcDurationSpan.Seconds); XmlLog.AddTestAttribute("ExecutionDuration", tcDuration.ToString()); Console.WriteLine("Total test execution duration was " + tcDuration); dtNow1 = DateTime.Now; XmlLog.AddTestAttribute("ExecutionEndTime", dtNow1.ToString(Property.Date_Time)); XmlLog.AddTestAttribute("SauceJobUrl", Property.JobUrl); } catch (Exception exception) { ReportHandler.WriteExceptionLog(new KryptonException(exception.Message), _stepNos, "Execute Test Case"); } Console.WriteLine(ConsoleMessages.MSG_DASHED); Console.WriteLine(ConsoleMessages.MSG_EXCECUTION_COMPLETE_LOG); Console.WriteLine(ConsoleMessages.MSG_DASHED); try { //Generation of xml log file.snapshot XmlLog.SaveXmlLog(); //for the last step all the file will upload after generation of html file. if (testCaseCnt < TestCases.Length - 1) Manager.UploadTestExecutionResults(); } catch (Exception ex) { Logwriter.WriteLog("Message:-" + ex.Message + " InnerException:-" + ex.InnerException + " StackTrace:-" + ex.StackTrace); } #region for Angieslist: Batch command to execution on test completion try { string testFinishCommand = Utility.GetVariable("TestCleanupBatch"); testFinishCommand = Utility.ReplaceVariablesInString(testFinishCommand); if (!(testFinishCommand.IsNullOrWhiteSpace())) { testFinishCommand = Path.Combine(Property.ApplicationPath, testFinishCommand); if (File.Exists(testFinishCommand)) { //Create process information and assign data Process setupProcess = new Process { StartInfo = { WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, FileName = testFinishCommand, WorkingDirectory = Property.ApplicationPath, ErrorDialog = false, Arguments = Property.RcProcessId + " " + "\"" + XmlLog.ExecutedXmlPath + "\"" } }; // Start the process setupProcess.Start(); //No need to wait for process to exit setupProcess.WaitForExit(10000); } } } catch (Exception e) { Console.WriteLine(Exceptions.ERROR_CLEANUP + e.Message); } #endregion } //Stoping the IE Popup Thread after execution. ExecuteThread = false; #region Killing all the processes started by Krypton Application during execution. try { string[] procesesToKill = Utility.GetAllProcesses(); foreach (string proc in procesesToKill) { foreach (Process process in Process.GetProcessesByName(proc.Substring(0, proc.LastIndexOf('.')))) { try { process.Kill(); process.WaitForExit(10000); } catch (Exception ex) { Logwriter.WriteLog("Message:-" + ex.Message + " InnerException:-" + ex.InnerException + " StackTrace:-" + ex.StackTrace); } } } } catch (Exception ex) { Logwriter.WriteLog("Message:-" + ex.Message + " InnerException:-" + ex.InnerException + " StackTrace:-" + ex.StackTrace); } #endregion //Shutting down the driver if CloseBrowserOnCompletion is set to true. if (Utility.GetParameter("Browser").Equals(KryptonConstants.BROWSER_FIREFOX, StringComparison.OrdinalIgnoreCase)) { } if (!Utility.GetVariable("RCProcessId").IsNullOrWhiteSpace() && !Utility.GetVariable("RCProcessId").Equals("RCProcessId", StringComparison.OrdinalIgnoreCase)) TestStepAction.Do("shutdowndriver"); //shutdown driver process running in remote TestDriver.Action.SaveScript(); Console.WriteLine(ConsoleMessages.MSG_EXCECUTION_COMPLETED_HTML); //Execution end date and time set dtNow = DateTime.Now; Property.ExecutionEndDateTime = dtNow.ToString(Property.Date_Time); try { ReportHandler.CreateHtmlReportSteps(MLstInputTestCaseIDs); } catch (Exception ex) { Logwriter.WriteLog("Message:-" + ex.Message + " InnerException:-" + ex.InnerException + " StackTrace:-" + ex.StackTrace); return TestSuiteResult; } #region Delete temp folder. /*List Of files that would be deleted here are : 1. Text file for Error message storage that would be generated per test suit.(Size in KB). 2. WebDriver Profile Folder that would be generated per test case.(Size ~ 23MB). */ try { foreach (string file in Property.ListOfFilesInTempFolder) { if (Directory.Exists(file)) { Directory.Delete(file, true); } if (File.Exists(file)) { File.Delete(file); } } } catch (IOException ex) { Logwriter.WriteLog("IO Exception Message:-" + ex.Message + " InnerException:-" + ex.InnerException + " StackTrace:-" + ex.StackTrace); } catch (Exception ex) { Console.WriteLine(Utility.GetCommonMsgVariable("KRYPTONERRCODE0048")); Logwriter.WriteLog("Message:-" + ex.Message + " InnerException:-" + ex.InnerException + " StackTrace:-" + ex.StackTrace); } #endregion Process[] allProcess = Process.GetProcesses(); foreach (Process process in allProcess) { if (process.ProcessName.Equals(KryptonConstants.CHROME_DRIVER, StringComparison.OrdinalIgnoreCase)) { process.Kill(); } if (process.ProcessName.Equals(KryptonConstants.IE_DRIVER, StringComparison.OrdinalIgnoreCase)) { process.Kill(); } } using (StreamWriter sw = new StreamWriter(Property.ErrorLog)) { sw.WriteLine("Task3"); } //Wait for user input at the end of the execution is handled by configuration file if (string.Equals(Utility.GetParameter("EndExecutionWaitRequired"), "false", StringComparison.OrdinalIgnoreCase)) { Array.ForEach(Process.GetProcessesByName("cmd"), x => x.Kill()); } return TestSuiteResult; }