Author Topic: Ожидание полной загрузки страницы в браузере  (Read 8658 times)

0 Members and 1 Guest are viewing this topic.

Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
Можно ли как-то красиво написать такую функцию, чтобы после клика по кнопке или ссылке в браузере, кликер ждал ровно столько времени, сколько грузится следующая страница?
Простой WAIT не всегда возможно адекватно использовать, по причине того, что интернет то летает и скрипт работает отлично, то начинает тупить и скрипт не зная этого тыкает в еще незагруженную кнопку или ссылку и ессно все сбивается.
Надоело нагромождать монструозные проверки и втыкать их после и перед каждым действием :(


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
При загрузке вкладки меняется соответствующий значек (например у мазиллы это загнутая стрелка меняющаяся на время загрузки на крестик.). Нужно написать ожидание пиксела или картинки и запихнуть это в подпрограмму чтоб где нужно вызвать одной строкой.

Code: (clickermann) [Select]
SUB(ожидание)
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
         $check = 1
         WAITMS(100)
      ELSE
         WAITMS(100)
      END_IF
   END_CYC
END_SUB




ожидание()


Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
Спасибо.
Иногда бывает непонятные и непрогнозируемые подвисания, и загрузка страницы может длиться вечно, это исправляется обновлением окна, и я бы сделал как-то так:
Code: (clickermann) [Select]
SUB(ожидание)
   $check = 0
   $counter = 0
   WHILE($check = 0)
      IF($counter < 60)
         GETSCREEN
         IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
            $check = 1
            WAITMS(100)
            GOTO(stop)
         ELSE
            INT($counter)
            WAIT(1)
         END_IF
      ELSE
         $counter = 0
         KEYPRESS(#F5)
         WAITMS(100)
      END_IF
   stop:
   END_CYC
END_SUB

Тут он каждые 60 секунд будет жать F5 пока страница таки не загрузится.
Еще при желании можно сделать чтобы это было не вечно, а вложить третий цикл, чтобы через 5 минут безуспешных попыток скрипт сделал паузу минут на 10 и потом продолжил долбиться, или вообще остановился, или еще один цикл чтобы подолбиться еще несколько раз по 5 минут.

Именно такие конструкции я и назвал монструозными :)
В хуманэмуляторе есть одна команда: browser->wait(сколько_сек_ждать, сколько_попыток_обновить)
Всего одна команда и вся вышеуказанная подпрограмма выполняется без мозголомства пользователя.

Тут хотелось-бы что-то подобное видеть в следующих версиях кликермана. Тогда он будет еще более незаменимым :)

PS Еще думаю если из подпрограммы можно вызывать ее саму, то можно слегка проще написать используя только условные циклы IF-ELSE. Попробую завтра.
« Last Edit: November 19, 2014, 12:30:46 AM by Kedrick »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
немного упрощенный вариант:

