Laden...

WebBrowser-Control: webBrowser1.Dokument liefert Null zurück

Erstellt von CrimeTime vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.081 Views
C
CrimeTime Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren
WebBrowser-Control: webBrowser1.Dokument liefert Null zurück

Hallo,
ich versuche derzeitig mit Hilfe von dem WebBrowser Dokument Formulardaten zu füllen, doch leider liefert webBrowser1.Dokument Null zurück.

hier der Code:

Form Load:

            WebBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(WebBrowser1_DocumentCompleted);
            WebBrowser1.Navigate("website");

und der Button wo ich die Felder füllen möchte:

           
frm2.WebBrowser1.Document.All["firstName"].InnerText = this.txtFirstName.Text;
            frm2.WebBrowser1.Document.All["lastName"].InnerText = this.txtLastName.Text;
            frm2.WebBrowser1.Document.All["emailAddress"].InnerText = this.txtEmail.Text;
            frm2.WebBrowser1.Document.All["emailAddressConfirmation"].InnerText = this.txtEmail.Text;
            frm2.WebBrowser1.Document.All["password"].InnerText = this.txtPass.Text;
            frm2.WebBrowser1.Document.All["passwordConfirmation"].InnerText = this.txtPass.Text;
49.485 Beiträge seit 2005
vor 13 Jahren

Hallo CrimeTime,

gibt es bei dir einen Zusammenhang zwischen WebBrowser1.DocumentCompleted und dem Zugriff auf frm2.WebBrowser1.Document? (BTW: man sollte nie auf Controls von anderen Forms zugreifen.) Es muss sichergestellt sein, dass frm2.WebBrowser1.Document erst aufgerufen wird, nachdem das passende(!) DocumentCompleted erfolgt ist. DocumentCompleted wird für jeden eigenständigen Teil der Seite gefeuert. Deshalb ist es wichtig, die in den EventArgs übergebene Url zu überprüfen. Erst wenn das DocumentCompleted für die Url, die geladen werden soll, kommt, ist es sicher auf WebBrowser1.Document zuzugreifen.

herbivore

C
CrimeTime Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

hier die funktion:

 private void WebBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            Process.Start("rundll32.exe", "InetCpl.cpl,ClearMyTracksByProcess 2");
            try
            {
                enumerator = this.WebBrowser1.Document.GetElementsByTagName("img").GetEnumerator();
                while (enumerator.MoveNext())
                {
                    HtmlElement current = (HtmlElement)enumerator.Current;
                    if (current.GetAttribute("src").Contains("captcha.jpg"))
                    {
                        current.ScrollIntoView(true);
                        this.Visible = true;
                        frm1.Visible = false;
                        this.WebBrowser1.Visible = true;
                    }
                }
            }
            finally
            {
                if (enumerator is IDisposable)
                {
                    (enumerator as IDisposable).Dispose();
                }
            }
            if (frm1.checkBox3.Checked)
            {
                frm1.txtEmail.Enabled = false;
            }
            else
            {
                frm1.txtEmail.Enabled = true;
            }
            if (frm1.CheckBox1.Checked)
            {
                frm1.txtFirstName.Enabled = false;
            }
            else
            {
                frm1.txtFirstName.Enabled = true;
            }
            if (frm1.CheckBox1.Checked)
            {
                frm1.txtLastName.Enabled = false;
            }
            else
            {
                frm1.txtLastName.Enabled = true;
            }
            if (frm1.checkBox4.Checked)
            {
                frm1.txtPass.Enabled = false;
            }
            else
            {
                frm1.txtPass.Enabled = true;
            }
            frm1.CheckBox1.Enabled = true;
            frm1.CheckBox2.Enabled = true;
            frm1.checkBox3.Enabled = true;
            frm1.checkBox4.Enabled = true;
            frm1.ComboBox_day.Enabled = true;
            frm1.ComboBox_month.Enabled = true;
            frm1.ComboBox_year.Enabled = true;
            frm1.button1.Enabled = true;
        }
Gelöschter Account
vor 13 Jahren

Hallo CrimeTime,

offenbar hast du die Antwort von herbivore nicht aufmerksam genug gelesen....

gruß
Jack

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo CrimeTime,

das ist doch klar. Man kann erst auf den WebBrowser zugreifen, sobald die Seite komplett geladen worden ist. Die WebBrowser-Klasse stellt dazu Events bereit. Desweiteren kannst solltest du prüfen, ob die Namen der Elemente auch richtig sind. Hier ein Beispiel für Google:

this.webBrowser1.Document.ActiveElement.InnerText = "Test";

zero_x

109 Beiträge seit 2010
vor 13 Jahren

Hallo CrimeTime,

überprüfst du auch ob das Document fertig geladen ist?

ist zwar unsauber aber setz mal bevor du das document mit daten füllen willst folgendes statement.


while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

Ich denke mir mal das das Document noch nicht fertig geladen ist und du trotzdem versuchst drauf zuzugreifen. Aber nur evtl.

oder du machst es wie herbivore beschrieben und geht über das DocumentCompleted-Event um dir sicher zu sein das das Document fertig geladen ist.

mfg Seraph

Ich beschütze das was am Wichtigsten ist!

C
CrimeTime Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

Danke Seraph, das hat geholfen es funktioniert zwar noch nicht so wie es sollte aber es ließt nun wenigstens das Document.

Gelöschter Account
vor 13 Jahren

Ich dachte mir schon, das du am ehesten den Vorschlag von Seraph umsetzt. Hierzu möchte ich dich von dieser Implementation ausdrücklich warnen. Die ist hässlich und wird dich nicht immer zum Ziel führen.

Herbivore hat bereits eine gute Lösung genannt.

C
CrimeTime Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

mag ja schön und gut sein, aber leider verfüge ich nicht über genügend Kenntnisse über den WebBrowser das ich dies umsetzen kann.

Gelöschter Account
vor 13 Jahren

Du weißt nicht, wie du eine Methode an ein Ereigniss anmeldest?

C
CrimeTime Themenstarter:in
28 Beiträge seit 2010
vor 13 Jahren

ich denke mir das ich die Funktion, in dem Falle den Button hinter Button1_Click() in die Klammer rein packen müsste, aber damit kann ich auch völlig Falsch liegen

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo CrimeTime,

naja, in dem EventHandler zu überprüfen, ob die Url in den EventArgs mit der zu ladenden Url übereinstimmt und wenn nicht den EventHandler wieder zu verlassen, setzt ja nun keine besonderen Kenntnisse über das WebBrowser-Control voraus.

Die "Problematik" mit dem Button löst du einfach dadurch, dass du den Button erst enablest, wenn das passende DocumentCompleted eintrifft.

Oder du lässt den Button immer enabled und merkst dir - wenn das DocumentCompleted noch nicht eingetroffen ist - nur, dass der Button gedrückt wurde. Wenn der Merker gesetzt ist, führst du die eigentliche Aktion im passenden DocumentCompleted ausführt.

Es gibt da viele einfache Wege.

Wenn dir das trotzdem nicht gelingt, beachte bitte [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1.

herbivore