VBA-Excel-使用IE抓取网站-当用户在等待readystate时关闭IE应用程序时,如何避免永远循环?

问题描述 投票:0回答:1

我正在尝试访问需要身份验证的内部网页。用户正确登录后,我将在应用程序网页中查找特定模式,然后将IE.visible = False设置为。我设法使其正常工作,但是如果由于某种原因用户在身份验证完成之前关闭了IE窗口,则我的宏就会失去控制权并永远等待答复。有什么办法可以防止它发生?这是我的代码:

Sub myapplication()
    Dim IE As New InternetExplorerMedium
    Dim elements As MSHTML.IHTMLElementCollection: Dim element As MSHTML.IHTMLElement
    Dim URL As String: Dim flag As Boolean

    logindate = Format(Date, "dd mmm yyyy"): clockon = Timer: delay = 10

    URL = "http://app1.htm"

    IE.Visible = True: IE.navigate URL

    Do While IE.readyState <> READYSTATE_COMPLETE Or IE.Busy
    Loop

    Set HTMLDoc = IE.document
    Set elements = HTMLDoc.getElementsByClassName("normalText")

    flag = False
    While flag = False
        For Each element In elements
            If InStr(element.innerHTML, logindate) Then
                IE.Visible = False: flag = True
                Exit For
            End If
            clockoff = Timer
            If delay > clockoff - clockon Then flag = True
        Next
    Wend
End Sub
excel vba internet-explorer web-scraping
1个回答
0
投票

[我了解您的代码将启动IE并将其显示为可见,以便用户可以完成登录过程,然后在执行某些代码后将IE显示为false。

您说过,如果用户在身份验证过程中手动关闭IE窗口,则您的代码将失去控制。

有几种方法可以尝试解决此问题。

您可以尝试在全屏中启动IE浏览器。因此它不会显示任何浏览器窗口控件和关闭按钮。

Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.FullScreen = True

请注意,通过这种方法,用户可以使用ALT + TAB键切换窗口,然后用户可以尝试手动将其关闭。

您可以尝试的另一种方法是使用OnQuit event

OnQuit事件将在IE浏览器关闭时触发。因此,您可以尝试在此事件上将对象设置为Nothing,或采取必要的步骤来重置代码。这样,您可以控制代码。

您可以参考下面的步骤来实现OnQuit事件。

  1. 创建名称为clsIE的Class模块。

enter image description here

  1. [在类模块中添加以下代码。

    选项显式

    Public WithEvents IE As InternetExplorer
    
    Private Sub Class_Initialize()
        Set IE = New InternetExplorer
    End Sub
    
    Private Sub Class_Terminate()
        Set IE = Nothing
    End Sub
    
    Private Sub Ie_OnQuit()
        MsgBox "Closed now"
    End Sub
    
  2. 创建一个新模块,并在下面添加代码。

enter image description here

 Option Explicit

    Dim objApp As clsIE

    Sub Tester()
    '// Ivan F Moala
        Set objApp = New clsIE

        With objApp
            .IE.FullScreen = True
            .IE.Visible = True
            .IE.Navigate ("http://example.com")
        End With

    End Sub

现在,如果您运行模块并尝试手动关闭IE浏览器,它将显示一条消息。此外,您可以尝试根据您的要求修改代码。

参考:

Code in IE's Close event

© www.soinside.com 2019 - 2024. All rights reserved.