Как поместить цикл с увеличением счетчика в один кубик?

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Многие, наверное, сталкивались с ситуацией, когда загрузку страницы сопровождает приглушенно-затемненный фон со значком ожидания, наподобии этого.



Этот фон - как некий сигнал от сайта, что нужно подождать, преждем чем предпринимать дальнейшия действия. И часто бывает так, что Зенно уверенно полагает, что загрузка страницы уже завершена и можно переходить к следующему шагу, но по факту шаблону нужно терпеливо дожидаться, когда темный фон исчезнет.
Можно, конечно, парсить код активного темного фона вплоть до исчезновения, но тогда получается цикл, который в случае сбоя связи может замкнуться в бесконечности:



Не секрет, что такие циклы - дурной тон.

Таким образом, напрашивается вариант выйти из цикла после, скажем, 50 попыток с интервалом в 2 секунды, чтобы полноценно перезагрузить страничку. Получается простенькая схемка, при которой уже не нужно переживать за бесконечный цикл:



Но здесь есть другой минус: награмождение блоков, от которого рябит в глазах. Ведь есть сайты, где любой переход между страницами должен сопровождаться этой проверкой.
Очень хочется, чтобы функционал содержался только в одном блоке (максимум в двух), это очень бы облегчило читабельность схемы шаблона.

Т.е. код должен взять на себя сразу несколько функций: выдержать паузу, увеличивать счетчик, и сравнивать его с количеством попыток, а в случае их превышения выполнить window.location.replace(window.location.href); (хотя это можно уже доверить другому блоку). Подскажите, пожалуйста, это реально ли сообще сделать или я хочу чего-то сверхъестественного? Либо может есть решение проще.

Благодарю за внимание к задаче.
 
  • Спасибо
Реакции: Roman*

Nick

Client
Регистрация
22.07.2014
Сообщения
1 983
Благодарностей
817
Баллы
113
Да, ты можешь всё это переписать в виде одного блока на C#
 

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
Подскажите, пожалуйста, это реально ли сообще сделать
Простой пример без проверок
C#:
Tab tab = instance.ActiveTab;
var element = tab.FindElementById("myId");
int a = 0;
for (int i = 0; i < 10 ; i++ ) //количество попыток найти element - 10
        {
            if(!element.IsVoid)
            {
                //здесь код
                project.SendInfoToLog("-------------OK-----------", true);
                break;       
            }
            System.Threading.Thread.Sleep(1000);//пауза 1с
            project.SendInfoToLog("-------------пауза 1с-----------", true);
            if(i==9&&a<4) //количество попыток перезагрузки страницы- 4
            {
                //здесь код
                project.SendInfoToLog("-------------Новая попытка-----------", true);
                i=0;
                a++;
               
            }
        }
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Благодарю!

В данном случае идет поиск по ID элемента. Подскажите, пожалуйста, как должен выглядеть код, чтобы поиск был по регулярке из DOM. Поиск мучал, пытался лепить код из этой темы, но не хватило знаний довести до ума.
 

Aleksk

Client
Регистрация
19.06.2013
Сообщения
31
Благодарностей
23
Баллы
8
Подскажите, пожалуйста, как должен выглядеть код, чтобы поиск был по регулярке из DOM.
Парсить DOM с помощью регулярных выражений, это в корне неверный подход, так как таким образом можно получить больше проблем, чем пользы.
Регулярные выражения необходимо использоваться только для извлечения данных, которые имеют строгий формат — электронные адреса, телефоны и т.д., в редких случаях — адреса, шаблонные данные.
Для парсинга DOM есть более удобные методы:
1)Анализ DOM дерева(Используя этот подход, данные можно получить напрямую по идентификатору, имени или других атрибутов элемента дерева, таким элементом может служить параграф, таблица, блок и т.д.)), 2)использование XPath или 3)парсинг строк.

PS.
Посмотрите Видеоуроки по работе с ZennoPoster от Rostonix
 
Последнее редактирование:

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Когда загрузку страницы сопровождает приглушенно-затемненный фон, единственный отличительный признак - свойство элемента (слой темного фона) меняется с style="display: hidden;" на style="display: block;"
Соответственно, в данном случае парсим не id элемента, а наличие на страничке style="display: hidden;"

Вопрос в том, как заменить поиск по ID из Вашего примера на поиск по style="display: hidden;"
 

arhip1985

Client
Регистрация
31.10.2011
Сообщения
2 994
Благодарностей
787
Баллы
113
ну и что, что лишние кубики будут - что в коде написано, что несколько кубиков - всё работает одинаково.
Вам надо вместо байайди - использовать
public HtmlElement FindChildByAttribute(
string tags,
string attrName,
string attrValue,
string searchKind,
int number
)

вместо attrName - писать style , в валюе display: block;
 
Последнее редактирование:
  • Спасибо
Реакции: Nick

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Решил группу кубиков вместо одного кубика на С (как хотел изначально) впихнуть в отдельный мини-проект, вызывая его через "проект в проекте". По факту ведь тоже получается один кубик. В PM работает нормально, визуально хорошо экономит место. В ZP еще не пробовал, надеюсь подвоходов не будет из-за того, что проект в проекте вызывается циклом.
 

Creeple

Client
Регистрация
13.09.2016
Сообщения
56
Благодарностей
14
Баллы
8
Можно просто обращаться сразу к нужному элементу, выставив в свойствах время на ожидание.
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Но мы ведь заранее не знаем, сколько времени потребуется на то, чтобы выполнилось ожидаемое условие. Это может быть и 2 сек, и 30 сек. Не хотелось бы сразу выставлять максимальное время ожидания :-)
 

Creeple

Client
Регистрация
13.09.2016
Сообщения
56
Благодарностей
14
Баллы
8
Но мы ведь заранее не знаем, сколько времени потребуется на то, чтобы выполнилось ожидаемое условие. Это может быть и 2 сек, и 30 сек. Не хотелось бы сразу выставлять максимальное время ожидания :-)
А он не будет ждать больше, чем нужно, если встретит элемент.
 

Enigma

Client
Регистрация
16.06.2017
Сообщения
187
Благодарностей
31
Баллы
28
Только сейчас понял, о чем Вы.

В моем случае происходит мониторинг слоя ожидания, чтобы, пока этот слой активен, шаб не выполнял новые действия. Пока слой ожидания активен, элементы и так доступны, т.е. шаб будет успешно их находить. Но взаимодействовать с ними пока слой ожидания активен - смысла нет. Потому и происходит парсинг наличия самого слоя, а для этого время ожидания не предусмотрено в свойствах.
 

lextorg

Client
Регистрация
25.05.2014
Сообщения
60
Благодарностей
10
Баллы
8
Если через браузер получать данные, то да - ждем пропадание слоя и дальше работаем с кодом страницы целиком, а как быть, когда работаешь через GET-запросы? Несколько раз нужно было такое же ожидание обрабатывать именно при работе через GET-запрос, но не нашел ответа как сделать.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)