2010-11-09 18 views
0

J'essaie de naviguer vers une page avec un navigateur caché depuis une application C#, cliquez sur un lien et vérifiez le clic. Débit: - accédez à "http: // mypage" - cliquer sur un lien, le code HTML lien (appelle un CallBack ComponentArt):Gestion de C# WebBrowser lors du déclenchement d'un clic/événement ComponentArt CallBack

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

Ajouter collègue - attendre le clic obtenir le résultat et mettre à jour la page - vérifier le clic a travaillé

Mon problème: le clic ne semble pas entièrement terminée, à moins que j'appelle le WebBroser.Print() (que je ne ai pas besoin, vient d'essayer un million façons de comprendre ce qui se passe après le clic, seul Print est en train de faire le clic complet).

Le code, qui fonctionne parfaitement, navigue fonctionne, il peut trouver les tags que je recherche, l'événement click est en train de se déclencher (j'obtiens un changement intermédiaire), mais le callback ne se termine pas, comme il s'avère uniquement à l'aide de WebBrowser.Print(), tous les autres WebBrowser.Invalidate(), WebBrowser.Update(), WebBrowser.DocumentStream.Flush() ou WebBroser.ResumeLayout() ne finaliseront pas le rappel ASP dans la page ... :

 
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(); 
} 

Après cela, je suis vérifiais si l'une des balises a été modifié par le rappel du serveur ComponentArt mais seulement obtenir l'étiquette intermédiaire. Le changement que je suis suivi est:

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

changera intermédiaire à (tout en faisant la logique d'ajouter dans le callback):

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

à la fin devrait changer pour:

<br>Is your colleague</br> 

Quelqu'un sait ce qu'il se passe dans le WebBroser.Print() qui fait que la page complète le callback?

Répondre

0

Je crois que WebBrowser fait son travail dans un thread séparé. L'impression utiliserait donc un mécanisme de synchronisation de threads, comme une fonction de type WaitXXX (qui permet à la pompe de message de continuer à fonctionner tout en provoquant l'attente d'un événement par le thread graphique).

Il est possible que DoEvents ne donne pas l'opportunité à votre thread de s'exécuter (utilisez-vous un processeur unique?). Essayez d'insérer un Thread.Sleep (200) et voyez si le comportement change. Si c'est le cas, envisagez de passer à l'une des fonctions de WaitXXX (je vais chercher celle à laquelle je pense et poster une modification).

EDIT Les fonctions étaient MsgWaitXXX et vous auriez besoin de P/Invoke si vous choisissez de les utiliser.

Je vous recommande de connecter l'événement WebBrowser.Navigated. Brisez votre logique en deux parties. La première partie appelle Navigate et signale votre interface utilisateur en attendant quelque chose, la deuxième partie sera effectuée dans votre gestionnaire Navigated lorsque l'événement se déclenche.

+0

Je pensais déjà que le ReadyState ne fonctionnerait pas parfaitement et a ajouté un très gros délai (Thread.Sleep (50000)). Lorsque je fais le même flux à partir de IE manuellement, il en faut beaucoup moins pour que le clic se termine.Ont également ajouté le gestionnaire d'événement DocumentCompleted, qui se déclenche mais le clic n'est toujours pas terminé (une vue séparée de la page montre que l'action n'a pas abouti) – OliCS

+0

Comme autre test, au lieu d'attendre, essayez d'accrocher l'événement Navigated. Quand vous le faites, est-ce qu'il tire? – Les

+0

une chose que je peux dire, DocumentCompleted ne se déclenche pas après avoir cliqué sur le lien ... même lorsque j'utilise Print() pour forcer la validation. – OliCS