如何使WebBrowser等到它完全加载?

时间:2012-03-19 19:10:31

标签: c# winforms webbrowser-control

我有一个带有Web浏览器控件的C#表单。

我试图循环访问不同的网站。

但是,我无法控制URL地址加载到我的表单Web浏览器元素中。

这是我用于浏览URL地址的功能:

public String WebNavigateBrowser(String urlString, WebBrowser wb)
{
    string data = "";
    wb.Navigate(urlString);
    while (wb.ReadyState != WebBrowserReadyState.Complete)
    {
        Application.DoEvents();
    }
    data = wb.DocumentText;
    return data;
}

如何使循环等到完全加载?

我的循环是这样的:

foreach (string urlAddresses in urls)
{
    WebNavigateBrowser(urlAddresses, webBrowser1);
    // I need to add a code to make webbrowser in Form to wait till it loads
}

4 个答案:

答案 0 :(得分:9)

将此添加到您的代码中:

webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);

填写此功能

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
     //This line is so you only do the event once   
     if (e.Url != webBrowser1.Url) 
        return;


        //do you actual code        



    }

答案 1 :(得分:6)

经过一段时间的蹩脚IE浏览器功能后,我发现了制作一些判断页面加载完整的最准确方法。

永远不要使用WebBrowserDocumentCompletedEventHandler事件 使用WebBrowserProgressChangedEventHandler和下面的一些修改。

//"即"是我们的网络浏览器对象

ie.ProgressChanged += new WebBrowserProgressChangedEventHandler(_ie);
private void _ie(object sender, WebBrowserProgressChangedEventArgs e)
{
  int max = (int)Math.Max(e.MaximumProgress, e.CurrentProgress);
  int min = (int)Math.Min(e.MaximumProgress, e.CurrentProgress);
  if (min.Equals(max))
  {
   //Run your code here when page is actually 100% complete
  }
}

简单的天才方法,我发现这个问题谷歌搜索"如何睡觉网页浏览器或暂停"

答案 2 :(得分:1)

根据MSDN(包含示例源),您可以使用DocumentCompleted事件。可以找到有关如何区分事件调用的其他非常有用的信息和来源here

答案 3 :(得分:0)

你遇到的事情发生在我身上。 readyStete.complete在某些情况下不起作用。这里我在document_completed中使用bool来检查状态

 button1_click(){
    //go site1 
    wb.Navigate("site1.com");
    //wait for documentCompleted before  continue to  execute  any further 
    waitWebBrowserToComplete(wb); 

    // set some values in html page
    wb.Document.GetElementById("input1").SetAttribute("Value", "hello");
    //  then click submit. (submit does navigation)
    wb.Document.GetElementById("formid").InvokeMember("submit");
    // then wait for doc complete        
    waitWebBrowserToComplete(wb);


    var processedHtml = wb.Document.GetElementsByTagName("HTML")[0].OuterHtml;
    var rawHtml = wb.DocumentText;
}

// helpers
//instead of checking  readState . we get state from DocumentCompleted Event via bool value
bool webbrowserDocumentCompleted = false;
public static void waitWebBrowserToComplete(WebBrowser wb)
{
  while (!webbrowserDocumentCompleted )
      Application.DoEvents();
  webbrowserDocumentCompleted = false;
}

form_load(){
  wb.DocumentCompleted += (o, e) => {
     webbrowserDocumentCompleted = true;
  };
}