Internet explorer VBS检查站点是否已加载的简单方法
我对加载网站的脚本有一些问题。基本上,它很难检测站点何时完全加载,然后因为找不到指定的对象而开始出错 有没有办法不用ie.readystate或ie.busy来检查站点是否已完全加载?也许是通过一个循环,在设置对象之前检查对象是否在那里 比如: ie.busy和ie.readystate(任意组合)在加载表单时似乎非常不稳定 我可以使用wscript.sleep来确保网站完全加载,但在执行之间可能需要10秒或更长的等待时间 有什么想法吗?:) 编辑: 应要求: 有一件事我尝试过,正如有人声称他们成功地做到了这一点,那就是:Internet explorer VBS检查站点是否已加载的简单方法,internet-explorer,if-statement,vbscript,Internet Explorer,If Statement,Vbscript,我对加载网站的脚本有一些问题。基本上,它很难检测站点何时完全加载,然后因为找不到指定的对象而开始出错 有没有办法不用ie.readystate或ie.busy来检查站点是否已完全加载?也许是通过一个循环,在设置对象之前检查对象是否在那里 比如: ie.busy和ie.readystate(任意组合)在加载表单时似乎非常不稳定 我可以使用wscript.sleep来确保网站完全加载,但在执行之间可能需要10秒或更长的等待时间 有什么想法吗?:) 编辑: 应要求: 有一件事我尝试过,正如有人声称他们
Do while ie.readystate <> 4 wscript.sleep 200 Loop
Do while ie.busy wscript.sleep 200 Loop
然后我会得到一个错误,因为它找不到对象。根据我的经验,有3种就绪状态需要检查
' web page load timeout in 10ths of a second
Const WAIT_TIMEOUT = 300
Const ERR_TIMEOUT = 1000
Const READYSTATE_COMPLETE = 4
Sub WaitUntilLoaded(ie)
Dim i, j, ready
' wait for page to connect
i = 0
Do Until ie.readyState = READYSTATE_COMPLETE
WScript.Sleep 100
i = i + 1
If i > WAIT_TIMEOUT Then
Err.Raise ERR_TIMEOUT, , "Timeout"
End If
Loop
' wait for document to load
Do Until ie.document.readyState = "complete"
WScript.Sleep 100
i = i + 1
If i > WAIT_TIMEOUT Then
Err.Raise ERR_TIMEOUT, , "Timeout"
End If
Loop
' wait for frames to load
Do
ready = True
For j = 0 To ie.document.frames.Length - 1
If ie.document.frames(j).document.readyState <> "complete" Then
ready = False
WScript.Sleep 100
i = i + 1
If i > WAIT_TIMEOUT Then
Err.Raise ERR_TIMEOUT, , "Timeout"
End If
End If
Next
Loop Until ready
End Sub
“网页加载超时时间为10分之一秒
常数等待超时=300
常数错误超时=1000
常数READYSTATE_COMPLETE=4
次级WaitUntilLoaded(ie)
我,j,准备好了吗
'等待页面连接
i=0
直到ie.readyState=readyState\u完成为止
WScript.Sleep 100
i=i+1
如果我>等待\u超时,那么
错误。引发错误超时,“超时”
如果结束
环
'等待文档加载
直到ie.document.readyState=“完成”为止
WScript.Sleep 100
i=i+1
如果我>等待\u超时,那么
错误。引发错误超时,“超时”
如果结束
环
'等待帧加载
做
就绪=真
对于j=0到ie.document.frames.Length-1
如果ie.document.frames(j).document.readyState“完成”,则
就绪=错误
WScript.Sleep 100
i=i+1
如果我>等待\u超时,那么
错误。引发错误超时,“超时”
如果结束
如果结束
下一个
循环直到准备就绪
端接头
到目前为止,我能想到的最好的方法是下面的代码。它依靠捕获Internet Explorer的DocumentComplete事件来检测页面何时已完全加载
功能:
Option Explicit
'Sub Main
'--------
Dim DocumentComplete
Dim objIE : Set objIE = WScript.CreateObject("InternetExplorer.Application", "IE_")
objIE.Visible = True
If LoadPage("https://stackoverflow.com") Then
MsgBox "LoadPage completed."
Else
MsgBox "LoadPage timed out."
End If
Function LoadPage(ByVal strURL) 'As Boolean
'-------------------------------------------
Const TimeOut = 10 'Seconds
Dim StartTime : StartTime = Now()
DocumentComplete = False
objIE.Navigate strURL
Do While Not DocumentComplete
WScript.Sleep(1)
If DateDiff("s", StartTime, Now()) > TimeOut Then
LoadPage = False
Exit Function
End If
Loop
LoadPage = True
End Function 'LoadPage
Sub IE_DocumentComplete(pDisp, URL)
'-----------------------------------
' Fires when a document is completely loaded and initialized.
' https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa768282(v=vs.85)
If (pDisp Is objIE) Then
DocumentComplete = True
End If
End Sub 'IE_DocumentComplete
- 脚本将等待加载所有元素,包括帧 和子帧,然后报告页面已加载
- 避免不必要的延迟等待检查各种属性,如 忙和使用睡眠的ReadyState
- LoadPage功能具有超时安全功能以防止 无限循环,可调整
让我们了解您迄今为止尝试的
ie.busy
和ie.readystate
属性的方式(编辑您的问题),以及根据要求在所有奇数情况下显示的问题。虽然我不知道为什么它是相关的。。在我能想到的每一张表格中尝试过ie.readystate和ie.busy,结果总是在填写我必须填写的表格时出错,因为它遗漏了一些东西。谢谢。不完全是你的代码,我的代码在错误检查或其他方面很糟糕。。但是在ie.readystate 4或ie.busy或ie.document.readystate“complete”wscript.sleep 500循环Do时使用Do,直到ie.document.readystate=“complete”wscript.sleep 500循环工作得很好。我很惊讶它能工作,因为它在VBScript中没有短路,如果在页面连接之前尝试访问ie.document,应该会出现异常-但如果它能工作,那就太好了。
Set Helem = IE.document.getElementByID("username")
Helem.Value = "xxxx"
' web page load timeout in 10ths of a second
Const WAIT_TIMEOUT = 300
Const ERR_TIMEOUT = 1000
Const READYSTATE_COMPLETE = 4
Sub WaitUntilLoaded(ie)
Dim i, j, ready
' wait for page to connect
i = 0
Do Until ie.readyState = READYSTATE_COMPLETE
WScript.Sleep 100
i = i + 1
If i > WAIT_TIMEOUT Then
Err.Raise ERR_TIMEOUT, , "Timeout"
End If
Loop
' wait for document to load
Do Until ie.document.readyState = "complete"
WScript.Sleep 100
i = i + 1
If i > WAIT_TIMEOUT Then
Err.Raise ERR_TIMEOUT, , "Timeout"
End If
Loop
' wait for frames to load
Do
ready = True
For j = 0 To ie.document.frames.Length - 1
If ie.document.frames(j).document.readyState <> "complete" Then
ready = False
WScript.Sleep 100
i = i + 1
If i > WAIT_TIMEOUT Then
Err.Raise ERR_TIMEOUT, , "Timeout"
End If
End If
Next
Loop Until ready
End Sub
Option Explicit
'Sub Main
'--------
Dim DocumentComplete
Dim objIE : Set objIE = WScript.CreateObject("InternetExplorer.Application", "IE_")
objIE.Visible = True
If LoadPage("https://stackoverflow.com") Then
MsgBox "LoadPage completed."
Else
MsgBox "LoadPage timed out."
End If
Function LoadPage(ByVal strURL) 'As Boolean
'-------------------------------------------
Const TimeOut = 10 'Seconds
Dim StartTime : StartTime = Now()
DocumentComplete = False
objIE.Navigate strURL
Do While Not DocumentComplete
WScript.Sleep(1)
If DateDiff("s", StartTime, Now()) > TimeOut Then
LoadPage = False
Exit Function
End If
Loop
LoadPage = True
End Function 'LoadPage
Sub IE_DocumentComplete(pDisp, URL)
'-----------------------------------
' Fires when a document is completely loaded and initialized.
' https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/aa768282(v=vs.85)
If (pDisp Is objIE) Then
DocumentComplete = True
End If
End Sub 'IE_DocumentComplete