Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как заставить WebBrowser дождаться полной загрузки?

Автор вопроса: Val NolavОтветов: 4

У меня есть форма 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
}
  • Пожалуйста, не ставьте перед заголовками префикс C # и тому подобное. Вот для чего нужны теги. John Saunders 19.03.2012
  • Прикрепите метод к событию DocumentCompleted. Brian Graham 19.03.2012
  • В ПОРЯДКЕ! Я сделал это так, потому что это помогает мне, когда я пытаюсь найти что-то в stackoverflow. Val Nolav 19.03.2012
  • Брайан, как я могу это сделать? Вы можете дать мне образец кода? Val Nolav 19.03.2012
  • возможный дубликат Как использовать событие DocumentCompleted для управления веб-браузером в C #? < / а> 20.03.2012

winformswebbrowser-control

Ответы

Ответ 1 · рейтинг 9 · SamFisher83

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

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


    }

Ответ 2 · рейтинг 6 · user2887749

После некоторого периода гнева из-за дрянной функциональности 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
  }
}

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

Ответ 3 · рейтинг 1 · Yahia

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

Ответ 4 · bh_earth0

то, что вы пережили, и случилось со мной. 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;
  };
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы