Построить логику.

  • Автор темы Автор темы Roman48
  • Дата начала Дата начала

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Реакции
747
Баллы
113
Привет. Не знаю как правильно назвать тему, если что, не обессудьте, поправьте.
Использую этот код.
C#:
Развернуть Свернуть Копировать
https://zennolab.com/discussion/threads/kak-sdelat-ozhidanie-poka-ne-podgruzit-java-ehlement.76471/post-512250

public static class ZHelpers
    {
        private static string[] LoadStates = {"complete", "uninitialized", }; //Статусы которые считаем что документ загрузился
        
        /// <summary>
        /// Ожидание загрузки таба
        /// </summary>
        /// <param name="tab">Таб загрузки которого ждем</param>
        /// <param name="maxWaitMs">Максимальное ожидание в мс, по умолчанию 60 сек</param>
        public static void TabLoadWait(this Tab tab, int maxWaitMs = 60 * 1000)
        {
            maxWaitMs = maxWaitMs/2;
            //Делаем 2 захода, для точной уверенности
            for (var i = 0; i < 2; i++)
            {
                //TODO заменить на токен
                //Когда выходим
                long maxTime = DateTime.Now.Ticks + maxWaitMs * 10000;
                //Проверям на загрузку странцы пока не кончится время или мы не получим все интересующие нас данные
                do
                {
                
                // TODO: проверка прерывания
                
                    new System.Threading.ManualResetEvent(false).WaitOne(2000);
                    if (tab.IsBusy) tab.WaitDownloading();

                    //Проверяем через js document.readyState, статус всех документов на страницы
                    bool isNotComplete = false;
                    foreach (var document in tab.AllDocuments.Documents)
                    {
                        string readyState = document.EvaluateScript("return document.readyState;");
                        if (!String.IsNullOrEmpty(readyState) && !LoadStates.Contains(readyState))
                        {
                            if (readyState != "interactive" || !document.URL.StartsWith("about:",StringComparison.Ordinal))
                                isNotComplete = true;
                        }
                    }

                    // Если у всех статус complete считаем что прошли проверку
                    if (!isNotComplete)
                        break;
                }
                while (DateTime.Now.Ticks < maxTime);
            }
        }
    }





И вызывать из c# кубика с помощью:

instance.ActiveTab.TabLoadWait();


Проблема возникает, иногда на некоторых сайтах, кубик очень долго отрабатывает.
Нужно если кубик долго отрабатывает (например больше 10 сек) сайт закрывать и уходить. Начал лепить, типа время сверить до и после, а получается минута, проходит и опять секунды, подскажите пожалуйста, как правильно, это реализовать?
 
C#:
Развернуть Свернуть Копировать
long start = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; //or DateTimeOffset.Now.ToUnixTimeSeconds();
int maxTimeWork = 10; //second

project.SendInfoToLog("Start work!");

while(true)
{
    project.SendInfoToLog("Work...");
    Thread.Sleep(1000);
    
    if ((start + maxTimeWork) == (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds)
    {
        project.SendInfoToLog("Sorry, stop work!");
        break;
    }
}
 
  • Спасибо
Реакции: Roman48
C#:
Развернуть Свернуть Копировать
long start = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; //or DateTimeOffset.Now.ToUnixTimeSeconds();
int maxTimeWork = 10; //second

project.SendInfoToLog("Start work!");

while(true)
{
    project.SendInfoToLog("Work...");
    Thread.Sleep(1000);
   
    if ((start + maxTimeWork) == (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds)
    {
        project.SendInfoToLog("Sorry, stop work!");
        break;
    }
}
Спасибо большее, как им пользоваться, что в свой код вставить, я это понимаю, а дальше?
 
Спасибо большее, как им пользоваться, что в свой код вставить, я это понимаю, а дальше?

Сейчас нет сил думать и вникать в вашу логику, но первое что пришло, это проверять содержимое <body></body>, есть ли там что-то или н-ое кол-во символов, иначе, если в течение 10 секунд нет изменений, то дальнейшая логика.
 
сложный код ты выбрал. передавай с параметром, всё должно быть норм:

C#:
Развернуть Свернуть Копировать
instance.ActiveTab.TabLoadWait(10000); //жди макс 10 сек

//если не выйдет, попробуй ещё так (до конца не въехал в логику кода): instance.ActiveTab.TabLoadWait(10);

было бы проще, если бы скинул сайт с проблемой. тебе бы тут кто-нибудь подкинул подходящий сниппет
 
  • Спасибо
Реакции: Roman48
Конкретного сайта нет, сайты в списке тысяч 200 и в выдачи, бывает нормально, загружается, а бывает очень долго, а еще после клика этот кубик стоит, но 10 сек еще норм, бывает и дольше, и если так ожидать, на один сайт уйдет очень много времени.
C#:
Развернуть Свернуть Копировать
return DateTime.Now.ToString("MMddyyyyhhmmss");
Сейчас попробую время сравнить до так и после и js отнять и если больше, прокручиваю в низ и закрываю сайт. Не знаю получиться или нет.
 
Получилось до полностью время записать и после и js минус, даже секундомером замерил
я не понял ничего.

Я увидел то, что в методе задаётся время ожидания в миллисекундах, а затем на 20й строке умножается на 10000. Это странно
 
я не понял ничего.

Я увидел то, что в методе задаётся время ожидания в миллисекундах, а затем на 20й строке умножается на 10000. Это странно
До кода я еще не вырос. Вот как сделал, и теперь смогу из выходных настроек устанавливать время.
 

Вложения

  • тт.zp
    тт.zp
    15,1 KB · Просмотры: 114
версию не понизите?))
 

Вложения

  • тт.zp
    тт.zp
    14,9 KB · Просмотры: 113
Да там все просто.
1598965355354.png
 
я может чего не понимаю из исходящей задачи, но если у вас будет "бесконечное" ожидание во втором "кубе", то до третьего дело так и не дойдет. не?
 
я может чего не понимаю из исходящей задачи, но если у вас будет "бесконечное" ожидание во втором "кубе", то до третьего дело так и не дойдет. не?
Не встречал такого, даже если вкладка отваливается about:blank код быстро тогда отрабатывает, вкладку проверяю на другом этапе.
Есть о чем подумать, про цикл не подумал.
 

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