Internet explorer VBS检查站点是否已加载的简单方法

Internet explorer VBS检查站点是否已加载的简单方法,internet-explorer,if-statement,vbscript,Internet Explorer,If Statement,Vbscript,我对加载网站的脚本有一些问题。基本上,它很难检测站点何时完全加载,然后因为找不到指定的对象而开始出错 有没有办法不用ie.readystate或ie.busy来检查站点是否已完全加载?也许是通过一个循环,在设置对象之前检查对象是否在那里 比如: ie.busy和ie.readystate(任意组合)在加载表单时似乎非常不稳定 我可以使用wscript.sleep来确保网站完全加载,但在执行之间可能需要10秒或更长的等待时间 有什么想法吗?:) 编辑: 应要求: 有一件事我尝试过,正如有人声称他们

我对加载网站的脚本有一些问题。基本上,它很难检测站点何时完全加载,然后因为找不到指定的对象而开始出错

有没有办法不用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种就绪状态需要检查

  • InternetExplorer对象(即ReadyState=4)
  • 文档readystate(即document.readystate=“complete”)
  • 为了让它完全万无一失:

  • 文档框架的readystate(如果页面有框架,这可能需要进行递归检查)
  • 下面是我用于此任务的VBA sub的VBScript改编

    ' 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