none
等待webbrowser完全加载完毕的方法讨论 RRS feed

  • 问题

  • 最近写一个程序,需要操作webbrowser里面的dom元素。

    头痛在如何判断webbrowser是否完全加载完毕。

    用DocumentCompleted事件或者判断IsBusy属性都遇到了各种各样的问题,比如webbrower里面的网页包含了跳转代码,在IsBusy为false之后,开始dom操作的时候,webbrower其实又在加载新网页,造成后面程序出错。

    后来自己写了一个sub用来等待网页加载完成,基本满足了需求。

    如下,登录百度的例子

    WebBrowser1.Url = New Uri("http://passport.baidu.com/?logout")
    
    waitwebCompleted()
    
    WebBrowser1.Document.GetElementById("username_normal").SetAttribute("Value", “aaa”)
    WebBrowser1.Document.GetElementById("normModPsp").SetAttribute("Value", "bbb")
    

    waitwebCompleted()的代码如下

    Private Sub waitwebCompleted()
     Do
      If WebBrowser1.IsBusy Then : Application.DoEvents() '如果isbusy就继续执行
      Else
      Dim tmpNow As Date = Now
      Do Until WebBrowser1.IsBusy Or Now.Subtract(tmpNow).Seconds > 0.5
       Application.DoEvents()
      Loop
    
      If WebBrowser1.IsBusy Then : Continue Do
      Else : Exit Sub
      End If      '如果在0.5秒之内IsBusy始终为false没有变化,就结束
    
      End If
     Loop
    End Sub



    但是总感觉这样做很繁琐。

    不知道大家在处理类似问题的时候是怎么做的。

     



    2011年8月24日 5:50

答案

  •   Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        Dim webBrowser As WebBrowser = DirectCast(sender, WebBrowser)
        If webBrowser.ReadyState = WebBrowserReadyState.Complete Then
     '网页加载完毕后要执行的代码
        End If
      End Sub
    


    或者这样写

    Public Sub A()
          m_browser.Navigate(url)
          While m_browser.ReadyState <> WebBrowserReadyState.Complete
            Application.DoEvents()
          End While
          '浏览器Dom载入完毕要执行的代码
    End Sub
    
    

     


    算神的博客
    2011年8月24日 6:27