public async Task <Check> CheckCategoryInfo(CheckSettings settings) { var result = new Check { Settings = settings }; result.State.LastCheckTime = DateTime.Now; var requestTimeout = TimeSpan.FromSeconds(45); string address = new EnvironmentHelper().GetEnvironmentUrl(settings.EnvironmentId) + "/category/kolenval-i-komplektuyushhie-id53-3"; try { var warningThreshold = 3; var errors = new List <string>(); var startTime = DateTime.Now; var htmlResult = await _httpService.GetHtmlStructureAsGoogleBotDesktop(address, requestTimeout); var endTime = DateTime.Now; var breadcrumbs = htmlResult.FindNodesByName("autodoc-breadcrumbs").FirstOrDefault(); if (breadcrumbs == null) { errors.Add("breadcrumbs element not found"); } var breadcumbStrings = new List <string> { "href=\"/\"", //home "href=\"/category/dvigatel-sistemy-i-komponenty-id1-3\"", //Двигатель, системы и компоненты "href=\"/category/blok-porshnevaya-gruppa-id8-3\"", //Блок, поршневая группа }; var missingCrumbs = new List <string>() as IEnumerable <string>; if (breadcrumbs != null && !breadcrumbs.InnerHtml.ContainsAll(breadcumbStrings, out missingCrumbs)) { errors.Add("Following breadcrumbs aren't found: " + string.Join(", ", missingCrumbs)); } var subcategoriesMenu = htmlResult.FindNodesByName("catalog-subs").FirstOrDefault(); if (subcategoriesMenu == null) { errors.Add("catalog subcategories menu element not found"); } var subcategoryItems = new List <string> { "href=\"/category/kolenval-id126-3\"", "href=\"/category/podshipnik-kolenvala-id127-3\"" }; var missingSubcategories = new List <string>() as IEnumerable <string>; if (subcategoriesMenu != null && !subcategoriesMenu.InnerHtml.ContainsAll(subcategoryItems, out missingSubcategories)) { errors.Add("Following subcategories aren't found: " + string.Join(", ", missingSubcategories)); } var paging = htmlResult.FindNodesByName("seo-paging").FirstOrDefault(); if (paging == null) { errors.Add("paging element not found"); } var pageTwoElementCode = "href=\"/category/kolenval-i-komplektuyushhie-id53-3?page=2"; if (paging != null && !paging.InnerHtml.Contains(pageTwoElementCode)) { errors.Add("paging doesn't contain page 2"); } var carFiltersPanel = htmlResult.FindNodesByName("car-filter-panel").FirstOrDefault(); if (carFiltersPanel == null) { errors.Add("car filters panel not found"); } var filters = htmlResult.FindNodesByName("generic-filter"); if (filters == null || filters.Count() == 0) { errors.Add("generic filters not found"); } var combobox = htmlResult.FindNodesByName("filter-combobox"); if (combobox == null || combobox.Count() == 0) { errors.Add("brands not found"); } if (errors.Count() > 0) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Обнаружены следующие проблемы: " + string.Join(",", errors); return(result); } var execTime = endTime - startTime; if (execTime > TimeSpan.FromSeconds(warningThreshold)) { result.State.Status = StatusesEnum.WARNING; result.State.Description = string.Format("Время ответа больше порога {0} сек: {1:0.00}", warningThreshold, execTime.TotalSeconds); return(result); } result.State.Status = StatusesEnum.OK; result.State.Description = "Проблем не обнаружено"; } catch (TaskCanceledException) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = string.Format("Превышен интервал выполнения запроса: {0} сек", requestTimeout.Seconds); } catch (HttpRequestException ex) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка http-запроса: " + ex.Message; } catch (Exception ex) { Console.WriteLine(ex);// result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка при обработке HTML"; } return(result); }
public async Task <Check> CheckCategoryInfo(CheckSettings settings) { var result = new Check { Settings = settings }; result.State.LastCheckTime = DateTime.Now; var requestTimeout = TimeSpan.FromSeconds(30); string address = new EnvironmentHelper().GetEnvironmentUrl(settings.EnvironmentId) + "/product/filtr-maslyanyj-dvigatelya-lanos-aveo-lacetti-nubira-nexia-pr-vo-knecht-mahle-id-84669-0-170"; try { var warningThreshold = 3; var errors = new List <string>(); var startTime = DateTime.Now; var htmlResult = await _httpService.GetHtmlStructureAsGoogleBotDesktop(address, requestTimeout); var endTime = DateTime.Now; var breadcrumbs = htmlResult.FindNodesByName("autodoc-breadcrumbs").FirstOrDefault(); if (breadcrumbs == null) { errors.Add("breadcrumbs element not found"); } var expectedCrumbs = new List <string> { "href=\"/\"", //home "href=\"/category/dvigatel-sistemy-i-komponenty-id1-3\"", //Двигатель, системы и компоненты "href=\"/category/sistema-smazki-id57-3\"", //Система смазки "href=\"/category/maslyanyj-filtr-id170-3\"", //Масляный фильтр }; var missingCrumbs = new List <string>() as IEnumerable <string>; if (breadcrumbs != null && !breadcrumbs.InnerHtml.ContainsAll(expectedCrumbs, out missingCrumbs)) { errors.Add("Following breadcrumbs aren't found: " + string.Join(", ", missingCrumbs)); } //check h1 var h1 = htmlResult.FindNodesByName("h1").FirstOrDefault(); if (h1 != null && h1.InnerHtml != "Фильтр масляный двигателя LANOS, AVEO, LACETTI, NUBIRA, NEXIA (пр-во KNECHT-MAHLE). OC90") { errors.Add("h1 differs from expected: " + h1.InnerHtml); } //check price var price = htmlResult.FindNodesByClassName("span", "product-section__new-price").FirstOrDefault(); var isNumber = float.TryParse(price?.InnerHtml, NumberStyles.Any, CultureInfo.InvariantCulture, out var num); if (!isNumber) { errors.Add("price not found"); } if (errors.Count() > 0) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Обнаружены следующие проблемы: " + string.Join(",", errors); return(result); } var execTime = endTime - startTime; if (execTime > TimeSpan.FromSeconds(warningThreshold)) { result.State.Status = StatusesEnum.WARNING; result.State.Description = string.Format("Время ответа больше порога {0} сек: {1:0.00}", warningThreshold, execTime.TotalSeconds); return(result); } result.State.Status = StatusesEnum.OK; result.State.Description = "Проблем не обнаружено"; } catch (TaskCanceledException) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = string.Format("Превышен интервал выполнения запроса: {0} сек", requestTimeout.Seconds); } catch (HttpRequestException ex) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка http-запроса: " + ex.Message; } catch (Exception ex) { Console.WriteLine(ex);// result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка при обработке HTML"; } return(result); }
public async Task <Check> CheckMetaInfo(CheckSettings settings) { var result = new Check { Settings = settings }; result.State.LastCheckTime = DateTime.Now; var requestTimeout = TimeSpan.FromSeconds(45); string address = new EnvironmentHelper().GetEnvironmentUrl(settings.EnvironmentId) + "/category/shiny-id49-3"; try { var warningThreshold = 3; var errors = new List <string>(); var startTime = DateTime.Now; var htmlResult = await _httpService.GetHtmlStructureAsGoogleBotDesktop(address, requestTimeout); var endTime = DateTime.Now; var title = htmlResult.GetTitle(); if (title != "Шины от autodoc.ua (оригинал, аналог) | autodoc.ua") { errors.Add("title incorrect: " + title); } var robots = htmlResult.GetMetaTagContent("robots"); if (settings.EnvironmentId == (int)EnvironmentsEnum.Prod && robots != "index, follow") { errors.Add("'robots' tag content incorrect: " + robots); } var keywords = htmlResult.GetMetaTagContent("keywords"); if (keywords != "шины") { errors.Add("'keywords' tag content incorrect: " + keywords); } var description = htmlResult.GetMetaTagContent("description"); if (string.IsNullOrWhiteSpace(description)) { errors.Add("'description' tag content incorrect: " + description); } var canonicalLink = htmlResult.GetLinkContent("canonical"); if (canonicalLink != address) { errors.Add("'link' for rel='canonical' is incorrect: " + canonicalLink); } var nextLink = htmlResult.GetLinkContent("next"); if (nextLink != address + "?page=2") { errors.Add("'link' for rel='next' is incorrect: " + nextLink); } var prevLink = htmlResult.GetLinkContent("prev"); if (prevLink != null) { errors.Add("'link' for rel='prev' is present on page 1:" + prevLink); } if (errors.Count() > 0) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Обнаружены следующие проблемы: " + string.Join(",", errors); return(result); } var execTime = endTime - startTime; if (execTime > TimeSpan.FromSeconds(warningThreshold)) { result.State.Status = StatusesEnum.WARNING; result.State.Description = string.Format("Время ответа больше порога {0} сек: {1:0.00}", warningThreshold, execTime.TotalSeconds); return(result); } result.State.Status = StatusesEnum.OK; result.State.Description = "Проблем не обнаружено"; } catch (TaskCanceledException) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = string.Format("Превышен интервал выполнения запроса: {0} сек", requestTimeout.Seconds); } catch (HttpRequestException ex) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка http-запроса: " + ex.Message; } catch { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка при обработке HTML"; } return(result); }
public async Task <Check> CheckMetaInfo(CheckSettings settings) { var result = new Check { Settings = settings }; result.State.LastCheckTime = DateTime.Now; var requestTimeout = TimeSpan.FromSeconds(30); string address = new EnvironmentHelper().GetEnvironmentUrl(settings.EnvironmentId) + "/product/filtr-maslyanyj-dvigatelya-lanos-aveo-lacetti-nubira-nexia-pr-vo-knecht-mahle-id-84669-0-170"; try { var warningThreshold = 3; var errors = new List <string>(); var startTime = DateTime.Now; var htmlResult = await _httpService.GetHtmlStructureAsGoogleBotDesktop(address, requestTimeout); var endTime = DateTime.Now; var title = htmlResult.GetTitle(); var expectedTitle = (settings.EnvironmentId == (int)EnvironmentsEnum.Prod) ? "Фильтр масляный двигателя lanos, aveo, lacetti, nubira, nexia (пр-во knecht-mahle). Масляный фильтр OC90 KNECHT-MAHLE | autodoc.ua" : "Фильтр масляный двигателя lanos, aveo, lacetti, nubira, nexia (пр-во knecht-mahle). Масляный фильтр OC90 KNECHT-MAHLE | autodoc.ua"; if (title != expectedTitle) { errors.Add("title incorrect: " + title); } var robots = htmlResult.GetMetaTagContent("robots"); if (settings.EnvironmentId == (int)EnvironmentsEnum.Prod && robots != "index, follow") { errors.Add("'robots' tag content incorrect: " + robots); } var keywords = htmlResult.GetMetaTagContent("keywords"); var expectedKeywords = (settings.EnvironmentId == (int)EnvironmentsEnum.Prod) ? "фильтр масляный двигателя lanos, aveo, lacetti, nubira, nexia (пр-во knecht-mahle), масляный фильтр, OC90, knecht-mahle" : "фильтр масляный двигателя lanos, aveo, lacetti, nubira, nexia (пр-во knecht-mahle), масляный фильтр, OC90, knecht-mahle"; if (keywords != expectedKeywords) { errors.Add("'keywords' tag content incorrect: " + keywords); } var description = htmlResult.GetMetaTagContent("description"); var expectedDescription = (settings.EnvironmentId == (int)EnvironmentsEnum.Prod) ? "Желаете приобрести масляный фильтр OC90 KNECHT-MAHLE? В нашем интернет-магазине вы можете приобрести Фильтр масляный двигателя LANOS, AVEO, LACETTI, NUBIRA, NEXIA (пр-во KNECHT-MAHLE) хорошего качества. На autodoc.ua вы без трудностей сможете подобрать масляный фильтр." : "Желаете приобрести масляный фильтр OC90 KNECHT-MAHLE? В нашем интернет-магазине вы можете приобрести Фильтр масляный двигателя LANOS, AVEO, LACETTI, NUBIRA, NEXIA (пр-во KNECHT-MAHLE) хорошего качества. На autodoc.ua вы без трудностей сможете подобрать масляный фильтр."; if (description != expectedDescription) { errors.Add("'description' tag content incorrect: " + description); } if (errors.Count() > 0) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Обнаружены следующие проблемы: " + string.Join(",", errors); return(result); } var execTime = endTime - startTime; if (execTime > TimeSpan.FromSeconds(warningThreshold)) { result.State.Status = StatusesEnum.WARNING; result.State.Description = string.Format("Время ответа больше порога {0} сек: {1:0.00}", warningThreshold, execTime.TotalSeconds); return(result); } result.State.Status = StatusesEnum.OK; result.State.Description = "Проблем не обнаружено"; } catch (TaskCanceledException) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = string.Format("Превышен интервал выполнения запроса: {0} сек", requestTimeout.Seconds); } catch (HttpRequestException ex) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка http-запроса: " + ex.Message; } catch { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка при обработке HTML"; } return(result); }
public async Task <Check> PerformCheck(CheckSettings settings, bool isMobile = false) { var expectedMarker = isMobile ? "MOBILE" : "DESKTOP"; var result = new Check { Settings = settings }; result.State.LastCheckTime = DateTime.Now; var requestTimeout = TimeSpan.FromSeconds(30); string address = new EnvironmentHelper().GetEnvironmentUrl(settings.EnvironmentId); try { var warningThreshold = 3; var errors = new List <string>(); var startTime = DateTime.Now; var htmlResult = (isMobile) ? await _httpService.GetHtmlStructureAsGoogleBotMobile(address, requestTimeout) : await _httpService.GetHtmlStructureAsGoogleBotDesktop(address, requestTimeout); var endTime = DateTime.Now; var footerMarker = htmlResult.FindNodesByClassName("div", "footer__holder").FirstOrDefault()?.FirstChild; if (footerMarker == null) { errors.Add("footer MOBILE marker not found"); } if (footerMarker.InnerText != expectedMarker) { errors.Add($"Expected footer marker is '{expectedMarker}'. Received is '{footerMarker.InnerText}'"); } var appMarker = htmlResult.FindNodesByClassName("div", "wrapper__holder").FirstOrDefault()?.FirstChild; if (appMarker == null) { errors.Add("app MOBILE marker not found"); } if (appMarker.InnerText != expectedMarker) { errors.Add($"Expected app marker is '{expectedMarker}'. Received is '{footerMarker.InnerText}'"); } if (errors.Count() > 0) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Обнаружены следующие проблемы: " + string.Join(",", errors); return(result); } var execTime = endTime - startTime; if (execTime > TimeSpan.FromSeconds(warningThreshold)) { result.State.Status = StatusesEnum.WARNING; result.State.Description = string.Format("Время ответа больше порога {0} сек: {1:0.00}", warningThreshold, execTime.TotalSeconds); return(result); } result.State.Status = StatusesEnum.OK; result.State.Description = "Проблем не обнаружено"; } catch (TaskCanceledException) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = string.Format("Превышен интервал выполнения запроса: {0} сек", requestTimeout.Seconds); } catch (HttpRequestException ex) { result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка http-запроса: " + ex.Message; } catch (Exception ex) { Console.WriteLine(ex);// result.State.Status = StatusesEnum.CRITICAL; result.State.Description = "Ошибка при обработке HTML"; } return(result); }