Как я могу обнаружить, когда элемент управления System.Windows.Forms.WebBrowser завершил загрузку?
Я пытался использовать события Navigate и DocumentCompleted, но оба они были подняты несколько раз во время загрузки документа!
Как я могу обнаружить, когда элемент управления System.Windows.Forms.WebBrowser завершил загрузку?
Я пытался использовать события Navigate и DocumentCompleted, но оба они были подняты несколько раз во время загрузки документа!
Я думаю, что событие DocumentCompleted
будет запущено для всех загруженных дочерних документов (например, JS и CSS). Вы можете посмотреть WebBrowserDocumentCompletedEventArgs
в DocumentCompleted
и проверить свойство Url и сравнить его с URL-адресом главной страницы.
Я сделал следующее:
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
Последняя загруженная страница, как правило, предназначена для навигации, поэтому это должно работать.
От здесь.
Следующее должно работать.
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
}
Обратите внимание, что URL-адрес в DocumentCompleted может отличаться от навигации по URL-адресу из-за переноса сервера или нормализации URL-адреса (например, вы переходите на www.microsoft.com и получаете http://www.microsoft.com в документе завершено)
На страницах без фреймов это событие срабатывает один раз после завершения загрузки. На страницах с несколькими кадрами это событие срабатывает для каждого навигационного фрейма (поддержка заметки поддерживается внутри фрейма, например, щелчок по ссылке в кадре может перемещаться по кадру на другую страницу). Кадр навигации самого высокого уровня, который может быть или не быть браузером верхнего уровня, запускает окончательное событие DocumentComplete.
В собственном коде вы сравниваете отправителя события DocumentComplete, чтобы определить, является ли событие последним событием в навигации или нет. Однако в Windows Forms параметр отправителя не завершается WebBrowserDocumentCompletedEventArgs. Вы можете разорвать собственное событие, чтобы получить значение параметра, или проверить свойство readystate в браузере или документы фрейма в обработчике событий DocumentCompleted, чтобы узнать, находятся ли все кадры в состоянии готовности.
Существует проба с методом readystate, как будто существует диспетчер загрузки, и навигация - в загружаемый файл, навигация может быть отменено диспетчером загрузки и readistate, не будет завершено.
У меня была такая же проблема с несколькими событиями DocumentCompleted
, которые были выпущены, и опробовали все вышеприведенные предложения. Наконец, кажется, что в моем случае ни свойство IsBusy
не работает, ни свойство Url
, но ReadyState
кажется мне то, что мне нужно, потому что он имеет статус "Интерактивный" при загрузке нескольких кадров и получает статус "Завершить" только после загрузки последнего. Таким образом, я знаю, когда страница полностью загружена всеми ее компонентами.
Я надеюсь, что это тоже поможет другим:)
Кажется, он не вызывает события DocumentCompleted/Navigated для внешних файлов Javascript или CSS, но он будет использоваться для iframe. Как говорит ПК, сравните свойство WebBrowserDocumentCompletedEventArgs.Url(у меня еще нет кармы, чтобы сделать комментарий).
Если вы используете WPF, есть событие LoadCompleted
.
Если это Windows.Forms
, событие DocumentCompleted
должно быть правильным. Если на странице, которую вы загружаете, есть фреймы, ваш элемент управления WebBrowser
запускает событие DocumentCompleted
для каждого кадра (см. здесь для более Детали). Я бы предложил проверить свойство IsBusy
каждый раз, когда событие запущено, а если оно ложно, то ваша страница полностью загружена.
Использование события 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").
Вы можете использовать событие ProgressChanged; в последний раз, когда он поднят, будет указано, что документ полностью отображается:
this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);