Code: (clickermann) [Select]
SUB(ожидание)
   $t = $_time_t + 60
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
         $check = 1
         WAITMS(100)
      ELSE
         WAITMS(100)
         IF($t < $_time_t)
            KEYPRESS(#F5)
            $t = $_time_t + 60
         END_IF         
      END_IF
   END_CYC
END_SUB

а вот вариант с паузой 10мин, если в течении пяти минут ничего невышло:

Code: (clickermann) [Select]
SUB(ожидание)
   $t = $_time_t + 60
   $n = 0
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
         $check = 1
         WAITMS(100)
      ELSE
         WAITMS(100)
         IF($t < $_time_t)
            KEYPRESS(#F5)
            $t = $_time_t + 60
            INC($n,1)
            IF($n = 5)
               wait(600)
               $n = -1
            END_IF           
         END_IF
      END_IF
   END_CYC
END_SUB
« Last Edit: November 19, 2014, 01:08:28 AM by dramster »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
GOTO(stop) в твоем скрипте не играет роли, скрипт сам пойдет в том направлении.
PS Еще думаю если из подпрограммы можно вызывать ее саму, то можно слегка проще написать используя только условные циклы IF-ELSE. Попробую завтра.
Этот бред называется рекурсией. Благо теперь, начиная с 4.9 версии, вызов всегда должен идти после подпрограммы, и рекурсия стала невозможной.

У страницы может не догрузиться какой нибудь стиль или жава скрипт без которого вполне можно работать. Тут наверное лучше смотреть на саму страницу. А может быть что пропал интернет, и тут обновляй не обновляй...
« Last Edit: November 19, 2014, 07:54:23 AM by Oraven »

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
В хуманэмуляторе есть одна команда: browser->wait(сколько_сек_ждать, сколько_попыток_обновить)
напиши подобную подпрограмму <IE-browser_wait( sec, attempts )> для кликермана и вызывай её без дальнейшего мозголомства  ;)

Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
В ацтулз без рекурсии было никак, там нет работы с системным временем.

Еще одна маленькая просьба/вопрос не по этой теме.
Не могу разобраться как сделать работу подпрограммы до определенного времени.
WHILE($_time_h<12) работает до 12 часов, а если мне надо до 11:35 как сделать? Не найду в каком формате обозначать время.
$_time_t - не разобрался как с ним работать.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
В ацтулз без рекурсии было никак, там нет работы с системным временем.

Еще одна маленькая просьба/вопрос не по этой теме.
Не могу разобраться как сделать работу подпрограммы до определенного времени.
WHILE($_time_h<12) работает до 12 часов, а если мне надо до 11:35 как сделать? Не найду в каком формате обозначать время.
$_time_t - не разобрался как с ним работать.
Code: (clickermann) [Select]
WHILE(($_time_h ! 11) | ($_time_m ! 35))
   // работает пока не наступит 11:35
END_CYC

или

Code: (clickermann) [Select]
// остановить в 11:35
IF(($_time_h = 11) & ($_time_m = 35))
  HALT
END_IF


Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
Спасибо огромное

aden

  • Оплот сообщества
  • ****
  • Posts: 363
    • View Profile
В ацтулз без рекурсии было никак, там нет работы с системным временем.

Еще одна маленькая просьба/вопрос не по этой теме.
Не могу разобраться как сделать работу подпрограммы до определенного времени.
WHILE($_time_h<12) работает до 12 часов, а если мне надо до 11:35 как сделать? Не найду в каком формате обозначать время.
$_time_t - не разобрался как с ним работать.
Code: (clickermann) [Select]
WHILE(($_time_h ! 11) | ($_time_m ! 35))
   // работает пока не наступит 11:35
END_CYC

или

Code: (clickermann) [Select]
// остановить в 11:35
IF(($_time_h = 11) & ($_time_m = 35))
  HALT
END_IF

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Какой был вопрос - такой ответ. Всех тонкостей разъяснять у меня жизни не хватит и терпения.
Естественно нужно задавать диапазон времени.
Либо же вывести проверку в подпрограмму и вызывать её довольно часто. Потоки опять же...
Будет конкретный скрипт - будет конкретная реализация.
« Last Edit: November 20, 2014, 03:08:27 PM by Vint »


Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
Попробовал и не сработало :(

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

Code: (clickermann) [Select]
WHILE(($_time_h ! 1) | ($_time_m ! 55)) // ботим до 1:55
   bot()
END_CYC
IF(($_time_h = 1) & ($_time_m > 55)) // если время больше 1:55 ждем попап
   gift()
END_IF
WHILE($_time_h < 5) // ботим до 5
   bot()
END_CYC
EXECUTE("sleep.bat")
halt

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
возможно в подпрограмме bot() работает бесконечный цикл, либо эта подпрограмма работает больше минуты. покажи подпрограмму bot()

Kedrick

  • Освоившийся
  • **
  • Posts: 70
    • View Profile
Бесконечного цикла там нет, подпрограмма bot это основное тело скрипта с кучей строк, его длительность 7-8 минут (скинуть бабло в банку, зайти на арену проатачить очередника, зайти на работу поставить действие, ждать отката) циклит эту подпрограмму именно условие while которое должно этот цикл прерывать если системное время приближается к 2 часам. Пусть он без дела стоит 5-10-15 минут, не важно, главное чтобы к моменту 0 он был уже остановлен и ждал попапа.
Может быть тогда лучше сделать так?
Code: (clickermann) [Select]
WHILE(($_time_h < 1) & ($_time_m < 40))
   bot()
END_CYC

Но мне кажется это тоже лажу я спорол и он сразу после 00:00 встанет

Уже склоняюсь к тому, что добавить поиск попапа после каждого прохода бота, но это не красиво и хочется всетки разобраться как работать со временем в кликермане.
« Last Edit: November 21, 2014, 12:01:32 AM by Kedrick »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
лучше вот так:

Code: (clickermann) [Select]
THREAD(bot,1)
   // ботим
END_THREAD




WHILE(($_time_h ! 1) | ($_time_m ! 55)) // ботим до 1:55
   waitms(200)
   else
   SetThread (bot, 0) //в 1:55 рстановка потока
END_CYC

 gift()    //ждем попап
 SetThread (bot, 1) //после окончания программы gift() , опять врубаем поток основного бота

WHILE($_time_h < 5) // и он работает до 5ч
waitms(200)
END_CYC

EXECUTE("sleep.bat")
halt



только заметь, что подпрограмма запускается 1 раз и должна работать пока ненайдет твои подарки.
« Last Edit: November 21, 2014, 12:22:51 AM by dramster »