Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }