();
+ var browser = Config.GetConfigValue("Browser", "null");
+ var caps = Config.GetConfigValue("BrowserCapabilities", "null");
+ if (browser != "null")
+ {
+ hosts.Add(new BrowserInfo(WebDriverBrowser.getBrowserFromString(browser), caps));
+ }
+ for (var i = 1; i < 10; i++)
+ {
+ browser = Config.GetConfigValue("Browser" + i, "null");
+ if (browser != "null")
+ {
+ caps = Config.GetConfigValue("Browser" + i + "Capabilities", "null");
+ hosts.Add(new BrowserInfo(WebDriverBrowser.getBrowserFromString(browser), caps));
+ }
+ }
+ if (hosts.Count == 0)
+ {
+ hosts.Add(new BrowserInfo(WebDriverBrowser.Browser.Chrome));
+ }
+ return hosts;
+ }
+
+
+ }
+
+ ///
+ /// settings for TestStack.White module
+ ///
+ public class PurpleSettings
+ {
+ public string appPath;
+ public string DataSetPath1;
+ public string DataSetPath2;
+ public string DataSetPath3;
+ public string DataSetPath4;
+ public bool launchApp;
+ public string Machine1;
+ public string Machine2;
+ public string Machine3;
+ public string Machine4;
+ public string ProcessName;
+ public string ProjectName1;
+ public string ProjectName2;
+ public string ProjectName3;
+ public string ProjectName4;
+ public string Purple_blankValue;
+ public string Purple_Delimiter;
+ public int Purple_ElementTimeoutWaitSeconds;
+ public string Purple_ValueDelimiterEnd;
+ public string Purple_ValueDelimiterStart;
+ public string Purple_windowTitle;
+
+ public PurpleSettings()
+ {
+ appPath = Config.GetConfigValue("AppPath", "NOT_SET");
+ launchApp = Config.GetConfigValueAsBool("LaunchApp", "True");
+ ProcessName = Config.GetConfigValue("ProcessName", "NOT SET");
+ Purple_windowTitle = Config.GetConfigValue("Purple_WindowTitle", "EMPTY");
+ Purple_blankValue = Config.GetConfigValue("Purple_BlankValue", "!BLANK!");
+ Purple_Delimiter = Config.GetConfigValue("Purple_Delimiter", "/");
+ Purple_ValueDelimiterStart = Config.GetConfigValue("Purple_ValueDelimiterStart", "[");
+ Purple_ValueDelimiterEnd = Config.GetConfigValue("Purple_ValueDelimiterEnd", "]");
+ Purple_ElementTimeoutWaitSeconds = Config.GetConfigValueAsInt("Purple_ElementWaitTimeOutSeconds", "0");
+ Machine1 = Config.GetConfigValue("Machine1", "NOT_SET");
+ Machine2 = Config.GetConfigValue("Machine2", "NOT_SET");
+ Machine3 = Config.GetConfigValue("Machine3", "NOT_SET");
+ Machine4 = Config.GetConfigValue("Machine4", "NOT_SET");
+ DataSetPath1 = Config.GetConfigValue("DS1", "NOT_SET");
+ DataSetPath2 = Config.GetConfigValue("DS2", "NOT_SET");
+ DataSetPath3 = Config.GetConfigValue("DS3", "NOT_SET");
+ DataSetPath4 = Config.GetConfigValue("DS4", "NOT_SET");
+ ProjectName1 = Config.GetConfigValue("PrjName1", "NOT SET");
+ ProjectName2 = Config.GetConfigValue("PrjName2", "NOT SET");
+ ProjectName3 = Config.GetConfigValue("PrjName3", "NOT SET");
+ ProjectName4 = Config.GetConfigValue("PrjName4", "NOT SET");
+ }
+ }
+
+ public class BrowserStackSettings
+ {
+ public string BrowserStack_Key;
+ public string BrowserStack_OS;
+ public string BrowserStack_OS_Version;
+ public string BrowserStack_User;
+ public string BrowserStackRemoteURL;
+
+ public BrowserStackSettings()
+ {
+ BrowserStack_User = Config.GetConfigValue("BrowserStack_User", null);
+ BrowserStack_Key = Config.GetConfigValue("BrowserStack_Key", null);
+ BrowserStack_OS = Config.GetConfigValue("BrowserStack_OS", null);
+ BrowserStack_OS_Version = Config.GetConfigValue("BrowserStack_OS_Version", null);
+ BrowserStackRemoteURL = Config.GetConfigValue("BrowserStackRemoteURL", "hub.browserstack.com");
+ }
+ }
+
+ public class SauceLabsSettings
+ {
+ public string SauceLabsAPIKey;
+ public string SauceLabsUrl;
+ public string SauceLabsUsername;
+ public string ScreenResolution;
+ public bool UseSauceLabs;
+
+ public SauceLabsSettings()
+ {
+ UseSauceLabs = Config.GetConfigValueAsBool("UseSauceLabs", "False");
+ SauceLabsUrl = Config.GetConfigValue("SauceLabsUrl", "http://ondemand.saucelabs.com/wd/hub");
+ SauceLabsUsername = Config.GetConfigValue("SauceLabsUsername", "NOT_SET");
+ SauceLabsAPIKey = Config.GetConfigValue("SauceLabsAPIKey", "NOT_SET");
+ ScreenResolution = Config.GetConfigValue("ScreenResolution", "1280x1024");
+ }
+ }
+
+ public class BrowserSettings
+ {
+ public string UserAgent;
+
+ public BrowserSettings()
+ {
+ UserAgent = Config.GetConfigValue("UserAgent", "");
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Core/CurrentProcessInfo.cs b/Core/CurrentProcessInfo.cs
new file mode 100644
index 0000000..aaa764e
--- /dev/null
+++ b/Core/CurrentProcessInfo.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Diagnostics;
+using System.Linq;
+
+namespace Golem.Core
+{
+ public class CurrentProcessInfo
+ {
+ private readonly Type commandInterface;
+ private readonly string formatString = "{0}.{1}()_{2}.{3}() : ";
+ private readonly Type pageObjectType;
+ public string className = "";
+ public string commandName = "";
+ public string elementName = "";
+ public string methodName = "";
+
+ public CurrentProcessInfo(Type pageObjectType, Type commandInterface)
+ {
+ this.pageObjectType = pageObjectType;
+ this.commandInterface = commandInterface;
+ Init();
+ }
+
+ public string GetString()
+ {
+ return string.Format(formatString, className, methodName, elementName, commandName);
+ }
+
+ private void Init()
+ {
+ var stackTrace = new StackTrace();
+ var stackFrames = stackTrace.GetFrames();
+ foreach (var stackFrame in stackFrames)
+ {
+ var method = stackFrame.GetMethod();
+ var type = stackFrame.GetMethod().ReflectedType;
+ if ((type.BaseType == pageObjectType) && (!stackFrame.GetMethod().IsConstructor))
+ {
+ className = type.Name;
+ methodName = stackFrame.GetMethod().Name;
+ }
+ if (type.GetInterfaces().Contains(commandInterface))
+ {
+ commandName = stackFrame.GetMethod().Name;
+ elementName = type.Name;
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Core/HtmlReportGenerator.cs b/Core/HtmlReportGenerator.cs
new file mode 100644
index 0000000..e38fce0
--- /dev/null
+++ b/Core/HtmlReportGenerator.cs
@@ -0,0 +1,464 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.Drawing.Imaging;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Web.UI;
+using NUnit.Framework;
+using NUnit.Framework.Interfaces;
+using ResultState = NUnit.Framework.Interfaces.ResultState;
+
+namespace Golem.Core
+{
+ public class HtmlReportGenerator
+ {
+ public StringWriter stringWriter;
+ public HtmlTextWriter htmlTextWriter;
+
+ public HtmlReportGenerator()
+ {
+ this.stringWriter = new StringWriter();
+ this.htmlTextWriter = new HtmlTextWriter(stringWriter);
+
+ }
+
+ public string ConvertPathToRelative(string path)
+ {
+ path = path.Replace("file:///", "");
+
+ var reportpath = Config.settings.reportSettings.reportPath;
+ var relative_path = path.Replace(reportpath, "").Replace(reportpath.Replace("\\", "/"), "");
+
+ if (relative_path.StartsWith("\\"))
+ {
+ relative_path = relative_path.Replace("\\", "/");
+ }
+
+ return "." + relative_path;
+ }
+
+ public void GenerateHtml()
+ {
+ GenerateStartTags();
+ GenerateSuiteBody();
+ GenerateEndTags();
+ }
+
+ public void WriteToFile()
+ {
+ var path = $"{Config.settings.reportSettings.reportPath}\\{Common.GetCurrentTestName()}.html".Replace("\\", "/");
+ var fullPath = Path.GetFullPath(path).Replace("\\", "/");
+ var css_path = $"{Common.GetCodeDirectory()}\\dashboard.css";
+ var final_path = $"{Config.settings.reportSettings.reportPath}\\dashboard.css";
+
+ if (!File.Exists(Path.GetFullPath(final_path)))
+ {
+ File.Copy(css_path, Path.GetFullPath(final_path));
+ }
+
+ var teamcity = Environment.GetEnvironmentVariable("TEAMCITY_VERSION");
+ if (teamcity != null)
+ {
+ TestContext.WriteLine("url(file:///" + fullPath + ")");
+ }
+ else
+ {
+ TestContext.WriteLine(@"file:///" + fullPath);
+ }
+
+ File.WriteAllText(fullPath, this.stringWriter.ToString());
+ TestBase.testData.ReportPath = fullPath;
+ }
+
+ public void GenerateStartTags()
+ {
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine(" ");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("Test Dashboard");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("");
+ // this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteBeginTag("body");
+ }
+
+ public void GenerateSuiteHeader(string name)
+ {
+ this.htmlTextWriter.WriteLine("");
+ }
+
+ public void GenerateSuiteFooter()
+ {
+ this.htmlTextWriter.WriteLine("
");
+ }
+
+ public void GenerateLogHeader()
+ {
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "table-responsive");
+ this.htmlTextWriter.RenderBeginTag("div");
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "table table-striped log-table");
+ this.htmlTextWriter.RenderBeginTag("table");
+
+ this.htmlTextWriter.RenderBeginTag("thead");
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-timestamp");
+ this.htmlTextWriter.RenderBeginTag("th");
+ this.htmlTextWriter.Write("Timestamp");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-text");
+ this.htmlTextWriter.RenderBeginTag("th");
+ this.htmlTextWriter.Write("Text");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("tbody");
+
+ }
+
+ public void GenerateIndexHead()
+ {
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "sub-header");
+ this.htmlTextWriter.RenderBeginTag("h2");
+ this.htmlTextWriter.Write("Index");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "table-responsive");
+ this.htmlTextWriter.RenderBeginTag("div");
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "table table-striped log-table");
+ this.htmlTextWriter.RenderBeginTag("table");
+
+ this.htmlTextWriter.RenderBeginTag("thead");
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("Name");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("Status");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("tbody");
+
+ }
+
+ public void GenerateIndexRow(string name, string url, string status, string message)
+ {
+ if (Config.settings.reportSettings.relativePath)
+ {
+ url = ConvertPathToRelative(url);
+ }
+
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Href, url);
+ this.htmlTextWriter.RenderBeginTag("a");
+
+ this.htmlTextWriter.Write(name);
+ this.htmlTextWriter.RenderEndTag(); //a
+ this.htmlTextWriter.RenderEndTag(); //td
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write(status);
+ this.htmlTextWriter.RenderEndTag(); //td
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write(message);
+ this.htmlTextWriter.RenderEndTag(); //td
+
+ this.htmlTextWriter.RenderEndTag(); //tr
+ }
+
+ public void GenerateLogStatus(string statusMessage, string exceptionMessage, string stackTrace, string screenshotPath, string videoPath)
+ {
+ screenshotPath = ConvertPathToRelative(screenshotPath);
+ videoPath = ConvertPathToRelative(videoPath);
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-status");
+ this.htmlTextWriter.RenderBeginTag("div");
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "status");
+ this.htmlTextWriter.RenderBeginTag("div");
+ this.htmlTextWriter.RenderBeginTag("h2");
+ this.htmlTextWriter.Write($"{TestBase.testData.ClassName} {TestBase.testData.MethodName} {TestBase.testData.Status}");
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "exception-message");
+ this.htmlTextWriter.RenderBeginTag("div");
+ this.htmlTextWriter.Write(this.escape_text(exceptionMessage));
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "exception-stacktrace");
+ this.htmlTextWriter.RenderBeginTag("div");
+ this.htmlTextWriter.Write(this.escape_text(stackTrace));
+ this.htmlTextWriter.RenderEndTag();
+
+ if (TestBase.testData.Result.Outcome.Status != TestStatus.Passed)
+ {
+ this.htmlTextWriter.RenderBeginTag("div");
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "screenshot");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Src, screenshotPath);
+ this.htmlTextWriter.RenderBeginTag("img");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ }
+
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Href, videoPath);
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-video");
+ this.htmlTextWriter.RenderBeginTag("a");
+ this.htmlTextWriter.WriteLine("Video.flv");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+
+ }
+
+ public void GenerateLogEnd()
+ {
+ this.htmlTextWriter.RenderEndTag();//tbody
+ this.htmlTextWriter.RenderEndTag();//table
+ this.htmlTextWriter.RenderEndTag();//div
+ }
+
+ public string escape_text(string text)
+ {
+ try
+ {
+ return text.Replace("<", "<").Replace(">", ">");
+ }
+ catch (Exception)
+ {
+ return "";
+ }
+
+ }
+
+ public void GenerateLogMessage(string timestamp, string value)
+ {
+ GenerateLogRow(timestamp,value);
+ }
+
+ public void GenerateLogError(string timestamp, string value)
+ {
+ GenerateLogRow(timestamp, value,"error");
+ }
+
+ public void GenerateLogWarning(string timestamp, string value)
+ {
+ GenerateLogRow(timestamp, value, "warning");
+ }
+
+ public void GenerateLogRow(string timestamp, string value, string type="message")
+ {
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-" + type);
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.RenderBeginTag("div");
+ this.htmlTextWriter.Write(timestamp);
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write(this.escape_text(value));
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ }
+
+ public void GenerateLogImage(string timestamp, string path)
+ {
+ path = ConvertPathToRelative(path);
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write(timestamp);
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-image");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Width, "75%");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Src, path);
+ this.htmlTextWriter.RenderBeginTag(HtmlTextWriterTag.Img);
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ }
+
+ public void GenerateLogVideo(string timestamp, string path)
+ {
+ path = ConvertPathToRelative(path);
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write(timestamp);
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Href, path);
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-video");
+ this.htmlTextWriter.RenderBeginTag("a");
+ this.htmlTextWriter.WriteLine("Video.flv");
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ }
+
+ public void GenerateLogLink(string timestamp, string path)
+ {
+ path = ConvertPathToRelative(path);
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write(timestamp);
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "log-link");
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Href, path);
+ this.htmlTextWriter.RenderBeginTag("a");
+ this.htmlTextWriter.WriteLine(path);
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ }
+
+
+ public void GenerateSuiteBody()
+ {
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "sub-header");
+ this.htmlTextWriter.RenderBeginTag("h2");
+ this.htmlTextWriter.Write("Log");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "table-responsive");
+ this.htmlTextWriter.RenderBeginTag("div");
+
+
+ this.htmlTextWriter.AddAttribute(HtmlTextWriterAttribute.Class, "table table-striped");
+ this.htmlTextWriter.RenderBeginTag("table");
+
+ this.htmlTextWriter.RenderBeginTag("thead");
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("#");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("Name");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("Status");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("Pass/Fail");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("tbody");
+ this.htmlTextWriter.RenderBeginTag("tr");
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("1");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("TestClass1");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("Pass");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderBeginTag("td");
+ this.htmlTextWriter.Write("10/10");
+ this.htmlTextWriter.RenderEndTag();
+
+ this.htmlTextWriter.RenderEndTag();//tr
+ this.htmlTextWriter.RenderEndTag();//tbody
+
+ this.htmlTextWriter.RenderEndTag();//table
+ this.htmlTextWriter.RenderEndTag();//div
+ }
+
+ public void GenerateEndTags()
+ {
+ this.htmlTextWriter.WriteLine("");
+ // this.htmlTextWriter.WriteLine("') ");
+ this.htmlTextWriter.WriteLine("");
+ // this.htmlTextWriter.WriteLine("");
+ // this.htmlTextWriter.WriteLine("");
+ this.htmlTextWriter.WriteLine("