IE崩溃后恢复宏或不响应

时间:2018-06-18 19:58:01

标签: vba selenium internet-explorer web-scraping internet-explorer-11

我需要从网站获取数据 我正在使用SHDocVw.InternetExplorerMSHTML.HTMLDocument来获取数据。 在获取每条记录并为每条记录创建新实例后,我正在使用set IE = NothingIE.Quit,但只要IE停止响应或崩溃,宏就会停止。 我只是想在IE崩溃并从下一个记录恢复时跳过该记录 是否可以忽略IE中的每个弹出窗口并从下一个记录中恢复以获取数据。

For Each Cell In Selection

    URL = Cell.Value
Set IE = New SHDocVw.InternetExplorer
        With IE
        .navigate URL
        .Visible = True
        Do While .readyState <> READYSTATE_COMPLETE Or .Busy = True
            DoEvents
        Loop

        Application.Wait (Now + TimeValue("00:00:05"))

        Set Doc = .document
'*Fetch the Elements and Records by using getElementbyid*
End With
Set IE = Nothing
IE.quit
Next Cell

我也尝试过使用硒但面临同样的问题。 我只是想忽略如果IE崩溃或没有响应特定记录并获取下一个。 IE在2000条记录之后的某个时间崩溃,有时在100条记录之后崩溃。 我需要在一夜之间运行这个宏。 我正在使用IE 11和Excel 2010

1 个答案:

答案 0 :(得分:0)

你当然可以对此进行改进,但这是基本启动方法。

请注意,我们不会继续创建和销毁IE的实例。我们创建一个并使用它来处理各种URL,然后在最后关闭它。

一个简单的On Error GoTo Label用于处理失败。然后清除错误。标签将程序带到下一个循环。

有可能引入一个带超时的循环来尝试设置元素,即Do : On Error Resume Next : Set a = .document.getElemmentById("id") : On Error GoTo O : Loop While a Is Nothing,但在循环中有一个超时子句,以避免永远不会结束循环。

对于IE悬挂部分是很难说的。也许处理块中的URL并结合上面提到的超时循环,其中尝试将元素设置为变量?

总的来说,如果可能的话,确定崩溃的原因,并针对您的解决方案来处理。

Option Explicit

Public Sub test()
    Dim IE As Object, doc As Object
    Set IE = New SHDocVw.InternetExplorer

    With IE
        .Visible = True
        Dim currentCell As Range, URL As String
        Application.DisplayAlerts = False
        On Error GoTo nextURL
        For Each currentCell In Selection
            URL = currentCell.Value
            .navigate URL

            While .Busy Or .readyState < 4: DoEvents: Wend

            Application.Wait (Now + TimeValue("00:00:05"))
            Set doc = .document

            'Attempt to getElementByID
nextURL:
            If Err.Number <> 0 Then Err.Clear
            If IE Is Nothing Then Set IE = New SHDocVw.InternetExplorer
        Next currentCell
    End With
   IE.Quit
   Application.DisplayAlerts = True
End Sub