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

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
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 сек) сайт закрывать и уходить. Начал лепить, типа время сверить до и после, а получается минута, проходит и опять секунды, подскажите пожалуйста, как правильно, это реализовать?
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
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

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113
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;
    }
}
Спасибо большее, как им пользоваться, что в свой код вставить, я это понимаю, а дальше?
 
Регистрация
05.06.2019
Сообщения
570
Благодарностей
453
Баллы
63
Спасибо большее, как им пользоваться, что в свой код вставить, я это понимаю, а дальше?
Сейчас нет сил думать и вникать в вашу логику, но первое что пришло, это проверять содержимое <body></body>, есть ли там что-то или н-ое кол-во символов, иначе, если в течение 10 секунд нет изменений, то дальнейшая логика.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 595
Баллы
113
на первый взгляд бросается в глаза это
maxWaitMs * 10000;
 
  • Спасибо
Реакции: Roman48 и JurgenZolle

volody00

Client
Регистрация
06.09.2016
Сообщения
792
Благодарностей
810
Баллы
93
сложный код ты выбрал. передавай с параметром, всё должно быть норм:

C#:
instance.ActiveTab.TabLoadWait(10000); //жди макс 10 сек

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

Roman48

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

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 595
Баллы
113
  • Спасибо
Реакции: Roman48

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113

doc

Client
Регистрация
30.03.2012
Сообщения
8 605
Благодарностей
4 595
Баллы
113
Получилось до полностью время записать и после и js минус, даже секундомером замерил
я не понял ничего.

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

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113
я не понял ничего.

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

Вложения

  • 15,1 КБ Просмотры: 46

JurgenZolle

Client
Регистрация
19.09.2018
Сообщения
135
Благодарностей
20
Баллы
18
версию не понизите?))
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113

JurgenZolle

Client
Регистрация
19.09.2018
Сообщения
135
Благодарностей
20
Баллы
18
Последнее редактирование:

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113

Вложения

  • 14,9 КБ Просмотры: 54

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113

JurgenZolle

Client
Регистрация
19.09.2018
Сообщения
135
Благодарностей
20
Баллы
18
я может чего не понимаю из исходящей задачи, но если у вас будет "бесконечное" ожидание во втором "кубе", то до третьего дело так и не дойдет. не?
 

Roman48

Client
Регистрация
28.02.2016
Сообщения
2 058
Благодарностей
741
Баллы
113
я может чего не понимаю из исходящей задачи, но если у вас будет "бесконечное" ожидание во втором "кубе", то до третьего дело так и не дойдет. не?
Не встречал такого, даже если вкладка отваливается about:blank код быстро тогда отрабатывает, вкладку проверяю на другом этапе.
Есть о чем подумать, про цикл не подумал.
 

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