Laden...

Login von Programm aus - HtmlDocument wurd nicht auf Instanz fest gelegt

Erstellt von Palladin007 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.020 Views
Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 12 Jahren
Login von Programm aus - HtmlDocument wurd nicht auf Instanz fest gelegt

Moin

Ich versuche gerade, auf einer Seite mich über ein Programm einzuloggen.

Dazu hab ich mir folgende Methode geschrieben:

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("www.formspring.me");

            HtmlElement ele = webBrowser1.Document.GetElementById("home_username");
            if (ele != null) ele.InnerText = "name";

            ele = webBrowser1.Document.GetElementById("password");
            if (ele != null) ele.InnerText = "password";

            ele = webBrowser1.Document.GetElementById("Login");
            if (ele != null) ele.InvokeMember("click");
        }

Dabei kommt aber folgender Fehler:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Das wurde in dieser Zeile angezeigt:
HtmlElement ele = webBrowser1.Document.GetElementById("home_username");

Weiß jemand, wo das Problem liegt?

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

U
189 Beiträge seit 2011
vor 12 Jahren

Möglicherweise wurde die Seite noch gar nicht geladen. Warte doch mal auf den Browser, bis der fertig ist.

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 12 Jahren

Stimmt, das wars 😄

Und eigenartiger Weise geht der Login jetzt auch, obwohl ich es gestern eigentlich genauso gemacht hab und es da nicht ging. Naja, egal, es funktioniert und das ist super^^

Eine Frage nur noch:

Gibt es im Webbrowser eine Möglichkeit, zu sagen, dass das Programm solange wartet, bis die Seite fertig geladen wird?

Hab das jetzt so gemacht, dass ich warte, bis die Seite geladen ist und dann ein Button klicke, der einloggt. Aber das find ich etwas unpraktisch.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

U
189 Beiträge seit 2011
vor 12 Jahren

der Browser hat eine eigenschaft(weiß grad nicht mehr genau wie sie heißt) die angibt, ob die Seite fertig geladen ist, verknüpft mit einer Schleife kommt das raus was du willst.
EDIT: isbusy müsste sie heißen

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 12 Jahren

Ich hab mir das jetzt so zurecht gelegt:

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { }

Das Problem dabei ist nur, dass ich irgendwie dann erst mal ewig warten muss.
Vielleicht kommt mir das auch nur so vor, deshalb werd ich mal ne Runde irgend etwas anderes machen und das laufen lassen.

Mich wunderts nur, dass ich solange nichts tun kann, wie als hätte das Programm irgend einen Fehler.

Bei der EIgenschaft, die du mir genannt hast:

while (!webBrowser1.IsBusy) { }

ist es das selbe Problem

Edit:

Ok, ich habe gerade beide Varianten ausprobiert und ne Weile gwartet.
Einfach nur weißes Fenster, mehr nicht.

Hier mal mein Code:

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "0";

            webBrowser1.Navigate("http://www.formspring.me");

            //while (!webBrowser1.IsBusy) { }
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) { }

            HtmlElement ele = webBrowser1.Document.GetElementById("input_login_username");
            if (ele != null) ele.InnerText = Name.Text;

            ele = webBrowser1.Document.GetElementById("input_login_password");
            if (ele != null) ele.InnerText = Passwort.Text;

            ele = webBrowser1.Document.GetElementById("login_form_submit");
            if (ele != null) ele.InvokeMember("click");

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

P
157 Beiträge seit 2010
vor 12 Jahren

Typische Fall von [FAQ] Warum blockiert mein GUI

Ich empfehle das WebBrowser.DocumentCompleted Ereignis zu verwenden.

Palladin007 Themenstarter:in
2.080 Beiträge seit 2012
vor 12 Jahren

Ja, so funktioniert es. Ich hatte nur gehofft, das alles in eine Methode zu hauen.

Naja, ist ein Schönheitsding, nichts was große Probleme bereiten würde.

Also vielen Dank für die Hilfe, jetzt kann ich fleißig weiter programmieren^^

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.