Feedback

C# - Internet Explorer automatisieren

Veröffentlicht von am 23.11.2007
(1 Bewertungen)
Eine einfache Klasse womit man den Internet Explorer automatisieren kann. Dabei kann man ohne Probleme Website-Elemente wie Textboxen ausfüllen lassen und Buttons betätigen.

Die entsprechenden Referenzen für MSHTML und SHDOCVW findet ihr unter COM -> Microsoft HTML Object Library oder .NET -> Microsoft.mshtml für MSHTML und COM -> Microsoft Internet Controls für SHDOCVW.

Benutzung:
using TL.AutoIE;

ControlIE Iexplorer = new ControlIE();
Iexplorer.ieNavigate(true, "http://www.google.de");
Iexplorer.ieFillField("google", "q");
Iexplorer.ieButtonSubmit("btnG", false);
Snippet in VB übersetzen
/*
 * AutoIE - Automatisierung vom Internet Explorer
 * ----------------------------------------------
 * Version: 1.0
 * Copyright © 2007 Konstantin Gross
 * http://www.texturenland.de
 *
*/

#region Usings
using System;
using System.Collections.Generic;
using System.Net;
using System.IO;
using mshtml;
using SHDocVw;
#endregion

namespace TL.AutoIE
{
    /// <summary>
    /// Diese Klasse erlaubt, den Internet Explorer zu automatisieren
    /// </summary>
    public class ControlIE
    {
        #region Globale Variablen
        /// <summary>
        /// Adresse der URL
        /// </summary>
        private string url;

        /// <summary>
        /// Wurde der IE gestartet?
        /// </summary>
        private bool launched;

        /// <summary>
        /// Wurde die Seite komplett geladen?
        /// </summary>
        private bool finished;

        /// <summary>
        /// Gespeicherte Fehlermeldung
        /// </summary>
        private string errorMsg;

        /// <summary>
        /// Instanz des Internet Explorers
        /// </summary>
        private InternetExplorer iexplore;

        /// <summary>
        /// Geladene Internetseite
        /// </summary>
        private HTMLDocument myDoc;

        /// <summary>
        /// Liste mit den zu übergebenden Werten
        /// </summary>
        private Dictionary<string, string> fField = new Dictionary<string, string>();

        /// <summary>
        /// Werden beim Klick auf den Button, Werte übertragen?
        /// </summary>
        private bool bOnly;

        /// <summary>
        /// Name des zu drückenden Buttons
        /// </summary>
        private string btnName;
        #endregion

        #region Eigenschaften
        /// <summary>
        /// Erhält oder definiert ob ein Button mit zu übermittelnden Werten gedrückt wird
        /// </summary>
        /// <value>Wert ist ein Boolean Typ</value>
        /// <returns>True, wenn der Button ohne zu übermittelnde Werte gedrückt wird</returns>
        private bool Only
        {
            get
            {
                return bOnly;
            }
            set
            {
                bOnly = value;
            }
        }

        /// <summary>
        /// Erhält oder definiert den Namen des zu drückenden Buttons
        /// </summary>
        /// <value>Wert ist ein String Typ</value>
        /// <returns>Der zu ermittelnde Button, der automatisch gedrückt wird</returns>
        private string ButtonName
        {
            get
            {
                return btnName;
            }
            set
            {
                btnName = value;
            }
        }
        #endregion

        #region Funktionen
        /// <summary>
        /// Internet Explorer starten
        /// </summary>
        private void ieStart()
        {
            try
            {
                //Wurde der IE noch nicht gestartet?
                if (launched == false)
                {
                    iexplore = new InternetExplorerClass();
                    myDoc = new HTMLDocumentClass();
                    launched = true;
                    iexplore.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(ieDocumentComplete);
                }
                else
                {
                    errorMsg = "Der Internet Explorer ist bereits gestartet.";
                }
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message;
            }
        }

