Laden...

WebBrowser-Control: Problem bei mehrfachen InvokeMember("click")

Erstellt von Tourette vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.686 Views
Hinweis von MarsStein vor 12 Jahren

verschoben aus Web-Technologien

T
Tourette Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren
WebBrowser-Control: Problem bei mehrfachen InvokeMember("click")

Erstmal ein Hallo an die Community, da das mein erster Post ist 😃

und dann gleich zum Problem:

Auf einer Website müssen mehrere Links hintereinander gedrückt werden. Diese führen nicht auf eine andere Webseite, sonder werden auf der aktuellen Seite ausgeführt.

Hier mein bisheriger Code:

		void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
		{
			HtmlElement NextLink = null;
			
			switch (action) {					
					case "Adden" :
					    foreach (HtmlElement ele in Browser.Document.Links)
						{
					    	if (ele.InnerHtml.IndexOf("Add") > -1) {
								LBtemp.Items.Add(ele.Id + " | " + ele.InnerText + " | " + ele.InnerHtml);
								ele.InvokeMember("click");
					    	}
					    	
					    	if (ele.InnerHtml.IndexOf("Next") > -1) {
					    		NextLink = ele;
					    	}
						}
					    if (NextLink != null) NextLink.InvokeMember("click");
					    else MessageBox.Show("fertig!");
					break;
			}
		}

Das Programm durchläuft einfach alle Seiten einer Seite und drückt jedes mal den "Add" Button. Er ruft diese Funktion auf definitiv für jeden Button auf, das Problem ist, dass es jeweils nur für den ersten ausgeführt wird (sprich der Klick auch tatächlich im Brower getätigt wird).
Ich habe versucht eine messagebox nach dem invokemember zu platzieren und komischerweise reicht das aus, dass die anderen Links auch geklickt werden, obwohl das ja eigentlich nichts ändern sollte...

Die Frage, welche ich an euch stelle ist nun, wie kann ich erreichen, dass ALLE Links auch tatsächlich gedrückt werden, ohne eine dumme MsgBox einzubauen? 😉

ich bin verzweifelt ^^

Vielen Dank schonmal im Voraus!

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

was passiert den wenn man von Hand auf die Links clickt? Wird die Seite neu geladen oder irgendwas nachgeladen? Dann musst Du nach jedem Click wieder warten bis die Seite fertig geladen ist, und dann nur den jeweils nächsten Click mit Deinem Programm auslösen. Dazu musst Du Dir natürlich merken, was Du schon geclickt hast, so ganz einfach mit foreach geht's dann leider nicht.
DeinCode würde höchstens funktionieren, wenn bei Click gar keine Anfrage an den Server geschickt wird, sondern ausschliesslich clientseitige Javascripte laufen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

T
Tourette Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

danke für die antwort!

es wird logischerweise serverseitiger code ausgeführt, der die anfrage bearbeitet, die frage ist nur, wie kann ich nun herausfinden, wann die ausfrage komplett ausgeführt wurde? mit readystate komme ich da leider nicht weiter 😕

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Tourette,

verwende DocumentCompleted. Für alles weitere schau bitte in die :rtfm: Doku.

herbivore

T
Tourette Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

danke auch für diese antwort, aber wenn du meinen code gelesen hättest, hättest du gesehen, dass ich dieses event bereits verwende und es wird nicht erneut ausgelöst, wenn ein click ausgeführt wird.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Tourette,

wenn

es wird logischerweise serverseitiger code ausgeführt, der die anfrage bearbeitet,

zutrifft, sollte DocumentCompleted ausgelöst werden.

Es sei den wir reden über Ajax. Was für eine Aktion genau liegt denn hinter dem Button? Das Senden eines Forms? Oder nur JavaScript?

herbivore

T
Tourette Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

da nur teile der seite neu geladen werden, gehe ich davon aus, das AJAX verwendet wird, was das nicht-auslösen des events erklären würde...

ich habe mir jetzt mit einem delay von 250 ms zwischen jedem click beholfen:

						    	for (int i = 0; i <= 25; i++)
						    	{
						    		Application.DoEvents();
						    		Thread.Sleep(10);
						    	}	

aber das ist natürlich nur eine notlösung... jedoch könnte man daraus hervorragend eine whileschleife machen, welche überprüft, wann das dokument fertig ist, das wäre natürlich eine super lösung 😃

Dann stellt sich also die Frage, wie ich rausbekomme, wann er fertig ist, mit der JS-Ausführung, oder?

Achso, was es vielleicht vereinfacht, es ändert sich nach dem klick etwas auf der Seite (ohne, dass die seite komplett neu geladen wird). Ein Image wird ausgegraut und ein Text erscheint.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Tourette,

Achso, was es vielleicht vereinfacht, es ändert sich nach dem klick etwas auf der Seite (ohne, dass die seite komplett neu geladen wird). Ein Image wird ausgegraut und ein Text erscheint.

das kannst du natürlich mal versuchen. Fang aber Exceptions ab. Keine Ahnung, was passiert, wenn man auf HtmlDocument zugreift, während es geändert wird.

herbivore

C
252 Beiträge seit 2007
vor 12 Jahren

Versuchs mal mit WatiN. Der kann auch mit AJAX umgehen. Damit sollte sich das ganze einfacher und schneller realisieren lassen.

T
Tourette Themenstarter:in
5 Beiträge seit 2011
vor 12 Jahren

das kannst du natürlich mal versuchen. Fang aber Exceptions ab. Keine Ahnung, was passiert, wenn man auf HtmlDocument zugreift, während es geändert wird.

Ja die sache ist, dass DocumentText sich nicht ändert, obwohl sich die anzeige verändert... die veränderung müsste ich abfangen können 😕

Versuchs mal mit WatiN. Der kann auch mit AJAX umgehen. Damit sollte sich das ganze einfacher und schneller realisieren lassen.

Das schau ich mir mal an, danke 😄