Обнаружение полной загрузки веб-браузера
Как я могу обнаружить, когда элемент управления System.Windows.Forms.WebBrowser завершил загрузку?
Я пытался использовать события Navigate и DocumentCompleted, но оба они были подняты несколько раз во время загрузки документа!
Ответы
Ответ 1
Я думаю, что событие DocumentCompleted
будет запущено для всех загруженных дочерних документов (например, JS и CSS). Вы можете посмотреть WebBrowserDocumentCompletedEventArgs
в DocumentCompleted
и проверить свойство Url и сравнить его с URL-адресом главной страницы.
Ответ 2
Я сделал следующее:
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
Последняя загруженная страница, как правило, предназначена для навигации, поэтому это должно работать.
От здесь.
Ответ 3
Следующее должно работать.
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
//Check if page is fully loaded or not
if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
return;
else
//Action to be taken on page loading completion
}
Ответ 4
Обратите внимание, что URL-адрес в DocumentCompleted может отличаться от навигации по URL-адресу из-за переноса сервера или нормализации URL-адреса (например, вы переходите на www.microsoft.com и получаете http://www.microsoft.com в документе завершено)
На страницах без фреймов это событие срабатывает один раз после завершения загрузки. На страницах с несколькими кадрами это событие срабатывает для каждого навигационного фрейма (поддержка заметки поддерживается внутри фрейма, например, щелчок по ссылке в кадре может перемещаться по кадру на другую страницу). Кадр навигации самого высокого уровня, который может быть или не быть браузером верхнего уровня, запускает окончательное событие DocumentComplete.
В собственном коде вы сравниваете отправителя события DocumentComplete, чтобы определить, является ли событие последним событием в навигации или нет. Однако в Windows Forms параметр отправителя не завершается WebBrowserDocumentCompletedEventArgs. Вы можете разорвать собственное событие, чтобы получить значение параметра, или проверить свойство readystate в браузере или документы фрейма в обработчике событий DocumentCompleted, чтобы узнать, находятся ли все кадры в состоянии готовности.
Существует проба с методом readystate, как будто существует диспетчер загрузки, и навигация - в загружаемый файл, навигация может быть отменено диспетчером загрузки и readistate, не будет завершено.
Ответ 5
У меня была такая же проблема с несколькими событиями DocumentCompleted
, которые были выпущены, и опробовали все вышеприведенные предложения. Наконец, кажется, что в моем случае ни свойство IsBusy
не работает, ни свойство Url
, но ReadyState
кажется мне то, что мне нужно, потому что он имеет статус "Интерактивный" при загрузке нескольких кадров и получает статус "Завершить" только после загрузки последнего. Таким образом, я знаю, когда страница полностью загружена всеми ее компонентами.
Я надеюсь, что это тоже поможет другим:)
Ответ 6
Кажется, он не вызывает события DocumentCompleted/Navigated для внешних файлов Javascript или CSS, но он будет использоваться для iframe. Как говорит ПК, сравните свойство WebBrowserDocumentCompletedEventArgs.Url(у меня еще нет кармы, чтобы сделать комментарий).
Ответ 7
Если вы используете WPF, есть событие LoadCompleted
.
Если это Windows.Forms
, событие DocumentCompleted
должно быть правильным. Если на странице, которую вы загружаете, есть фреймы, ваш элемент управления WebBrowser
запускает событие DocumentCompleted
для каждого кадра (см. здесь для более Детали). Я бы предложил проверить свойство IsBusy
каждый раз, когда событие запущено, а если оно ложно, то ваша страница полностью загружена.
Ответ 8
Использование события DocumentCompleted со страницей с несколькими вложенными фреймами не помогло мне.
Я использовал библиотеку Interop.SHDocVW для управления элементом управления WebBrowser следующим образом:
public class webControlWrapper
{
private bool _complete;
private WebBrowser _webBrowserControl;
public webControlWrapper(WebBrowser webBrowserControl)
{
_webBrowserControl = webBrowserControl;
}
public void NavigateAndWaitForComplete(string url)
{
_complete = false;
_webBrowserControl.Navigate(url);
var webBrowser = (SHDocVw.WebBrowser) _webBrowserControl.ActiveXInstance;
if (webBrowser != null)
webBrowser.DocumentComplete += WebControl_DocumentComplete;
//Wait until page is complete
while (!_complete)
{
Application.DoEvents();
}
}
private void WebControl_DocumentComplete(object pDisp, ref object URL)
{
// Test if it the main frame who called the event.
if (pDisp == _webBrowserControl.ActiveXInstance)
_complete = true;
}
Этот код работает для меня при навигации по определенному URL-адресу с помощью метода webBrowserControl.Navigate(url), но я не знаю, как управлять страницей при нажатии кнопки html с помощью htmlElement.InvokeMember("click").
Ответ 9
Вы можете использовать событие ProgressChanged; в последний раз, когда он поднят, будет указано, что документ полностью отображается:
this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);