C # Обработка WebBrowser при срабатывании щелчка / события ComponentArt CallBack - PullRequest
0 голосов
/ 09 ноября 2010

Я пытаюсь перейти на страницу со скрытым браузером из приложения C #, щелкнуть ссылку и убедиться, что щелчок сработал. Поток: - перейдите к "http://mypage" - нажмите на ссылку, HTML-код ссылки (вызывающий ComponentArt CallBack):

<div id="ctl00_ctl00_PlaceHolderMain_Colleague1_linkAdd" onclick="colleagueCallback.callback('SOMENAME'); return false;">

Добавить коллегу - дождитесь клика, чтобы получить результат и обновить страницу - убедитесь, что щелчок сработал

Моя проблема: Кажется, что щелчок не завершен полностью, если только я не вызову WebBroser.Print () (который мне не нужен, только что попробовал миллион способов выяснить, что происходит после щелчка, только Печать завершает щелчок).

Код, который работает абсолютно нормально, навигация работает, он может найти теги, которые я ищу, событие нажатия срабатывает (я получаю промежуточное изменение), но обратный вызов не завершается, как оказалось, только используя WebBrowser.Print (), все остальные WebBrowser.Invalidate (), WebBrowser.Update (), WebBrowser.DocumentStream.Flush () или WebBroser.ResumeLayout () не будут завершать обратный вызов ASP внутри страницы ...:

tempIE = new WebBrowser();
tempIE.Navigate("http://mypage");
while (tempIE.ReadyState != WebBrowserReadyState.Complete)
{
      Application.DoEvents();
}
tempIE.AllowNavigation = true;
HtmlElement addDivTag = tempIE.Document.GetElementById("ctl00_ctl00_PlaceHolderMain_Colleague1_linkAdd");
if (addDivTag == null)
    throw (new Exception("Session.FollowPerson: could not find the Add tag"));
if ( addDivTag.FirstChild == null )
    throw (new Exception("Session.FollowPerson: could not find the add link"));
addDivTag.FirstChild.InvokeMember("click");
while (tempIE.ReadyState != WebBrowserReadyState.Complete)
{
    Application.DoEvents();
}

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

<a href="javascript:void(0)">Add colleague</a>

изменит посредника на (при создании логики добавления в CallBack):

<img src="/images/loading.gif">

в конце должно измениться на:

<br>Is your colleague</br>

Кто-нибудь знает, что именно происходит в WebBroser.Print (), который заставляет страницу полностью завершить обратный вызов?

1 Ответ

0 голосов
/ 09 ноября 2010

Я считаю, что WebBrowser выполняет свою работу в отдельном потоке. Поэтому Print будет использовать механизм синхронизации потоков, например функцию типа WaitXXX (которая позволяет насосу сообщений продолжать работу, в то время как поток GUI ожидает события).

DoEvents, возможно, не дают вашему потоку возможности работать (вы используете процессор с одним процессором?). Попробуйте вставить Thread.Sleep (200) и посмотрите, не изменится ли поведение. Если так, подумайте о переходе на одну из функций WaitXXX (я найду ту, о которой думаю, и опубликую ее).

EDIT Это были функции MsgWaitXXX, и вам нужно будет вызвать P / Invoke, если вы решите их использовать.

Я бы порекомендовал вам перехватить событие WebBrowser.Navigated. Разбейте свою логику на две части. Первая часть будет вызывать Navigate и помечать ваш пользовательский интерфейс как ожидающий чего-то, вторая часть будет выполняться в вашем обработчике Navigated при возникновении события.

...