我正在尝试将状态请求自动化到第三方供应商网站上工作。目前我让我的脚本在每个操作后等待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...
答案 0 :(得分:2)
右键单击脚本的托盘图标,然后选择选项"打开"你可以看到IEload函数被卡住的那一行,这可以告诉你什么可能阻碍你的脚本。
IEload函数有一些问题,因为它可以挂起,如果浏览器比函数内的睡眠和其他一些事情更快地跳过...
我通常用来让IE加载的行看起来像这样
While wb.readyState != 4 || wb.document.readyState != "complete" || wb.busy
Sleep, 10
还有其他方法可以检查加载状态,例如使用ComObjConnect()并连接到DocumentComplete事件。
还有其他更简单的方法,比如检查html元素是否存在,但通常只有在处理页面脚本更改的不完整页面,框架或元素时才需要...
答案 1 :(得分:1)
我的一个脚本曾经有过这个问题。我发现这是因为他们的服务器不允许回答ping请求,所以也许IELoad在里面的某个地方使用它们。它会在第一次正常工作,但不会在第一次刷新后工作。我必须关闭网页才能重新打开它,而不是只使用IE.refresh()。