        /// <summary>
        /// Auf Internetseite surfen
        /// </summary>
        /// <param name="isVisible">Soll das IE-Fenster sichtbar sein?</param>
        /// <param name="Url">Adresse der URL</param>
        public void ieNavigate(bool isVisible, string Url)
        {
            ieStart();
            object o = null;
            iexplore.Navigate(Url, ref o, ref o, ref o, ref o);
            iexplore.Visible = isVisible;
            url = Url;
        }

        /// <summary>
        /// Event das beim laden der Seite ausgelöst wird, wenn sie fertig geladen wurde
        /// </summary>
        private void ieDocumentComplete(object pDisp, ref object URL)
        {
            /* Ist die Seite vollständig geladen?
             * Anmerkung: Diese Abfrage dient dazu eine Endlosschleife zu verhindern, die das IE-Fenster
             * zum Absturz bringt.
             */
            if (finished == false)
            {
                //Soll "nur" der Button gedrückt werden?
                if (Only == true)
                {
                    try
                    {
                        myDoc = new HTMLDocumentClass();
                        myDoc = (HTMLDocument)iexplore.Document;

                        HTMLInputElement btnButton = (HTMLInputElement)myDoc.all.item(this.ButtonName, 0);
                        btnButton.click();
                    }
                    catch (Exception ex)
                    {
                        errorMsg = ex.Message;
                    }
                }
                //HTML-Elemente ausfüllen und Button drücken aber nur wenn ein Button Name angegeben wurde!
                else
                {
                    try
                    {
                        //Durchlaufe alle übergebenen IDs und übergebe die Werte
                        foreach (KeyValuePair<string, string> str in fField)
                        {
                            myDoc = new HTMLDocumentClass();
                            myDoc = (HTMLDocument)iexplore.Document;

                            HTMLInputElement oTextbox = (HTMLInputElement)myDoc.all.item(str.Key, 0);
                            oTextbox.value = str.Value;
                        }
                        //Wurde kein Button Name angegeben, ignoriere den ButtonClick Code
                        if (this.ButtonName != null)
                        {
                            HTMLInputElement btnButton = (HTMLInputElement)myDoc.all.item(this.ButtonName, 0);
                            btnButton.click();
                        }
                    }
                    catch (Exception ex)
                    {
                        errorMsg = ex.Message;
                    }
                }
            }
            finished = true;
        }

        /// <summary>
        /// Das Fenster des Internet Explorers schließen
        /// </summary>
        public void ieClose()
        {
            try
            {
                //Stoppe den IE und schließe ihn
                iexplore.Stop();
                iexplore.Quit();

                launched = false;
                finished = false;
            }
            catch (Exception ex)
            {
                errorMsg = ex.Message;
            }          
        }

        /// <summary>
        /// Lädt den HTML-Code von der Seite runter
        /// </summary>
        /// <remarks>Nicht sehr schnell</remarks>
        /// <returns>HTML-Quelltext</returns>
        public string ieGetHTML()
        {
            string Url = url;
            WebClient WC = new WebClient();
            Stream s = WC.OpenRead(url);
            StreamReader sr = new StreamReader(s);
            string htmlSource = sr.ReadToEnd();
            return htmlSource;
        }

        /// <summary>
        /// Wert in ein HTML-Element eintragen
        /// </summary>
        /// <param name="Value">Zu übergebender Wert</param>
        /// <param name="FieldName">Name des Elements</param>
        public void ieFillField(string Value, string FieldName)
        {
            fField.Add(FieldName, Value);
        }

        /// <summary>
        /// Einen Klick auf einen Button ausführen
        /// </summary>
        /// <param name="ButtonName">Name des Buttons</param>
        /// <param name="Only">Werden Werte übermittelt?</param>
        public void ieButtonSubmit(string ButtonName, bool Only)
        {
            this.ButtonName = ButtonName;
            this.Only = Only;
        }

        /// <summary>
        /// Fehlermeldung anzeigen
        /// </summary>
        /// <returns>Gibt die Fehlermeldung aus</returns>
        public string ErrorMessage()
        {
            return errorMsg;
        }        
        #endregion
    }
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!