Webbrowser Steuerelement

18/12/2007 - 17:35 von Stephan | Report spam
Hallo zusammen,

ich benutze das Steuerelement Webbrowser.

1. Ich lade eine Webseite.
2. Ich fülle ein Formular über htmldoc.All["name"]
3. ich drücke den Button über htmldoc.All["Button1"].InvokeMember("Click");
Funktioniert auch alles prima.

Jetzt habe ich aber folgendes Problem, die Seite wird erst neu aufgebaut und
der Event webBrowser1_DocumentCompleted aufgerufen, wenn die Methode, in der
InvokeMember("Click"); steht, beendet wurde.

Ich würde jetzt gerne in dieser Metode weiteren Code schreiben, um nach dem
Aufbau der neuen Seite weitere automatisierte Schritte auszuführen.

ich habe probiert das Webbrowser-Steuerelement in einen eigenen Thread
auszulagern. Das funkionierte aber nicht.

Im Prinzip müsste die Methode an der Stelle nach dem InvokeMember("Click")
stehen bleiben und warten bis ein seperater Thread
"webBrowser1_DocumentCompleted" aufgerufen hat und irgendweinen lock wieder
frei gibt, (zB ManualResetEvent).

Hat jemand einen brauchbaren Beispielcode oder eine Idee für mich.

Vielen Dank und Grüße
Stephan
 

Lesen sie die antworten

#1 Frank Dzaebel
18/12/2007 - 18:14 | Warnen spam
Hallo Stephan,

[...] Ich würde jetzt gerne in dieser Metode weiteren Code
schreiben, um nach dem Aufbau der neuen Seite weitere
automatisierte Schritte auszuführen.
ich habe probiert das Webbrowser-Steuerelement in einen eigenen Thread
auszulagern. Das funkionierte aber nicht.



brauchst Du nicht, wenn ich Dein Vorhaben richtig verstehe.

Ich mache soetwas gerne über eine simple
switch-Anweisung in der DocumentCompleted-Methode,
bei der Du den switch-case jeweils einen weiter
setzt. Etwa so:

// Beispiel für automatischen Web-Umsatz-Download bei der Postbank:

void webBrowser1_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender;
string absUri = e.Url.AbsoluteUri.ToLower();
if (absUri != wb.Url.AbsoluteUri.ToLower() &&
absUri != (wb.Url.AbsoluteUri.ToLower() + "/"))
return; // ggf. für Frame-Ausfilterung

switch (stelle)
{
case Stelle.AnfangsNavigationURL:
HtmlElement elKontoNr = webBrowser1.Document.
All[Props.Kontonummer];
elKontoNr.InnerText = PropSets.Kontonummer;

HtmlElement elPIN = webBrowser1.Document.
All[Props.PIN];
elPIN.InnerText = PropSets.PIN;

HTMLInputElementClass btn = FindInputTagWithClass(
Props.AnmeldenClass, Stelle.Anmeldung);
stelle = Stelle.Anmeldung; btn.click();
break;

case Stelle.Anmeldung:
HTMLAnchorElementClass anch = FindAnchorWithHref(
Props.KontoumsatzHrefStart, Stelle.Kontoumsatz);
stelle = Stelle.Kontoumsatz; anch.click();
break;

case Stelle.Kontoumsatz:
HTMLAnchorElementClass anch2 = FindAnchorWithText(
Props.KontoumsatzDownloadText, Stelle.KontoumsatzDownload);
stelle = Stelle.KontoumsatzDownload;
WebClient wcl = new WebClient();
wcl.DownloadFile(anch2.href, Path.Combine(
Props.DownloadVerzeichnis, Props.KontoUmsatzDateiname));
AnzeigeAusUmsatzDatei();
break;

case Stelle.KontoumsatzDownload:
break;
}
}

private HTMLAnchorElementClass FindAnchorWithHref(string href,
string stelle)
{
foreach (HtmlElement link in webBrowser1.Document.Links)
{
HTMLAnchorElementClass anchor = link.DomElement as
HTMLAnchorElementClass;
if (anchor != null && anchor.href.StartsWith(href))
return anchor;
}
BenachrichtigeFehler(stelle,
"Keinen Link mit HREF=\"{0} ...\" gefunden!", href);
return null;
}

private HTMLAnchorElementClass FindAnchorWithText(string text,
string stelle)
{
foreach (HtmlElement link in webBrowser1.Document.Links)
{
HTMLAnchorElementClass anchor = link.DomElement as
HTMLAnchorElementClass;
if (anchor != null && anchor.innerText != null &&
anchor.innerText.StartsWith(text))
return anchor;
}
BenachrichtigeFehler(stelle,
"Keinen Link mit Text=\"{0} ...\" gefunden!", text);
return null;
}

private HTMLInputElementClass FindInputTagWithClass(string className,
string stelle)
{
HtmlElementCollection elInputs = webBrowser1.Document.
GetElementsByTagName("Input");
foreach (HtmlElement elem in elInputs)
{
HTMLInputElementClass btn = elem.DomElement as
HTMLInputElementClass;
if (btn == null) continue;
IHTMLDOMAttribute an = btn.getAttributeNode("class");
if (an != null && an.nodeValue != null &&
an.nodeValue.ToString() == className)
{
btn.click(); return btn;
}
}
BenachrichtigeFehler(stelle,
"Keine <INPUT class=\"{0}\"> gefunden!", className);
return null;
}

private void BenachrichtigeFehler(string stelle,
string message, string parameter)
{
MessageBox.Show("Bei Stelle " + stelle + ":" +
String.Format(message, parameter), "Fehler bei " + stelle,
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen