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;
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
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;
}
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
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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!
Danke Seraph, das hat geholfen es funktioniert zwar noch nicht so wie es sollte aber es ließt nun wenigstens das Document.
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.
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
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