Как заставить WebBrowser ждать, пока он полностью загрузится? - PullRequest
5 голосов
/ 19 марта 2012

У меня есть форма C # с элементом управления веб-браузера.

Я пытаюсь зайти на разные веб-сайты в цикле.

Однако я не могу контролировать URL-адрес для загрузки в элемент веб-браузера формы.

Это функция, которую я использую для навигации по 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 ]

9 голосов
/ 19 марта 2012

Добавьте это к своему коду:

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        



    }
6 голосов
/ 22 октября 2013

Через некоторое время гнева по поводу дурацкой функциональности IE я наткнулся на создание чего-то, что является наиболее точным способом оценки загруженности страницы.

Никогда не используйте событие WebBrowserDocumentCompletedEventHandler используйте WebBrowserProgressChangedEventHandler с некоторыми изменениями, показанными ниже.

// "ie" - это объект нашего веб-браузера

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
  }
}

Простой гениальный метод для этого, я нашел этот вопрос, погуглив "Как спать веб-браузер или поставить на паузу"

1 голос
/ 19 марта 2012

В соответствии с MSDN (содержит образец источника) для этого можно использовать событие DocumentCompleted.Дополнительную очень полезную информацию и источник, который показывает, как различать вызовы событий, можно найти здесь .

0 голосов
/ 05 января 2017

то, что ты пережил, случилось со мной.readyStete.complete не работает в некоторых случаях.здесь я использовал bool в document_completed для проверки состояния

 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;
  };
}
...