public static HtmlTextWriter AddScreenshots(this HtmlTextWriter writer, TestInformations test, string id = "") { writer.AddAttribute(HtmlTextWriterAttribute.Id, id.Equals("") ? "table-cell" : id); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "20px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); var screens = test.Screenshots.OrderBy(x => x.Date); foreach (var screenshot in screens) { writer.Write("Screenshot (Date: " + screenshot.Date.ToString("dd.MM.yy HH:mm:ss.fff") + "):"); writer.AddAttribute(HtmlTextWriterAttribute.Href, @"./../../Screenshots/" + screenshot.Name); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); writer.AddAttribute(HtmlTextWriterAttribute.Src, @"./../../Screenshots/" + screenshot.Name); writer.AddAttribute(HtmlTextWriterAttribute.Alt, screenshot.Name); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); //IMG writer.RenderEndTag(); //A } if (!screens.Any()) { writer.Write("There are no screenshots in this test"); } writer.RenderEndTag();//DIV return(writer); }
public static HtmlTextWriter AddTestEvents(this HtmlTextWriter writer, TestInformations test, string id = "") { writer.AddAttribute(HtmlTextWriterAttribute.Id, id.Equals("") ? "table-cell" : id); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "20px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); var events = test.Events.OrderBy(x => x.Started); foreach (var testEvent in events) { writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test event: "); writer.Write(testEvent.Name); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.Write(Bullet.HtmlCode + "Started: " + testEvent.Started.ToString("dd.MM.yy HH:mm:ss.fff")); writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.Write(Bullet.HtmlCode + "Finished: " + testEvent.Finished.ToString("dd.MM.yy HH:mm:ss.fff")); writer.RenderEndTag(); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.Write(Bullet.HtmlCode + "Duration: " + testEvent.DurationString); writer.RenderEndTag(); } if (!events.Any()) { writer.Write("There are no test events in this test"); } writer.RenderEndTag();//DIV return(writer); }
public static void Send(List <EmailInformations> mailFromList, List <EmailInformations> targetEmails, TestInformations test, string screenshotsPath, bool addLinks, bool isEventEmail = false, string eventName = "", TestEvent previousRunEvent = null) { foreach (var address in targetEmails) { var fromMails = mailFromList; var success = false; while (!success && fromMails.Any()) { using (var message = new MailMessage { IsBodyHtml = true, Subject = EmailGenerator.GetMailSubject(test, isEventEmail, eventName), Body = EmailGenerator.GetMailBody(test, addLinks, isEventEmail, eventName, previousRunEvent) }) { var attachments = EmailGenerator.GetAttachmentsFromScreenshots(test, screenshotsPath); message.AddAttachments(attachments); success = SingleSend(fromMails.First(), address, message); if (!success) { fromMails = fromMails.Skip(1).ToList(); } } } } }
public static List <Attachment> GetAttachmentsFromScreenshots(TestInformations test, string screenshotsPath) { return(test.Screenshots.Select( screenshot => new Attachment(Path.Combine(screenshotsPath, screenshot.Name)) { ContentId = screenshot.Name }) .ToList()); }
public static HtmlTextWriter AddTestHistory(this HtmlTextWriter writer, TestInformations test, string id = "") { writer.AddAttribute(HtmlTextWriterAttribute.Id, id.Equals("") ? "table-cell" : id); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "20px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddAttribute(HtmlTextWriterAttribute.Id, Output.GetHistoryChartId(test.Guid, test.DateTimeFinish)); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.RenderEndTag(); //DIV writer.RenderEndTag(); //DIV return(writer); }
public void AfterTest(ITest test) { lock (_syncRoot) { _finish = DateTime.Now; _guid = _guid.Equals(Guid.Empty) ? (Report.TestGuid.Equals(Guid.Empty) ? GuidConverter.ToMd5HashGuid(test.FullName) : Report.TestGuid) : _guid; _testOutput = TestContext.Out.ToString(); _testName = _testName.Equals("") ? Report.TestName : _testName; var context = TestContext.CurrentContext; var relativeTestHref = "Attachments" + @"/" + _guid + @"/" + Output.Files.GetTestHtmlName(_finish); _test = new TestInformations { DateTimeStart = _start, DateTimeFinish = _finish, TestDuration = (_finish - _start).TotalSeconds, FullName = test.FullName, ProjectName = _projectName.Equals("") ? test.FullName.Split('.').First() : _projectName, ClassName = _className.Equals("") ? test.FullName.Split('.').Skip(1).First() : _className, Name = _testName.Equals("") ? test.Name : _testName, TestStackTrace = context.Result.StackTrace ?? "", TestMessage = context.Result.Message ?? "", Result = context.Result.Outcome?.ToString() ?? "Unknown", Guid = _guid, HasOutput = !_testOutput.Equals(string.Empty), AttachmentsPath = _attachmentsPath + _guid + @"\", TestHrefRelative = relativeTestHref, TestHrefAbsolute = _configuration.ServerLink + relativeTestHref, Events = Report.GetEvents() }; TakeScreenshotIfFailed(); AddScreenshots(); CleanUpTestFiles(); SaveTestFiles(); SendEmails(_test.IsSuccess()); SendEmailsForEvents(); GenerateReport(); Flush(); } }
public static HtmlTextWriter AddOutput(this HtmlTextWriter writer, TestInformations test, string testOutput, string id = "") { writer.AddAttribute(HtmlTextWriterAttribute.Id, id.Equals("") ? "table-cell" : id); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "20px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); if (test.HasOutput) { writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test output: "); writer.Write(NunitTestHtml.GenerateTxtView(testOutput)); writer.RenderEndTag(); //P } else { writer.Write("Test output is empty"); } writer.RenderEndTag();//DIV return(writer); }
public static string GetMailSubject(TestInformations test, bool isEventEmail = false, string eventName = "") { if (isEventEmail) { return(string.Format("Test '{0}' has wrong event duration! Event '{1}'", test.Name, test.Events.First(x => x.Name.Equals(eventName)).Name)); } return(test.IsSuccess() ? string.Format("Test '{0}' was finished successfully", test.Name) : (test.IsFailed() ? string.Format("Test '{0}' was failed", test.Name) : (test.IsBroken() ? string.Format("Test '{0}' was broken", test.Name) : (test.IsIgnored() ? string.Format("Test '{0}' was ignored", test.Name) : (test.IsInconclusive() ? string.Format("Test '{0}' is inconclusive", test.Name) : string.Format("Test '{0}' was not successfully finished", test.Name)))))); }
public static void DeleteTestFiles(this TestInformations test, string screenshotsPath) { try { var finishDate = test.DateTimeFinish; var scriptPath = Path.Combine(test.AttachmentsPath, Output.Files.GetTestHistoryScriptName(finishDate)); var htmlPath = Path.Combine(test.AttachmentsPath, Output.Files.GetTestHtmlName(finishDate)); var xmlPath = Path.Combine(test.AttachmentsPath, Output.Files.GetTestXmlName(finishDate)); File.Delete(scriptPath); File.Delete(htmlPath); File.Delete(xmlPath); foreach (var screenshot in test.Screenshots) { File.Delete(Path.Combine(screenshotsPath, screenshot.Name)); } } catch (Exception ex) { InternalLogs.Exception(ex, "Exception in CleanUpTestFiles"); } }
public static HtmlTextWriter AddTestResult(this HtmlTextWriter writer, TestInformations test, string id = "") { writer.AddAttribute(HtmlTextWriterAttribute.Id, id.Equals("") ? "table-cell" : id); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "20px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test full name: "); writer.Write(test.FullName); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test name: "); writer.Write(test.Name); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test duration: "); writer.Write(TimeSpan.FromSeconds(test.TestDuration).ToString(@"hh\:mm\:ss\:fff")); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Time period: "); var start = test.DateTimeStart.ToString("dd.MM.yy HH:mm:ss.fff"); var end = test.DateTimeFinish.ToString("dd.MM.yy HH:mm:ss.fff"); writer.Write(start + " - " + end); writer.RenderEndTag(); //P writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, test.GetColor()); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.RenderBeginTag(HtmlTextWriterTag.B); writer.Write("Test result: "); writer.RenderEndTag(); //B writer.Write(test.Result); writer.RenderEndTag(); //P writer.RenderEndTag(); //DIV return(writer); }
public static void GenerateTestPage(this TestInformations test, string fullPath, string testOutput, string chartFile) { try { const string script = @" $(document).ready(function() { $("".tabs-menu a"").click(function(event) { event.preventDefault(); $(this).parent().addClass(""current""); $(this).parent().siblings().removeClass(""current""); var tab = $(this).attr(""href""); $("".tab-content"").not(tab).css(""display"", ""none""); $(tab).fadeIn(); }); }); " ; var htmlTest = new NunitTestHtml(test, testOutput); var page = new HtmlPage("Test page") { PageStylePaths = new List <string> { "./../../" + Output.Files.ReportStyleFile, "./../../" + Output.Files.PrimerStyleFile }, PageScriptString = script, ScriptFilePaths = new List <string> { "./../../" + Output.Files.JQueryScriptFile, Output.Files.HighstockScriptFile, chartFile }, PageBodyCode = htmlTest.HtmlCode }; page.SavePage(fullPath); } catch (Exception ex) { InternalLogs.Exception(ex, "Exception while generating test html page"); } }
public static HtmlTextWriter AddFailure(this HtmlTextWriter writer, TestInformations test, string id = "") { writer.AddAttribute(HtmlTextWriterAttribute.Id, id.Equals("") ? "table-cell" : id); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "20px"); writer.RenderBeginTag(HtmlTextWriterTag.Div); if (!test.IsSuccess()) { writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Message: "); writer.Write(NunitTestHtml.GenerateTxtView(test.TestMessage)); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Stack trace: "); writer.Write(NunitTestHtml.GenerateTxtView(test.TestStackTrace)); writer.RenderEndTag(); //P } else { writer.Write("Test was successful, there is no failure message"); } writer.RenderEndTag();//DIV return(writer); }
private void Flush() { _guid = Guid.Empty; _test = new TestInformations(); Report.TearDown(); }
public static void SaveAsXml(this TestInformations test, string fullPath) { test.Save(fullPath); }
public NunitTestHtml(TestInformations test, string testOutput = "") { Style = GetStyle(); ResultColor = test.GetColor(); var strWr = new StringWriter(); using (var writer = new HtmlTextWriter(strWr)) { writer.AddStyleAttribute(HtmlTextWriterStyle.Left, "0%"); writer.AddAttribute(HtmlTextWriterAttribute.Class, "test-window"); writer.AddAttribute(HtmlTextWriterAttribute.Title, Title); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.WithAttr(HtmlTextWriterAttribute.Id, Id) .Tag(HtmlTextWriterTag.Div, () => writer .Css(HtmlTextWriterStyle.TextAlign, "center") .Css(HtmlTextWriterStyle.BackgroundColor, ReportColors.TestBorderColor) .Css("padding", "20px") .Css("margin", "0") .CssShadow("0 0 20px -5px black") .Tag(HtmlTextWriterTag.H2, () => writer .Text($"{test.Name}. Result: ") .Css("padding", "10px") .Css(HtmlTextWriterStyle.BackgroundColor, ResultColor) .Tag(HtmlTextWriterTag.Span, test.Result)) .Css("float", "right") .Css("padding", "10px") .Tag(HtmlTextWriterTag.Div, () => writer .DangerButton("Back", "./../../" + Output.Files.TestListFile)) .Css("table-layout", "fixed") .Css("word-break", "break-all") .Css(HtmlTextWriterStyle.Width, "100%") .Css(HtmlTextWriterStyle.BackgroundColor, ReportColors.BodyBackground) .Css("border-spacing", "0") .CssShadow("0 0 20px 0 " + ReportColors.TestBorderColor) .Tag(HtmlTextWriterTag.Table, () => writer .Css(HtmlTextWriterStyle.Width, "50%") .Tag(HtmlTextWriterTag.Col) .Css(HtmlTextWriterStyle.Width, "50%") .Tag(HtmlTextWriterTag.Col) .Tag(HtmlTextWriterTag.Tr, () => writer .Css(HtmlTextWriterStyle.Width, "50%") .Css(HtmlTextWriterStyle.BackgroundColor, ReportColors.White) .Tag(HtmlTextWriterTag.Td, () => writer .AddTestResult(test)) .Css(HtmlTextWriterStyle.Width, "50%") .Css(HtmlTextWriterStyle.BackgroundColor, ReportColors.White) .Tag(HtmlTextWriterTag.Td, () => writer .AddTestHistory(test)) )) .WithAttr(HtmlTextWriterAttribute.Id, "tabs-container") .Tag(HtmlTextWriterTag.Div, () => writer .WithAttr(HtmlTextWriterAttribute.Class, "tabs-menu") .Tag(HtmlTextWriterTag.Ul, () => writer .WithAttr(HtmlTextWriterAttribute.Class, "current") .Tag(HtmlTextWriterTag.Li, () => writer .WithAttr(HtmlTextWriterAttribute.Href, "#test-screenshots-href") .Tag(HtmlTextWriterTag.A, "Screenshots")) .Tag(HtmlTextWriterTag.Li, () => writer .WithAttr(HtmlTextWriterAttribute.Href, "#test-failure-href") .Tag(HtmlTextWriterTag.A, "Failure")) .Tag(HtmlTextWriterTag.Li, () => writer .WithAttr(HtmlTextWriterAttribute.Href, "#test-environment-href") .Tag(HtmlTextWriterTag.A, "Test environment")) .Tag(HtmlTextWriterTag.Li, () => writer .WithAttr(HtmlTextWriterAttribute.Href, "#test-output-href") .Tag(HtmlTextWriterTag.A, "Output")) .Tag(HtmlTextWriterTag.Li, () => writer .WithAttr(HtmlTextWriterAttribute.Href, "#test-events-href") .Tag(HtmlTextWriterTag.A, "Test events")) ) .WithAttr(HtmlTextWriterAttribute.Class, "test-tab") .Tag(HtmlTextWriterTag.Div, () => writer .WithAttr(HtmlTextWriterAttribute.Id, "test-screenshots-href") .WithAttr(HtmlTextWriterAttribute.Class, "tab-content") .Tag(HtmlTextWriterTag.Div, () => writer .AddScreenshots(test)) .WithAttr(HtmlTextWriterAttribute.Id, "test-failure-href") .WithAttr(HtmlTextWriterAttribute.Class, "tab-content") .Tag(HtmlTextWriterTag.Div, () => writer .AddFailure(test)) .WithAttr(HtmlTextWriterAttribute.Id, "test-environment-href") .WithAttr(HtmlTextWriterAttribute.Class, "tab-content") .Tag(HtmlTextWriterTag.Div, () => writer .AddEnvironment()) .WithAttr(HtmlTextWriterAttribute.Id, "test-output-href") .WithAttr(HtmlTextWriterAttribute.Class, "tab-content") .Tag(HtmlTextWriterTag.Div, () => writer .AddOutput(test, testOutput)) .WithAttr(HtmlTextWriterAttribute.Id, "test-events-href") .WithAttr(HtmlTextWriterAttribute.Class, "tab-content") .Tag(HtmlTextWriterTag.Div, () => writer .AddTestEvents(test))) ) ); writer.RenderEndTag(); //DIV } HtmlCode = strWr.ToString(); }
public static string GetMailBody(TestInformations test, bool addLinks, bool isEventEmail = false, string eventName = "", TestEvent previousRunEvent = null) { var strWr = new StringWriter(); using (var writer = new HtmlTextWriter(strWr)) { writer.Write("<!DOCTYPE html>"); writer.Write(Environment.NewLine); writer.RenderBeginTag(HtmlTextWriterTag.Head); writer.Tag(HtmlTextWriterTag.Meta, new Dictionary <string, string> { { "http-equiv", "X-UA-Compatible" }, { "content", @"IE=edge" }, { "charset", "utf-8" } }); writer.Tag(HtmlTextWriterTag.Title, "Automation Email"); writer.Tag(HtmlTextWriterTag.Style, new Dictionary <HtmlTextWriterAttribute, string> { { HtmlTextWriterAttribute.Type, @"text/css" } }); writer.Tag(HtmlTextWriterTag.Link, new Dictionary <HtmlTextWriterAttribute, string> { { HtmlTextWriterAttribute.Rel, @"stylesheet" }, { HtmlTextWriterAttribute.Type, @"text/css" } }); writer.RenderEndTag(); //HEAD writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, ReportColors.White); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "10px"); writer.AddStyleAttribute("border", "10px solid " + ReportColors.TestBorderColor); writer.AddStyleAttribute(HtmlTextWriterStyle.Margin, "0px"); writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%"); writer.AddStyleAttribute(HtmlTextWriterStyle.FontFamily, "Tahoma,Verdana,Segoe,sans-serif"); writer.RenderBeginTag(HtmlTextWriterTag.Body); writer.AddStyleAttribute("box-sizing", "border-box"); writer.AddStyleAttribute(HtmlTextWriterStyle.Overflow, "auto"); writer.AddStyleAttribute(HtmlTextWriterStyle.Top, "0%"); writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "100%"); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "10px"); writer.AddAttribute(HtmlTextWriterAttribute.Class, "test-window"); writer.AddAttribute(HtmlTextWriterAttribute.Title, "Test"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddStyleAttribute(HtmlTextWriterStyle.Padding, "10px"); writer.AddAttribute(HtmlTextWriterAttribute.Id, test.Guid.ToString()); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test full name: "); writer.Write(test.FullName); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test name: "); writer.Write(test.Name); writer.RenderEndTag(); //P if (isEventEmail && previousRunEvent != null) { var currentEvent = test.Events.First(x => x.Name.Equals(eventName)); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Event name: "); writer.Write(currentEvent.Name); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, string.Format("Current duration (event finished at {0}): ", currentEvent.Finished)); writer.Write(TimeSpan.FromSeconds(currentEvent.Duration).ToString(@"hh\:mm\:ss\:fff")); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, string.Format("Previous duration (event finished at {0}): ", previousRunEvent.Finished)); writer.Write(TimeSpan.FromSeconds(previousRunEvent.Duration).ToString(@"hh\:mm\:ss\:fff")); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Difference: "); writer.Write(TimeSpan.FromSeconds(currentEvent.Duration - previousRunEvent.Duration).ToString(@"hh\:mm\:ss\:fff")); writer.RenderEndTag(); //P } writer.AddStyleAttribute(HtmlTextWriterStyle.BackgroundColor, test.GetColor()); writer.RenderBeginTag(HtmlTextWriterTag.P); writer.RenderBeginTag(HtmlTextWriterTag.B); writer.Write("Test result: "); writer.RenderEndTag(); //B writer.Write(test.Result); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test duration: "); writer.Write(TimeSpan.FromSeconds(test.TestDuration).ToString(@"hh\:mm\:ss\:fff")); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Time period: "); var start = test.DateTimeStart.ToString("dd.MM.yy HH:mm:ss.fff"); var end = test.DateTimeFinish.ToString("dd.MM.yy HH:mm:ss.fff"); writer.Write(start + " - " + end); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Screenshots: "); writer.Write(test.Screenshots.Count); writer.RenderEndTag(); //P var screens = test.Screenshots.OrderBy(x => x.Date); foreach (var screenshot in screens) { writer.Write("Screenshot (Date: " + screenshot.Date.ToString("dd.MM.yy HH:mm:ss.fff") + "):"); writer.RenderBeginTag(HtmlTextWriterTag.Div); writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "inherited"); writer.AddAttribute(HtmlTextWriterAttribute.Src, @"cid:" + screenshot.Name); writer.AddAttribute(HtmlTextWriterAttribute.Alt, screenshot.Name); writer.RenderBeginTag(HtmlTextWriterTag.Img); writer.RenderEndTag(); //IMG writer.RenderEndTag(); //DIV } if (!test.IsSuccess()) { writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Stack trace: "); writer.Write(NunitTestHtml.GenerateTxtView(test.TestStackTrace)); writer.RenderEndTag(); //P writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Message: "); writer.Write(NunitTestHtml.GenerateTxtView(test.TestMessage)); writer.RenderEndTag(); //P } if (addLinks) { writer.RenderBeginTag(HtmlTextWriterTag.P); writer.AddTag(HtmlTextWriterTag.B, "Test page: "); writer.AddStyleAttribute("background", ReportColors.OpenLogsButtonBackground); writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "100%"); writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "black"); writer.AddStyleAttribute(HtmlTextWriterStyle.TextDecoration, "none !important"); writer.AddAttribute(HtmlTextWriterAttribute.Href, test.TestHrefAbsolute); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.Write(Environment.NewLine + "View on site"); writer.RenderEndTag(); //A writer.RenderEndTag(); //P } writer.RenderEndTag(); //DIV writer.RenderEndTag(); //DIV writer.RenderEndTag(); //BODY writer.Write(Environment.NewLine); writer.Write("</html>"); writer.Write(Environment.NewLine); } return(strWr.ToString()); }