等待Internet Explorer加载所有内容?

时间:2017-02-01 17:21:58

标签: vb.net web-scraping

我正在抓一个网页,并等待网络浏览器完成加载,但由于某种原因它不是。我正在尝试在页面上获取值,但等待部分没有等待,因此当应该有值时,值返回空白。 IE页面已完成加载,但页面上元素的值尚未加载。有没有办法在继续下一行代码之前等待所有元素加载完成?这是我的代码:

 
    <div class="wrapper">
        <div class="box">
        Left Side Menu
        </div>
        <div class="box">
        Random Content
        </div>
        <div class="box">
        Right Side Menu
        </div>
    </div>

1 个答案:

答案 0 :(得分:0)

不应使用Application.DoEvents()以保持您的用户界面响应!我真的无法强调这一点!不仅经常使用它是一个糟糕的黑客,它只会产生比它解决的更多的问题。

有关详细信息,请参阅:Keeping your UI Responsive and the Dangers of Application.DoEvents

正确的方法是使用InternetExplorer.DocumentComplete event,这是在页面(或其子部分,例如iframe)完全加载时引发的。这是一个如何使用它的简短示例:

  1. Solution Explorer中右键点击您的项目,然后按Add Reference...

  2. 转到COM标签,找到名为Microsoft Internet Controls的引用,然后按OK

    Microsoft Internet Controls COM Reference

  3. SHDocVw命名空间导入到您要使用它的文件中,并创建类型为WithEvents的类级InternetExplorer变量,以便您可以订阅Handles clause

  4. 的活动

    瞧!

    Imports SHDocVw
    
    Public Class Form1
    
        Dim WithEvents IE As New InternetExplorer
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            IE.Navigate("http://www.google.com/")
        End Sub
    
        Private Sub IE_DocumentComplete(pDisp As Object, ByRef URL As Object) Handles IE.DocumentComplete
            MessageBox.Show("Successfully navigated to: " & URL.ToString())
        End Sub
    End Class
    

    或者,您也可以使用lambda expression

    在线订阅该活动
    Imports SHDocVw
    
    Public Class Form1
    
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim IE As New InternetExplorer
            IE.Navigate("http://www.google.com/")
    
            AddHandler IE.DocumentComplete, Sub(pDisp As Object, ByRef URL As Object)
                                                MessageBox.Show("Successfully navigated to: " & URL.ToString())
                                            End Sub
        End Sub
    End Class