Что нового

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

edyapd

Осваивающий
Сообщения
380
Репутация
30
На сколько я понимаю команда "Send" отправляет в активное окно. И у вас тут идёт путаница. Тогда может стоит использовать "ControlSend"? Она отправит символы имено туда, куда вы укажите.
OffTopic:
Если же вы желаете сохранить себе на компьютер сайт, то для этого есть специализированые программы
 
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
Тогда может стоит использовать "ControlSend"?
Спасибо, этот вариант я ещё не пробовал. Погоняю пару часов с ControlSend, вдруг повезёт.

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

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Переписал скрипт под IE - проблема осталась

Та ладно!
Такая хрень должна колбасить даже в свёрнутом окне
Код:
Send("^s")
    WinWaitActive("Сохранение веб-страницы")
    Sleep(250)
    ControlClick("Сохранение веб-страницы","","[CLASS:Button; INSTANCE:1]")
    Sleep(500)


А IE нужен для того чтобы по человечески по страницам переходить (опять же даже в свёрнутом окне)
Код:
_IENavigate($oIE, $postUrl[$i])
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
multik
Пробуйте. Проверял на Win7, IE10, AutoIt 3.3.12.0.
Данные для массива находятся в файле post.txt в формате URL;рейтинг. В файле допускается только одна пустая строка в конце. Файл должен находиться в папке скрипта. Пример файла во вложении. Предварительно сохраните какую-нибудь страницу, чтобы IE запомнил папку для сохранения.
Код:
#include <IE.au3>
#include <File.au3>
Opt("WinWaitDelay", 100)

Global $post
_FileReadToArray("post.txt", $post, $FRTA_COUNT, ";")
If @error Then
    MsgBox(0, "Error", "Ошибка чтения файла")
    Exit
EndIf

_IELoadWaitTimeout(10000)
$oIE = _IECreate()
WinWait("[class:IEFrame]")
Sleep(500)

For $i = 1 To $post[0][0]
  TrayTip("Загрузка", "Страница " & $i & " из " & $post[0][0], 3)
  _IENavigate($oIE, $post[$i][0])
  If @error Then
    ConsoleWrite("Строка " & $i & ". Таймаут. Сохранение отменено: " & $post[$i][0] & @CRLF)
    ContinueLoop
  EndIf
  Do
    ControlSend("[class:IEFrame]", "", "Internet Explorer_Server1", "^s")
    $wnd = WinWait("Сохранение веб-страницы", "", 1)
  Until $wnd
  If $i = 1 Then Sleep(300)
  ControlSetText($wnd, "", "Edit1", StringFormat("%04d", $i) & "_x_" & $post[$i][1] & "_x_")
  ControlClick($wnd, "", "Button1")
  $wnd = WinWait("Сохранение веб-страницы", "Выполнено:")
  WinWaitClose($wnd)
  If WinExists("Ошибка сохранения веб-страницы") Then
    ControlClick("Ошибка сохранения веб-страницы", "", "Button1")
    ConsoleWrite("Строка " & $i & ". Ошибка сохранения страницы: " & $post[$i][0] & @CRLF)
  EndIf
Next

_IEQuit($oIE)
MsgBox(0, "Готово", "Работа выполнена")
 

Вложения

  • post.zip
    5.8 КБ · Просмотры: 4
Автор
M

multik

Новичок
Сообщения
12
Репутация
0
Товарищи, похоже edyapd оказался чертовски прав. Я переписал скрипт и уже на протяжении 5 часов никаких косяков!

Общая мысль: на длительных скриптах (более часа работы) почему-то не отправляется Send(). Как вариант могу предположить, что почему-то на мгновение теряется фокус активного окна и поэтому 1-2 раза в час Send() не срабатывает. Выход: заменяем его на ControlSend.

Немного технической информации:
мой простой скрипт условно состоит из двух частей - работа с браузером, а именно с его адресной строкой, и работа с окном сохранения файла ОС. Все мои Send() в окне сохранения легко заменяются на ControlSend(). А вот с адресной строкой хрома сложнее, т.к. я не понял как до неё добраться через ControlSend(). Получилось с ней работать через UIAutomate, но я не понял как можно отправить команды вроде CTrl+V или Enter, поэтому в итоге я реализовал всю работу с адресной строкой через MouseClick(). Скрипт увеличился всего на пару строчек, но зато в нём все Send() были заменены и уже погоняв скрипт более 5 часов могу сказать, что всё работает отлично.

InnI, я не тестировал ваш скрипт, но думаю, что с ним всё будет ок, т.к. в нём нет Send().

Хотелось бы отдельно отметить весьма дружелюбную атмосферу комьюнити, большое спасибо за помощь! AutoIt крутая штука.
 
Верх