Mit C# Website bedienen

dartox

Erfahrenes Mitglied
Hallo Leute,

und zwar möchte ich eine spezielle Seite mit C# bedienen. Dazu hab ich ne Windows Form angelegt, mit Textfeldern und nem Button. Ich hab mich im Internet schlau gemacht, und paar Snippets gefunden die ich dann passend umgeschrieben habe. Folgender Code bewirkt beim Button-Click (button1) dass die Seite geladen wird, und Button2 bewirkt dass man sich automatisch in die Seite einloggt (also Username, Passwort werden eingetragen, und dann wird automatisch auf "login" geklickt).

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Automator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Url = new Uri("http://www2.dasservice.at/");
            webBrowser1.Refresh();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == webBrowser1.Url)
            {
                
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
                    webBrowser1.Document.All["TEXTBOX_Benutzer"].SetAttribute("value", "USERNAME");
                    webBrowser1.Document.All["TEXTBOX_Kennwort"].SetAttribute("value", "PASSWORT");
                    webBrowser1.Document.GetElementById("IMAGEBUTTON_Login").InvokeMember("click");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click");
        }
    }
}

nun ist es aber so, dass nach dem login wieder auf einen button geklickt werden soll, Automatisch natürlich. Nachdem dann dieser Button (auf der Homepage) geklickt wurde, sollten Textformen ausgefüllt werden und wieder ein Button geklickt werden (auf der Homepage). Und so geht es weiter. Alles automatisch. Wenn ich aber jetzt folgenden code

Code:
webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click");

einfach Anhänge beim Button2-Code, dann bekomm ich ne Fehlermeldung. Ist auch klar, da ja der login noch nicht vollzogen ist, sprich die Seite noch nicht fertig geladen ist. Wie kann ich also warten bis die Seite nach dem login fertig geladen ist, damit ich dann weitere Aktionen ausführen lassen kann? Ich hab was gelesen vom Website.Completed Event, allerdings ist mir nicht ganz schlüssig wie ich dieses Event in den Button2-Code einbinde. Ich hoffe ihr versteht was ich meine?!

Vielen Dank.
 
Hi dartox,

wenn ich das richtig versehe willst du dich an des DocumentCompleted event ran hängen. Das machst du am einfachsten so:

Code:
this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);

//...

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{

}

Du meldest dich einfach am event an und sobald die Seite fertig geladen ist wird automatisch die Methode "webBrowser1_DocumentCompleted" aufgerufen.

Grüsse
 
Vielen Dank erstmal.

Also es funktioniert jetzt dass ich einen weiteren Button voll Automatisch klicken lassen kann. Sprich ich ruf die Seite mit Button1 auf, mit Button2 log ich mich automatisch ein und dann klickt mein Programm noch auf einen weiteren Button, nachdem es gewartet hat bis die Seite fertig geladen ist. Allerdings will ich dieses Prozedere weiter führen, sprich nach dem login und dem Buttonklick (auf der Homepage) soll ein weiterer Button (auf der Homepage) gedrückt werden, natürlich nachdem die Seite erst fertig geladen wurde, und dann noch ein Button, und noch einer, usw.

Mein code sieht jetzt so aus:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Automator
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Url = new Uri("http://www2.dasservice.at/");
            webBrowser1.Refresh();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.All["TEXTBOX_Benutzer"].SetAttribute("value", "xxx");
            webBrowser1.Document.All["TEXTBOX_Kennwort"].SetAttribute("value", "xxx");
            webBrowser1.Document.GetElementById("IMAGEBUTTON_Login").InvokeMember("click");

            this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == webBrowser1.Url)
            {
                webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click");
                this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser2_DocumentCompleted);
            }
        }

        private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == webBrowser1.Url)
            {
                webBrowser1.Document.GetElementById("BUTTON_Reparatursuche").InvokeMember("click");
                this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted);
            }
        }

        private void webBrowser3_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == webBrowser1.Url)
            {
                webBrowser1.Document.GetElementById("BUTTON_AlleReparaturen").InvokeMember("click");
                this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted);
            }
        }
    }
}

Wie kann man das bewerkstelligen? weil wenn ich den code den du mir gesagt hast, also

Code:
        private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (e.Url == webBrowser1.Url)
            {
                webBrowser1.Document.GetElementById("BUTTON_Reparatursuche").InvokeMember("click");
                this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted);
            }
        }

einfach fortsetze, so bleibt er dennoch beim button-klick nach dem login stehen, und macht nicht weiter?!

danke.
lg
 
Hallo dartox,

ich würde dir empfehlen deine Events ab dem Programstart anzumelden.

C#:
public Form1()
{
    InitializeComponent();
    this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
    this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser3_DocumentCompleted);
    /// usw....
}

