Что нового

Не отправляется send() на долгих по времени скриптах

multik

Новичок
Сообщения
12
Репутация
0
Добрый день.

AutoIt 3.3.8.1
Есть скрипт, который вставляет в адресную строку google chrome dev урл и сохраняет открывшуюся страницу на жёсткий диск. Примерно вот так выглядит основная часть:

Код:
For $i = 0 To $arrayLength Step +1
	ClipPut($postUrl[$i])
	Sleep(250)
	Send("^v")
	Sleep(300)
	Send("{ENTER}")
	Sleep(4000)
	Send("^s")
	WinWaitActive("Сохранить как")
	Sleep(250)
	Send("{ENTER}")
	Sleep(500)
Next


Скрипт прекрасно отрабатывает в хроме, всё хорошо. Однако, когда цикл увеличивается до нескольких тысяч, что означает, что скрипт будет работать несколько часов, то появляется неожиданный баг: изредка не срабатывает Send(), что рушит всю работу скрипта. Никто не сталкивался с тем, что Send() может не выполниться? Конкретно в этом случае очень часто не срабатывает Send("{ENTER}") и один раз не сработал Send("^s").
 

Crusaderman

Новичок
Сообщения
50
Репутация
0
сталкивался с тем что когда пару дней работал бот, то из-за корявого кода и утечки было переполнения памяти и эррор. а вот чтоб сенд не срабатывал и не выподал в ошибку такого не было. хотя есть боты которые неделями работаю и отправляют все стабильно. возможно проблема именно в том чтоб страница не до конца прогружаеться. где то есть функция которая ждет загрузки странице. попробуй. тогда кстати и не надо будет 4 сек таймин.(я так понял это тайминг на загрузку окна)
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
Crusaderman, спасибо за ответ.

Каких-либо ошибок не выдаёт. Что интересно, проблема встречалась раз 5 или 6 именно со вторым Send("{ENTER}") когда открыто окно сохранения страницы сайта. Что я вижу:
1. ClipPut($postUrl[$i]) - отработало, в чём мы убедимся в следующем шаге.
2. Send("^v") - т.к. из-за бага у нас до сих пор открыто окно сохранения файла, то ctrl+v вставляет новый урл прямо в поле имени файла
3. WinWaitActive("Сохранить как") - срабатывает, т.к. это окно сейчас открыто и активно
4. Send("{ENTER}") - срабатывает, но уже винда говорит о том, что имя файла не допустимое, т.к. содержит запрещённые символы (это из-за того, что в имени файла у нас урл, который содержит двоеточия, слэш и прочее из-за пункта 2).
5. всё по кругу с первого пункта

В итоге пока пользователь не вмешается, у нас будет продолжаться вакханалия из вышеприведённых пунктов. Из-за чего произошёл баг - не понятно. Если скрипт работает только 5-10 минут, то всё норм. Как только больше часа - проявляется баг.

>>где то есть функция которая ждет загрузки странице. попробуй. тогда кстати и не надо будет 4 сек таймин.(я так понял это тайминг на загрузку окна)
верно, 4 секунды - это ожидание на загрузку страницы. Просто я только осваиваю autoIt, поэтому не нашёл пока как по-другому отловить это событие. Если подскажите, буду благодарен.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
multik [?]
Просто я только осваиваю autoIt, поэтому не нашёл пока как по-другому отловить это событие. Если подскажите, буду благодарен
справку читать надо, друзья. а не обмениваться догадками.
плюс - поиск по форуму. тут такие темы многократно обсуждались
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
joiner, про проблему с send() искал на форуме и в инете в целом, но ничего толком не нашёл. Если вы знаете в чём проблема или как её можно решить, то отпишите пожалуйста.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
multik
приведи полный скрипт. тогда можно будет подумать
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
joiner, по вашей просьбе выкладываю (см. вложение) почти полный свой скрипт, который выдаёт баг в течении часа своей работы.
 

Вложения

  • bagWithSend.zip
    14.2 КБ · Просмотры: 8

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
multik
накручивание рейтинга? :smile:
у меня вообще не работает твой скрипт.
думаю, что стоит использовать winhttp.au3
не нужно будет активных окон
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
joiner, возможно, у вас скрипт не заработал, потому вы не внесли изменения в строчках
WinActivate("FVD Speed Dial - Google Chrome")
WinWaitActive("FVD Speed Dial - Google Chrome")

у вас заголовок пустой вкладки хрома будет другой.

По поводу winhttp.au3 - если я правильно понял его возможности, то не подойдёт, потому что мне надо сохранить страницу сайта полностью со всеми картинками, js, css и прочими файлами. Поэтому я и использую хром для этих целей.

OffTopic:

>>накручивание рейтинга?
не в коем разе. Скачивание поста с хабра никак не сказывается на рейтинг или каким-то иным образом накручивает что-то ещё. Если в двух словах, то делаю для себя лично архив хабра, т.к. авторы проекта, как мне кажется, не особо ценят контент, который пишут люди.
 

Crusaderman

Новичок
Сообщения
50
Репутация
0
multik дело говорит. у Вас просто окно не активно в момент сенда. скрипт если без ошибки работает то должен выполняться. сам на этом ловился когда в пустоту выполнялись действия.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Так может в этом и проблема?
У мультика окно хрома становится неактивным и следовательно send не срабатывает.
Почему бы мультику в начале цикла, перед началом его ритуальных манипуляций, не делать
Код:
WinActivate("FVD Speed Dial - Google Chrome")
WinWaitActive("FVD Speed Dial - Google Chrome")


А происходить такая вакханалия может, например, если у мультика стоит нелицинзировання 7-ка, которая берёт и напоминает "возможно ты стал жертвой подделки...". И при этом активность переходит с хрома к этой самой напоминалке.
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
C2H5OH, теоретически, если в следствии каких-то событий, хром в течении часа теряет фокус, то в цикле по идее не сработает WinWaitActive("Сохранить как"), но он как раз никогда не давал сбоя. Косяк с изредка не срабатывающим Send("{ENTER}")

>>А происходить такая вакханалия может, например, если у мультика стоит нелицинзировання 7-ка
винда лицензионная. Хотя, теоретически, фокус может отобрать и другое предупреждение, например, обновление винды ... тут нужно подумать, может и в этом косяк
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
multik
Код:
...
For $i = 0 To $arrayLength Step +1
	ClipPut($postUrl[$i])
	Sleep(250)
	Send("^v")
	Sleep(300)
	Send("{ENTER}")
	Sleep(4000)
	Send("^s")
	WinWaitActive("Сохранить как")
;~ 	Send("{HOME}")
;~ 	Sleep(500)
;~ 	$zeroSymbols = ""
;~ 	If $counter < 10 Then
;~ 	   $zeroSymbols = "000" 
;~ 	EndIf
;~ 	If $counter < 100 And $counter >= 10 Then
;~ 	   $zeroSymbols = "00" 
;~ 	EndIf
;~ 	If $counter < 1000 And $counter >= 100 Then
;~ 	   $zeroSymbols = "0" 
;~ 	EndIf
;~ 	$namePage = $zeroSymbols & String($counter) & "_x_" & $postRaiting[$i] & "_x_" 
;~ 	
;~ 	Send($namePage)
;~ 	Sleep(250)
;~ 	Send("{ENTER}")
	ControlSetText("Сохранить как", "", "Edit1", StringFormat("%04d", $counter) & "_x_" & $postRaiting[$i] & "_x_")
	ControlClick("Сохранить как", "", "Button1")
	Sleep(2000)
	MouseClick("left", 840, 45)
	Sleep(250)
	$counter = $counter + 1
Next
...
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
InnI, спасибо за ответ.
Переписал приложение согласно вашим правкам. Для ясности помогло ли такое решение нужно погонять скрипт часиков 10. О результатах отпишу.
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
Как и обещал отчитываюсь по тестам.

Более 20 часов тестов выявили, что не срабатывает как минимум:
Send("^s")
Send("{HOME}")
очень часто второй Send("{ENTER}")
Send($namePage)

Есть подозрение, что и остальные Send() тоже иногда не срабатывают, просто эти случаи не приводят к сбою поведения скрипта и чтобы точно сказать, надо просмотреть пару тысяч сохранённых страниц, что не представляется возможным, по крайне мере в ручном режиме.

Что я пытался сделать:
1. Увеличивал значения для SendKeyDelay и SendKeyDownDelay до 10 и до 30
2. Отключал Punto Switcher
3. Обновил autoIt до версии 3.3.12
4. Запускал скрипт на другом компе, на котором кроме винды и totalComander больше ничего нет.
5. Увеличивал время для Sleep() до 2 сек. между Send()

всё равно при работе на несколько часов какой-то из Send() не срабатывал.
Заменил второй Send("{ENTER}") на ControlClick("Сохранить как", "", "Button1") и больше с ним проблем не было (спасибо InnI за подсказку). Можно предположить, что и остальные Send() стоит заменить альтернативными командами, хотя я пока теряюсь в догадках какая альтернатива для Send("^s") или Send("^v"). Но перспектива не радужная: если придёться писать ещё подобные долгие по времени тесты, то поиск альтернативы Send() - это довольно трудозатратный момент. Я решил попробовать поискать в ближайшие дни альтернативу AutoIt.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
multik [?]
Я решил попробовать поискать в ближайшие дни альтернативу AutoIt.
может не надо искать, а надо просто заплатить кому-нибудь и пусть напишут. не думаю что это будет дорого
могу с уверенностью сказать, что другой язык не выручит. а вот каши в голове наделает
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
joiner, дело в том, что скрипт о котором мы говорим - он же прост до безобразия. От силы 20 строчек кода (если убрать большой массив). Скрипт рабочий на 5-10 минутах. Т.е. я склоняюсь к мысле, что проблема не в скрипте, а в взаимодействии autoIt с виндой через команду Send(). Каким образом сторонний разработчик решит эту проблему? Будет искать альтернативы команде Send(), что бредово в перспективе, либо дорабатывать сам AutoIt, что маловероятно, да и денег столько мало кто даст.
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
multik [?]
Каким образом сторонний разработчик решит эту проблему?
Выкупит у владельцев сайта их архив статей.

искать альтернативы команде Send()
В вашем случае альтернативу нужно искать не команде, а способу сохранения интернет-страниц на диск.
Но уговаривать я вас не буду. Решили найди другой язык - ищите.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Я бы, например, рассматривал IE как альтернативу хрому.
Но, как говорится, хозяин - барин.
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
Цитировать
Каким образом сторонний разработчик решит эту проблему?
Выкупит у владельцев сайта их архив статей.
сомневаюсь, что у руководства хабра есть архив сайта

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


Добавлено:
Сообщение автоматически объединено:

Я бы, например, рассматривал IE как альтернативу хрому.
Переписал скрипт под IE - проблема осталась, что логично, ведь окно сохранения принадлежит не браузеру (хрому или IE), а ОС, поэтому смена браузера не помогла.
 
Верх