- Регистрация
- 06.11.2018
- Сообщения
- 11 790
- Благодарностей
- 5 720
- Баллы
- 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("Внешнее прерывание");
а в кубике C# она вызывается tab.NavigateWithCheck(url, DateTime.Now ,NavigateTimeout);
вот вроде все описал по своему видению этой проблемы.
и еще. на текущую дату вышла новая версия 5.40 (7.1.1.0) и в ней по предварительным тестам под движком хрома зависшие потоки снимаются и рестартятся мгновенно. что в совокупности с методом идентификации зависших потоков делает ее пригодной для работы 24/7
PS. Забыл упомянуть про кубик IF
Стандартный кубик IF работает не на C#, а на яваскрипт. И при возникновении проблем с браузером логично предположить, что код яваскрипта будет немного сбоить . Редко, но метко как говорят.
А проведенный стресс-тест показал, что при упавшем браузере кубик IF будет всегда выходить по красной. Поэтому для улучшения стабильности работы шаблона лучше полностью отказаться от кубика IF и использовать кубик C# с прописанной логикой на C#
Разработчики до сих пор уверяют, что кубик IF не глючный. Можно с ними согласиться , только в том случае когда все работает, но если надо ловить ситуации в условиях краха , этот инструмент не подходит.
Еще раз хочу отметить , что все написанное есть сугубо мое личное мнение. Ни кого , ни к чему не обязывающее
Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование: