Какое совпадение, я просто искал ту же проблему, я использовал readyState и столкнулся с вашей проблемой, я нашел похожие обработчики событий в VB , как и вы пытался использовать, но, как вы сказали, он будет выполняться каждый раз, когда срабатывает событие.
Соль:
Я посмотрел в MSDN и обнаружил свойство Занято , которое получает значение, указывающее, участвует ли объект в операции навигации или загрузки, теперь я использую его в дополнение к
readyState , Busy предназначен для ожидания ответа от удаленного сервера, а readyState для объекта, который готов к выполнению действий с ним.
примечание: я пытался использовать Busy в одиночку, но иногда ответ слишком быстрый, и следующая инструкция пытается быть выполнена до того, как объект будет готов.
Пример в AHK (тестовая страница входа в систему 20 раз с высокой скоростью):
Loop, 20
{
Global IE := ComObjCreate("InternetExplorer.Application")
IE.visible := 1
IE.Silent := 0
Login:
IE.navigate("www.example.com")
While (IE.ReadyState != 4 or IE.Busy = True)
continue
IE.document.forms("login").name.value := "Username"
IE.document.forms("login").password.value := "Password"
;IE.document.forms("login").s1.Click()
IE.document.forms("login").Submit()
While (IE.ReadyState != 4 or IE.Busy = True)
continue
;sleep 1000 ;use it just to see that you are login successfully
IE.Stop()
IE.Quit()
}