- Регистрация
- 06.11.2018
- Сообщения
- 11 789
- Реакции
- 5 738
- Баллы
- 113
Давно хотел написать эту статейку. Оставлю тут, чтоб была 
Итак. Пишу для тех кто работает с браузерными шаблонами. Тема - всеми любимые зависоны шаблонов. Естественно разбирать будем не все случаи, а конкретно один - это падение браузера. Озвучу сугубо личное мнение на сей счет, которое может не совпадать с Вашим или Разработчиков.
Немного теории. Когда Зеннопостер запускает шаблон в работу, он создает в памяти уникальный изолированный процесс, а так же все объектные структуры для этого процесса. Один из самых важных объектов это наш браузер.
Обращаемся мы к нему как instance . И когда зависает шаблон, говорят инстанс завис или упал или закрашился. Все это верно по отношению к instance , но сам шаблон не завис и не рухнул. Другие объекты продолжают существовать и код продолжает выполняться. Но обращение из шаблона к упавшему браузеру вызывает коллизии и выполнение кода замирает на этой команде (это относиться как к кубикам, так и к коду на C#). В далеком прошлом это приводило к абсолютному зависону шаблона, вот прям намертво. Тогда разработчики внедрили временный костыль - таймаут выполнения команды в инстансе (находиться в настройках зеннопостера), которая принудительно прерывала слишком долгую команду. Сейчас можно встретить заявления, что данная настройка является пережитком прошлого и уже ни на что не влияет. Но это больше маркетинговый ход. Все мы знаем, что инстансы продолжают падать и данная настройка остается важной до сих пор. Вроде все хорошо, даже инструмент есть для снятия зависших команд, НО срабатывание данного таймаута не носит критического характера и не генерируется абсолютно никаких исключений. Выполнение шаблона продолжает выполняться как ни в чем не бывало. Разработчиков можно понять, им прогу продавать надо, а тут будут такие ошибки сыпаться как из рога изобилия. Так вот и получается, что даже при таймауте в 1 минуту выполнение логики шаблона приходит (а если браузер уже упал, то приползает) к какому нибудь циклу, где опрашивается элемент на странице с целью ожидания его появления в течении 12-20 секунд. Нам просто гарантированно выполнение данного цикла минут 20. а потом логика шаблона может уйти на еще какие нибудь действия с элементами браузера. И никаких ошибок в логе. Естественно не все потоки разом вот так зависают, но они накапливаются и получаем кучу "работающих" потоков, которые ничего не делают. А ошибок нет.
Причины падения браузера известны только разработчикам, а иногда даже они не знают что происходит в процессе. Конечно работы по улучшению стабильности идут , но от падения браузера никто не застрахован и в будущем скорее всего тоже.
Нам с вами от этого не легче и поэтому давайте разбираться что можно сделать в этой непростой ситуации.
Вопрос сводиться как идентифицировать возникшие проблемы в работе браузера и как по быстрому выйти из этого проблемного потока.
Настройка таймаута.
Насколько я знаю ни одна команда в рабочем инстансе не может выполняться больше 1-й минуты, поэтому тайм аут смело можно ставить по минимуму
Как выйти из шаблона ?
Механизм выхода универсален. Используем рабочий функционал Зеннопостера. Выход через BadEnd. С единственный условием, после BadEnd не должно быть никакого обращения к браузеру. всякие скриншоты, сохранение профиля ,закрытия вкладок , всего этого быть не должно. Запись в лог, в базу данных можно. Таким образом шаблон свободно выйдет, без лишних пауз. И никаких зацикливаний через BadEnd, так как данный механизм срабатывает только один раз.
И как попасть на BadEnd ?
Для попадания на BadEnd надо что бы было сгенерировано необработанное исключение. Другими словами выход из кубика по красному выходу, не занятой линией.
И вот тут надо рассказать о правильном построении шаблона, с учетом отлова зависшего браузера. Получается, что для аварийного выхода нам надо иметь свободный красный выход, так же для реализации логики шаблона нам надо иметь 2 выхода. итого 3 выхода нужно. а имеем только 2. Выход в использовании 2-х кубиков. в первом кубике должна выполняться "Рисковая операция", это все что связано с работой браузера, а во втором кубике будет "Безрисковая логика". Первый кубик будет возвращать какой нибудь результат в переменную или генерировать аварийное исключение , а второй кубик будет проверять результат работы первого кубика и принимать решение куда выходить, на зеленую или на красную.
Как идентифицировать падение браузера ?
Есть пара способов, но для уверенности надо использовать все проверки, так как по отдельности могут и не сработать.
Проверяем активную вкладку на наличие. Именно активную, так как ранее сформированная может уже и закрытой быть. instance.ActiveTab.IsNull и instance.ActiveTab.IsVoid
Проверка времени выполнения команд. Засекаем время до выполнения и после. Считаем разницу и если команда выполнялась долго формируем исключение. метод по аналогии с внедренным разработчиками, только с аварийным выходом.
ну а куда деваться если разработчики не хотят внедрять аврал в свой метод ? правильно , сделаем сами
и да, для команд выполняемых в цикле надо проверять внешние прерывания, что бы шаблон можно было прервать в любую секунду.
да, одна команда превращается в кучу кода. читаемость кода резко падает. как выход все это можно запихнуть в общий код. как пример приведу переход по URL в общем коде
а в кубике C# она вызывается tab.NavigateWithCheck(url, DateTime.Now ,NavigateTimeout);
вот вроде все описал по своему видению этой проблемы.
и еще. на текущую дату вышла новая версия 5.40 (7.1.1.0) и в ней по предварительным тестам под движком хрома зависшие потоки снимаются и рестартятся мгновенно. что в совокупности с методом идентификации зависших потоков делает ее пригодной для работы 24/7
PS. Забыл упомянуть про кубик IF
Стандартный кубик IF работает не на C#, а на яваскрипт. И при возникновении проблем с браузером логично предположить, что код яваскрипта будет немного сбоить . Редко, но метко как говорят.
А проведенный стресс-тест показал, что при упавшем браузере кубик IF будет всегда выходить по красной. Поэтому для улучшения стабильности работы шаблона лучше полностью отказаться от кубика IF и использовать кубик C# с прописанной логикой на C#
Разработчики до сих пор уверяют, что кубик IF не глючный. Можно с ними согласиться , только в том случае когда все работает, но если надо ловить ситуации в условиях краха , этот инструмент не подходит.
Еще раз хочу отметить , что все написанное есть сугубо мое личное мнение. Ни кого , ни к чему не обязывающее

Итак. Пишу для тех кто работает с браузерными шаблонами. Тема - всеми любимые зависоны шаблонов. Естественно разбирать будем не все случаи, а конкретно один - это падение браузера. Озвучу сугубо личное мнение на сей счет, которое может не совпадать с Вашим или Разработчиков.
Немного теории. Когда Зеннопостер запускает шаблон в работу, он создает в памяти уникальный изолированный процесс, а так же все объектные структуры для этого процесса. Один из самых важных объектов это наш браузер.
Обращаемся мы к нему как instance . И когда зависает шаблон, говорят инстанс завис или упал или закрашился. Все это верно по отношению к instance , но сам шаблон не завис и не рухнул. Другие объекты продолжают существовать и код продолжает выполняться. Но обращение из шаблона к упавшему браузеру вызывает коллизии и выполнение кода замирает на этой команде (это относиться как к кубикам, так и к коду на C#). В далеком прошлом это приводило к абсолютному зависону шаблона, вот прям намертво. Тогда разработчики внедрили временный костыль - таймаут выполнения команды в инстансе (находиться в настройках зеннопостера), которая принудительно прерывала слишком долгую команду. Сейчас можно встретить заявления, что данная настройка является пережитком прошлого и уже ни на что не влияет. Но это больше маркетинговый ход. Все мы знаем, что инстансы продолжают падать и данная настройка остается важной до сих пор. Вроде все хорошо, даже инструмент есть для снятия зависших команд, НО срабатывание данного таймаута не носит критического характера и не генерируется абсолютно никаких исключений. Выполнение шаблона продолжает выполняться как ни в чем не бывало. Разработчиков можно понять, им прогу продавать надо, а тут будут такие ошибки сыпаться как из рога изобилия. Так вот и получается, что даже при таймауте в 1 минуту выполнение логики шаблона приходит (а если браузер уже упал, то приползает) к какому нибудь циклу, где опрашивается элемент на странице с целью ожидания его появления в течении 12-20 секунд. Нам просто гарантированно выполнение данного цикла минут 20. а потом логика шаблона может уйти на еще какие нибудь действия с элементами браузера. И никаких ошибок в логе. Естественно не все потоки разом вот так зависают, но они накапливаются и получаем кучу "работающих" потоков, которые ничего не делают. А ошибок нет.
Причины падения браузера известны только разработчикам, а иногда даже они не знают что происходит в процессе. Конечно работы по улучшению стабильности идут , но от падения браузера никто не застрахован и в будущем скорее всего тоже.
Нам с вами от этого не легче и поэтому давайте разбираться что можно сделать в этой непростой ситуации.
Вопрос сводиться как идентифицировать возникшие проблемы в работе браузера и как по быстрому выйти из этого проблемного потока.
Настройка таймаута.
Насколько я знаю ни одна команда в рабочем инстансе не может выполняться больше 1-й минуты, поэтому тайм аут смело можно ставить по минимуму
Как выйти из шаблона ?
Механизм выхода универсален. Используем рабочий функционал Зеннопостера. Выход через BadEnd. С единственный условием, после BadEnd не должно быть никакого обращения к браузеру. всякие скриншоты, сохранение профиля ,закрытия вкладок , всего этого быть не должно. Запись в лог, в базу данных можно. Таким образом шаблон свободно выйдет, без лишних пауз. И никаких зацикливаний через BadEnd, так как данный механизм срабатывает только один раз.
И как попасть на BadEnd ?
Для попадания на BadEnd надо что бы было сгенерировано необработанное исключение. Другими словами выход из кубика по красному выходу, не занятой линией.
И вот тут надо рассказать о правильном построении шаблона, с учетом отлова зависшего браузера. Получается, что для аварийного выхода нам надо иметь свободный красный выход, так же для реализации логики шаблона нам надо иметь 2 выхода. итого 3 выхода нужно. а имеем только 2. Выход в использовании 2-х кубиков. в первом кубике должна выполняться "Рисковая операция", это все что связано с работой браузера, а во втором кубике будет "Безрисковая логика". Первый кубик будет возвращать какой нибудь результат в переменную или генерировать аварийное исключение , а второй кубик будет проверять результат работы первого кубика и принимать решение куда выходить, на зеленую или на красную.
Как идентифицировать падение браузера ?
Есть пара способов, но для уверенности надо использовать все проверки, так как по отдельности могут и не сработать.
Проверяем активную вкладку на наличие. Именно активную, так как ранее сформированная может уже и закрытой быть. instance.ActiveTab.IsNull и instance.ActiveTab.IsVoid
Проверка времени выполнения команд. Засекаем время до выполнения и после. Считаем разницу и если команда выполнялась долго формируем исключение. метод по аналогии с внедренным разработчиками, только с аварийным выходом.
ну а куда деваться если разработчики не хотят внедрять аврал в свой метод ? правильно , сделаем сами

и да, для команд выполняемых в цикле надо проверять внешние прерывания, что бы шаблон можно было прервать в любую секунду.
C#:
// засекаем время
DateTime now = DateTime.Now;
// выполняем рисковую команду с браузером
instance.ActiveTab.FindElementByXPath("",0);
// считаем сколько времени выполнялась команда
TimeSpan Delta_Time = DateTime.Now-now;
int Time_Difference = Delta_Time.Milliseconds;
Time_Difference = Time_Difference + Delta_Time.Seconds*1000;
Time_Difference = Time_Difference + Delta_Time.Minutes*60*1000;
Time_Difference = Time_Difference + Delta_Time.Hours*60*60*1000;
Time_Difference = Time_Difference + Delta_Time.Days*24*60*60*1000;
// анализируем время
if ( Time_Difference > 60000 ) throw new Exception("Обнаружено замедление выполнения команды в инстансе, таймер = " + Time_Difference.ToString() );
// проверка вкладки на пустоту
if ( instance.ActiveTab.IsVoid || instance.ActiveTab.IsNull ) throw new Exception("Обнаружена пустая вкладка");
// выход по внешнему требованию
if(((ZennoLab.InterfacesLibrary.ProjectModel.Collections.IContextExt)project.Context).IsInterrupted) throw new Exception("Внешнее прерывание");
if(Global.Variables.IsProjectMaker && !Global.Variables.IsDebugMode) throw new Exception("Внешнее прерывание");
да, одна команда превращается в кучу кода. читаемость кода резко падает. как выход все это можно запихнуть в общий код. как пример приведу переход по URL в общем коде
а в кубике C# она вызывается tab.NavigateWithCheck(url, DateTime.Now ,NavigateTimeout);
вот вроде все описал по своему видению этой проблемы.
и еще. на текущую дату вышла новая версия 5.40 (7.1.1.0) и в ней по предварительным тестам под движком хрома зависшие потоки снимаются и рестартятся мгновенно. что в совокупности с методом идентификации зависших потоков делает ее пригодной для работы 24/7
PS. Забыл упомянуть про кубик IF
Стандартный кубик IF работает не на C#, а на яваскрипт. И при возникновении проблем с браузером логично предположить, что код яваскрипта будет немного сбоить . Редко, но метко как говорят.
А проведенный стресс-тест показал, что при упавшем браузере кубик IF будет всегда выходить по красной. Поэтому для улучшения стабильности работы шаблона лучше полностью отказаться от кубика IF и использовать кубик C# с прописанной логикой на C#
Разработчики до сих пор уверяют, что кубик IF не глючный. Можно с ними согласиться , только в том случае когда все работает, но если надо ловить ситуации в условиях краха , этот инструмент не подходит.
Еще раз хочу отметить , что все написанное есть сугубо мое личное мнение. Ни кого , ни к чему не обязывающее

Последнее редактирование:






оставим их авторам.