AutoHotKey 等待 Internet Explorer 完成加载网页

AutoHotKey Wait for Internet Explorer to finish loading web page

我正在尝试将状态请求自动化到工作中的第 3 方供应商网站。目前我让我的脚本在每次操作后等待 40 秒以等待页面加载。 (在最坏的情况下,加载时间 运行 从 1 秒增加到几分钟)。

有没有办法让我的脚本在继续之前等待 IE 完成加载?

我尝试了代码 IELoad(wb) from here,但它并不总是有效。 (有时它只是坐在那里,我必须按 F5)。昨晚我让它 运行,它停止了大约 25 例。

观察:页面将被加载,但 IELoad(wb) 函数仍在等待。

; You need to send the IE handle to the function unless you define it as global.
IELoad(wb) {   
    If !wb    ;If wb is not a valid pointer then quit
        Return False
    Loop    ;Otherwise sleep for .1 seconds untill the page starts loading
        Sleep,100
    Until (wb.busy)
    Loop    ;Once it starts loading wait until completes
        Sleep,100
    Until (!wb.busy)
    Loop    ;optional check to wait for the page to completely load
        Sleep,500
    Until (wb.Document.Readystate = "Complete")
    Return True
}

wb := ComObjCreate("InternetExplorer.Application")
wb.Visible := True
wb.Navigate("www.someVendor.com")
IELoad(wb)

; This is the part I have the most problems with
wb.document.getElementById("someLink").click()

; The page might be loaded, but it will sit there and wait forever
IELoad(wb)

; Do some clicking and searching...

通过右键单击脚本的托盘图标并选择选项 "open",您可以看到 IEload 函数所在的行,这可以告诉您可能是什么阻碍了您的脚本。

IEload 函数存在一些问题,因为如果浏览器向前跳转的速度快于函数中使用的休眠和其他一些事情,它可能会挂起...

我通常用来让 IE 加载的行如下所示

While wb.readyState != 4 || wb.document.readyState != "complete" || wb.busy
    Sleep, 10

还有其他方法可以检查加载状态,例如使用 ComObjConnect() 和连接到 DocumentComplete 事件。

还有其他更简单的方法,比如检查 html 元素是否存在,但这通常只在处理不完整的页面、框架或被页面脚本更改的元素时才需要...

我的一个脚本曾经有过这个问题。我发现那是因为不允许他们的服务器响应 ping 请求,所以可能 IELoad 在内部某处使用了它们。第一次可以正常工作,但第一次刷新后就不行了。我不得不在重新打开之前关闭网页,而不是只使用 IE.refresh().