Краткий ответ: нет события all scripts completed
, поэтому это невозможно.
Однако, если вы ищете solution
, а не короткий not possible
, учтите следующее:
Indy TIdHTTP вообще не обрабатывает JS-скрипты и не должен этого делать. Его функциональность заключается в выполнении (GET, POST, ...) HTTP-запросов.
Напротив, браузеры имеют встроенный JS-движок для обработки клиентских сценариев. Проблема в том, что они могут работать непрерывно, даже с некоторыми паузами. Браузеры имеют только DOM
is loaded
событие. Многие веб-сайты прикрепили код к этому событию, чтобы выполнить более поздний код JS.
Большинство веб-сайтов запускают серию клиентских сценариев DOM-преобразования после события DOM is ready
, и после этого мы можем каким-то образом считать , что страница готова для чтения реальными пользователями или веб-скребками.
Чтобы поймать это состояние, нужно рассмотреть несколько подходов:
- Таймер. Проще всего, но не лучше, загрузите страницу и подождите некоторое время. Рассмотрим здесь проблемы с сетью или изменения страницы, которые позже могут занять больше или меньше времени. Иногда чрезмерное ожидание тратит время выполнения.
- Периодическая проверка DOM-элемента / свойства. Иногда сценарии добавляют некоторые свойства или элементы, когда достигается необходимое состояние. Проанализируйте ваш готовый загруженный сайт.
- Занято или ReadyState. TWebBrowser или OLE
B := CreateOleObject('InternetExplorer.Application');
имеют свойства Busy и ReadyState. Вы можете проверить, не занято ли это в течение некоторого времени, считать его завершенным.
- Разумная комбинация упомянутых выше способов. Например, Browser.Busy с Timeout может помочь. Если сайт конкретный и один, поиск элемента может работать. Это предпочтительный путь.
Учитывая это, вы можете определить свою собственную функцию NavigateAndWaitComplete(URL, [Element], Timeout)
, которая будет творить чудеса.