Es geht zwar auch so wie du es gemacht ahst, aber ich weiß nicht wie das genau abläuft wenn du den Button (Automatisiert) klickst und danach erst das Event anmeldest.
Es würde theroretisch auch ein Event reichen. Dieses wird ja immer aufgerufen sobald die Seite fertig geladen hat. Dann setzt du dir am besten definierte Zustände nach jedem Buttonclick (z.B. über ein Enum) und kannst in der Methode: "webBrowser1_DocumentCompleted" in einem Switchcase die nächste Aktion festlegen. Bin grad auf Arbeit und kann leider kein Codebeispiel auf die schnelle machen, aber wenn nötig kann ich heut abend mal was basteln :)

Natürlich nicht vergessen die Events auch wieder abzumelden wenn du das Programm beendest oder die Form schließt.

Grüsse
 
hallo, danke für die antwort.

ich würde dich wirklich bitten ein beispiel programm zu erstellen da ich momentan garnichts mehr verstehe. aber nur wenn es nicht zuviel arbeit bereitet! :)

ich muss ja nach jedem code (also nach jedem click auf der homepage) ja in das DocumentCompleted-Event springen, damit ich weiter machen kann mit dem nächsten klick auf der homepage, oder?!
 
Hallo,

ich muss ja nach jedem code (also nach jedem click auf der homepage) ja in das DocumentCompleted-Event springen, damit ich weiter machen kann mit dem nächsten klick auf der homepage, oder?!

Richtig. Nach jedem click wird ja folglich die HP neu geladen. Wenn das beendet ist landest du immer in ein und dem selben Completed Event. Von daher nicht sinnvoll für jeden Click ein extra Event anzumelden.


Hier mal ein Beispiel wie man es machen könnte. Muss aber gleich sagen das ich das nicht getestet habe. Es kann sein das das InvokeMember das DocCompleted Event nicht feuert. Dann einfach mal nach jedem Invoke ein Refresh aufrufen. Wie gesagt konnte das jetzt nicht testen. :(

C#:
public partial class Form1 : Form
    {
        BUTTON_STATE _currentState;

        // hier werden die status definiert
        enum BUTTON_STATE
        {
            Loaded,
            Login,
            CreateRepair,
            AllRepairs,
            SearchRepair
        }

        public Form1()
        {
            InitializeComponent();
            // am DocCompleted event anmelden
            this.webBrowser1.DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // den momentanen staus setzen
            _currentState = BUTTON_STATE.Loaded;
            // die url laden
            webBrowser1.Url = new Uri("http://www2.dasservice.at/");
            webBrowser1.Refresh();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            switch (_currentState)
            {
                case BUTTON_STATE.Loaded:
                    // als erstes wieder den nächsten status setzen
                     _currentState = BUTTON_STATE.Login;
                    webBrowser1.Document.All["TEXTBOX_Benutzer"].SetAttribute("value", "xxx");
                    webBrowser1.Document.All["TEXTBOX_Kennwort"].SetAttribute("value", "xxx");
                    webBrowser1.Document.GetElementById("IMAGEBUTTON_Login").InvokeMember("click");
                    break;
                case BUTTON_STATE.Login:
                    _currentState = BUTTON_STATE.CreateRepair;
                    webBrowser1.Document.GetElementById("BUTTON_ReparaturAnlegen").InvokeMember("click");
                    break;
                case BUTTON_STATE.CreateRepair:
                    _currentState = BUTTON_STATE.AllRepairs;
                    webBrowser1.Document.GetElementById("BUTTON_AlleReparaturen").InvokeMember("click");
                    break;
                case BUTTON_STATE.AllRepairs:
                    _currentState = BUTTON_STATE.SearchRepair;
                    webBrowser1.Document.GetElementById("BUTTON_Reparatursuche").InvokeMember("click");
                    break;
            }
        }  

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // event wieder abmelden ( nur für den fall das die form aber nicht die app geschlossen wird)
            this.webBrowser1.DocumentCompleted -= new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.webBrowser1_DocumentCompleted);
        }      
    }

Grüsse
 
wow.... du bist mein held, es funktioniert perfekt! vielen dank!!

dankeschön. allerdings hab ich noch eine kleine frage. und zwar ist das jetzt mit richtigen buttons kein problem (das klicken), aber es gibt auf dieser seite die ich gerne automatisieren möchte auch andere "buttons", ich glaube javascript buttons bei denen ich nicht richtig durchblicke. ich habe mal so eine seite von der homepage auf nen free-webspace-anbieter gestellt, um es dir zeigen zu können.

-> http://csharptestbeispiel.110mb.com/Das Service.htm

z.b. dieser "Einen neuen Reparaturfall erstellen"-Button. dieser hat keine ID sodass ich nicht GetElementByID verwenden kann... weißt du was ich meine?

PS: von einer anderen seite müsste ich werte auslesen, und auf diese werte dann entsprechend reagieren mit dem herumgeklicke auf der oben genannten seite. ich brauche von der einer bestimmten seite 3 werte, die ganz klassisch in ner tabelle stehen. in der linken spalte steht immer die gleiche "überschrift", auf der rechten seite dann die entsprechenden werte die immer anders sind. wie ist es möglich etwas aus ner tabelle (html) auszulesen, und in ne variable zu übergeben?
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück