Control WebBrowser. Часть 2: События

Control WebBrowser. Часть 2: События

В предыдущей статье было продемонстрировано, как получить данные в виде html страницы и вывести их в окно элемента управления webBrowser. Сегодня более подробно рассмотрим, что происходит после нажатия кнопки btnSend на форме (клавиши Enter на клавиатуре).

Три основных события контрола webBrowser

После нажатия кнопки btnSend (Enter) мы попадаем в обработчик события Click (KeyDown), в котором происходит запуск метода Navigate. Первое, что должен выполнить данный метод, это осуществить переход, по указанному нами адресу в поле url. Но перед тем, как будет выполнен переход, в элементе управления webBrowser возникает первое событие.

Navigating

Данное событие возникает перед тем, как будет выполнен переход. В обработчике данного события можно отследить, куда будет осуществлён переход, для этого можно использовать следующую запись — e.Url, осуществить проверку на правильность введенного адреса или его отсутствие, а так же и во все отменить переход по указанному адресу.

Navigating

Забегая немного вперед, хочется рассказать о двух полезных свойствах данного элемента управления.

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, поэтому в обработчике этого события, возможно, потребуется сделать пару дополнительных проверок.

Например: запрашиваемая страница содержит два фрейма

Исходник страницы

6

Если не делать никаких проверок, то при возникновении события 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 события будут успешно отработаны, как и при указании верного адреса.

И так запрашиваемая страница полностью загружена, и теперь можно поработать с полученными данными, но об этом в следующей статье.

Читайте также:

2 комментария

  1. А как распарсить страницу по тэгам средствами webBrowser?
    Как получить листинг определенного фрейма?

  2. А как распарсить страницу по тэгам средствами webBrowser?

    Что значит «распарсить страницу по тэгам»?

    html элементы
    дочерние html элементы
    атрибуты html элементов

    Как получить листинг определенного фрейма?

    Найти html элемент на странице и получить его содержимое с помощью свойств: OuterHtml или InnerHtml.

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *