Control WebBrowser. Часть 2: События
В предыдущей статье было продемонстрировано, как получить данные в виде html страницы и вывести их в окно элемента управления webBrowser. Сегодня более подробно рассмотрим, что происходит после нажатия кнопки btnSend на форме (клавиши Enter на клавиатуре).
Три основных события контрола webBrowser
После нажатия кнопки btnSend (Enter) мы попадаем в обработчик события Click (KeyDown), в котором происходит запуск метода Navigate. Первое, что должен выполнить данный метод, это осуществить переход, по указанному нами адресу в поле url. Но перед тем, как будет выполнен переход, в элементе управления webBrowser возникает первое событие.
Navigating
Данное событие возникает перед тем, как будет выполнен переход. В обработчике данного события можно отследить, куда будет осуществлён переход, для этого можно использовать следующую запись — e.Url, осуществить проверку на правильность введенного адреса или его отсутствие, а так же и во все отменить переход по указанному адресу.
Забегая немного вперед, хочется рассказать о двух полезных свойствах данного элемента управления.
IsBusy
Первое свойство позволяет определить происходит ли в данный момент загрузка новых данных в webBrowser. Данное свойство принимает значение true, в момент загрузки новых данных, всё остальное время, данное свойство имеет значение false.
MessageBox.Show(webBrowser1.IsBusy.ToString(), "IsBusy");
ReadyState
Свойство ReadyState пригодиться, если нужно отследить текущее состояние элемента управления WebBrowser.
//Позволяет получить текущее состояние элемента webBrowser MessageBox.Show(webBrowser1.ReadyState.ToString(), "ReadyState");
В отличие от предыдущего свойства имеет несколько значений, начальным из которых является значение Uninitialized, которое обозначает, что control webBrowser, в данный момент, не содержит никаких данных.
На примере созданного в предыдущей статье сайта test.local, проследим за состоянием обоих свойств от момента нажатия на кнопку Enter, до полной загрузки данных в control webBrowser.
Текущее значение свойств:
webBrowser1.IsBusy == false webBrowser1.ReadyState == Uninitialized
Navigated
Если в событие Navigating был дан положительный ответ на запрос о переходе, то метод Navigate выполняет переход по указанному нами адресу, после чего начинается загрузка данных в control webBrowser, именно в этот момент возникает второе событие Navigated, которое оповещает о начале загрузки данных в элемент управления WebBrowser.
Текущее значение свойств:
webBrowser1.IsBusy == true webBrowser1.ReadyState == Loading
пример:
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { MessageBox.Show("Выполняется загрузка данных с указанного адреса в control WebBrowser"); }
DocumentCompleted
После события Navigated происходит событие DocumentCompleted, которое обозначает, что загрузка данных в control webBrowser была выполнена полностью. Именно после возникновения этого события можно переходить к работе с полученными данными, например парсить контент, сохранять данные и так далее.
Текущее значение свойств:
webBrowser1.IsBusy == false webBrowser1.ReadyState == Complete
пример
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { MessageBox.Show("Загрузка данных в control Webbrowser выполнена полностью!"); }
Фреймы
Данное событие может возникать несколько раз, например: если страница содержит фреймы, то тогда после каждого загруженного фрейма, будет происходить событие DocumentCompleted, поэтому в обработчике этого события, возможно, потребуется сделать пару дополнительных проверок.
Например: запрашиваемая страница содержит два фрейма
Исходник страницы
Если не делать никаких проверок, то при возникновении события DocumentCompleted в первый раз мы получаем не полную загрузку страницы, а полную загрузку первого фрейма, а так как их два, то тогда получим два вызова события DocumentCompleted для обоих фреймов. Чтобы этого избежать, можно использовать простую проверку:
if (e.Url.AbsolutePath != this.webBrowser1.Url.AbsolutePath) { MessageBox.Show("Загрузка фрейма: " + e.Url.AbsolutePath + " закончена!"); } else MessageBox.Show("Загрузка данных в control webBrowser закончена полностью!");
При работе с фреймами, так же стоит внимательно отслеживать значение свойства isBusy, так как после первого загруженного фрейма, значение измениться на false, при этом загрузка новых данных продолжается. В таком случае лучше отслеживать свойства ReadyState, которое сначала изменит свое значение на Interactive, которое означает, что какая-та часть данных уже была загружена в элемент управления webBrowser, а затем на Complete. При этом так же потребуется выполнить код проверки на загрузку всего документа, а не отдельного фрейма.
Для Ajax запросов можно использовать вот такую проверку, опять же в событие DocumentCompleted
string url = e.Url.ToString(); if (!(url.StartsWith("http://") || url.StartsWith("https://"))) { //Ajax } else MessageBox.Show("Загрузка данных в control webBrowser закончена полностью!");
Так же стоит помнить, что если в поле url указан не верный адрес или он вообще не указан, то после нажатия кнопки Enter (btnSend) все 3 события будут успешно отработаны, как и при указании верного адреса.
И так запрашиваемая страница полностью загружена, и теперь можно поработать с полученными данными, но об этом в следующей статье.
Читайте также:
А как распарсить страницу по тэгам средствами webBrowser?
Как получить листинг определенного фрейма?
А как распарсить страницу по тэгам средствами webBrowser?
Что значит «распарсить страницу по тэгам»?
html элементы
дочерние html элементы
атрибуты html элементов
Как получить листинг определенного фрейма?
Найти html элемент на странице и получить его содержимое с помощью свойств: OuterHtml или InnerHtml.