У меня есть форма 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
}
Ответ 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;
};
}