Internet-Explorer (IE) steuern mit C#

Die Anwendungsmöglichkeiten sind vielfältig. Von kleinen SSO (SingleSignOn)-Lösungen bis hin zur kompletten Automation: Das automatische Steuern des IE kann ganz nützlich sein. Schon unter VB6 konnte auf das Webmodell des IE zugegriffen werden. Wer endlich den Umstieg zu .NET schafft, wird allerdings erst einmal relativ wenig darüber finden. Beeindruckend sind die Möglichkeiten allemal.
Zumal für die meisten Aufgaben noch nicht einmal der IE benutzt werden muss. Will man nur den HTML-Code oder ein XML auslesen, ist mal über den WebRequest bestens bedient. Selbst ein Proxy ist so anzusprechen.

Beispiel 1: WebRequest für die Rückgabe von HTML oder XML

//sURL: Die Ziel-URL
WebRequest request = WebRequest.Create(sURL);

//Webproxy mit den Parametern sUser, sPasswort, sDomain, sPort
//    WebProxy proxy = new WebProxy(sWebProxy, Convert.ToInt32(sPort));
//    proxy.UseDefaultCredentials = true;
//    proxy.Credentials = new NetworkCredential(sUser, sPasswort, sDomain);
//    request.Proxy = proxy;

WebResponse response = request.GetResponse();
Stream streamResponse = response.GetResponseStream();

StreamReader streamRead = new StreamReader(streamResponse, Encoding.Default);
Char[] readBuff = new Char[256];
int count = streamRead.Read(readBuff, 0, 256);
string xmlData = "";
while (count > 0)
{
String outputData = new String(readBuff, 0, count);
xmlData += outputData;
count = streamRead.Read(readBuff, 0, 256);
}

// Close the Stream object.
streamResponse.Close();
streamRead.Close();
response.Close();

//xmlData beinhaltet nun den Code
return xmlData;

Das Beispiel 1 erweist sich als äußerst stabil und zuverlässig. Doch nicht wenige Webprogrammierer schieben einer solchen Abfrage einen Riegel vor und liefern 404 (Fehler) zurück, um eben das Auslesen des Codes zu verhindern. In einem solchen Fall kann man einen speziellen Header schicken, um dem Webserver einen Browserzugriff vorzugaugelen, oder eben den Browser bemühen, die Abfrage zu erledigen.
Gerade wenn man noch weitere Aktionen im Dialog mit der Webseite vorhat, kommt man kaum um den Browser herum.

Beispiel 2: IE-Browser mit C# steuern

//Erstelle den IE
object o = null;
InternetExplorer ie = null;

ie = new InternetExplorerClass();
IWebBrowserApp wb = (IWebBrowserApp)ie;
wb.Navigate("http://www.google.de", ref o, ref o, ref o, ref o);
wb.Visible = true;

Sobald Sie sich mit dem Webbrowser beschäftigen, sind in der Regel die untenstehende Verweise notwendig. Die entsprechenden Referenzen für MSHTML und SHDOCVW findet Sie unter COM -> Microsoft HTML Object Library  oder .NET -> Microsoft.mshtml für MSHTML und COM -> Microsoft Internet Controls für SHDOCVW.

using SHDocVw;
using mshtml;

Beispiel 3: HTML-Code aus Webseite auslesen

Wenn der Browser wie in Beispiel 3 geöffnet und die Seite angezeigt wurde, kann man auch auf den HTML-Code zugreifen:

//Warte - hier gibt es bessere Möglichkeiten
while (wb.Busy) ;
HTMLDocument wd = (HTMLDocument)wb.Document;

//HTML-Code
IHTMLDocument2 doc = (IHTMLDocument2)ie.Document;
string sHTML = doc.body.innerHTML;

Beispiel 4: Zugriff auf die HTML-Elemente

Man kann einfach über den TagName auf die Elemente zugreifen

//Alle Elemente
IHTMLElementCollection eventLinks = (IHTMLElementCollection)wd.getElementsByTagName("a");

//Diese können dann zum Beispiel mit Foreach durchgegangen werden
foreach (HTMLAnchorElementClass el in eventLinks)

Beispiel 5: Einen bestimmten Link klicken

IHTMLElementCollection linkElems = doc.links;
foreach ( HTMLAnchorElementClass linkl in linkElems)
{
    //a href -> URL des Links
     string sLink = link.href.ToString();

    //Link Klicken mit:
    link.click();
}

Beispiel 6: Manipulation von HTML-Elementen

Auch lassen sich mit C# und dem Objektmodell die Eigenschaften der Tags abfragen und ändern. Folgendes Beispiel ändert beispielsweise alle Targets der Hyperlinks von „_blank“ auf „_self“; alle Links öffnen sich also nur noch im gleichen Fenster.

    HTMLDocumentClass doc = (HTMLDocumentClass) this.webBrowser.Document;
    IHTMLElementCollection all = (IHTMLElementCollection) doc.all;
    IHTMLElementCollection anchors = (IHTMLElementCollection) all.tags("A");
    foreach (HTMLAnchorElement a in anchors)
    {
        if (a.target.Equals("_blank", StringComparison.OrdinalIgnoreCase))
        {
            a.target = "_self";
        }
    }

Beispiel 7: Textbox mit C# füllen und Submit-Button klicken

//Beispiel: Rufe google auf, fülle die Textbox und klicke den Button
object o = null;
InternetExplorer ie = null;

ie = new InternetExplorerClass();
IWebBrowserApp wb = (IWebBrowserApp)ie;
wb.Navigate("http://www.google.de", ref o, ref o, ref o, ref o);
wb.Visible = true;

while (wb.Busy) ;
HTMLDocument doc = (HTMLDocument)wb.Document;

//Die Google-Textbox "q" ansprechen
IHTMLElement inputValue = doc.getElementById("q");

//ändere das Attribut "value" mit dem Such-Inhalt
inputValue.setAttribute("value", "Meine Suche");

//Button ansprechen
IHTMLElement submitButton = doc.getElementById("btnG");

//Button klicken
submitButton.click();

Weitere Links:
Zugriff auf Frames/iFrames

Schreibe einen Kommentar