Was ist die Ursache für die Inkonsistenz - Htmlinputelement mshtml
Frage
Meine Forderung - ich programmatisch eine Instanz von Internet Explorer öffnen. Dann erhalte ich die Htmldocument und Blick für ein Eingabefeld (Textfeld) und dann seinen Wert festgelegt.
HTMLDocument oDoc = new mshtml.HTMLDocumentClass();
oDoc = (HTMLDocument)oBrowser.Document;
HTMLInputElement txtbox1 = (HTMLInputElement)oDoc.all.item("login",0);
txtbox1.setAttribute("value", "test_user_name", 0);
//txtbox1.value = "test_user_name";
Mein Code funktioniert gut, bis das Eingabefeld gesucht wird. Das Problem ist, irgendwo im Code, den ich oben gepostet ahve. Ich erhalten die Htmldocument-Objekt, dann sehe ich für das Htmlinputelement mit dem Namen „login“. Hier begegne ich eine Inkonsistenz - Das Textfeld wird nicht manchmal erkannt und so, wenn es die txtbox1.SetAttribute
oder txtbox1.value
erreicht dann ein NullReferenceException
geworfen wird. Aber dies geschieht nicht immer. Manchmal wird die Ausnahme nicht geworfen, und der Code funktioniert gut.
Ich habe versucht, den Code debuggen durch, aber der Fehler zeigt nie, wenn ich durch den Code debuggen !!
Ich bin nicht in der Lage, herauszufinden, was der Grund dafür sein? Was verursacht diese Inkonsistenz? Irgendwelche Ideen?
Lösung
Sind Sie sicher, dass die Seite vollständig geladen, wenn der Code ausgeführt wird? Wenn nicht, ist der DOM möglicherweise nicht Ihre Kontrolle an der Zeit, die Sie Ihren Code ausführen.
Sie sollten ein webBrowser1.DocumentCompleted Ereignis hinzufügen und dann den Code in dem fertiggestellten Ereignishandler ausführen das DOM, um sicherzustellen, vollständig erstellt wird.
Ich würde auch empfehlen, das WebBrowser-Steuerelement von System.Windows.Forms statt axwebbrowser und mshtml verwenden. Das ist, wenn Sie den Browser in einem Fenster der eigenen hosten. Ich habe einige Probleme mit mshtml in der Vergangenheit, vor allem im Zusammenhang auf Ereignisse zu Einhaken.
webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted)
.
.
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
var doc = webBrowser1.Document;
var txtBox1 = doc.All["login"];
txtBox1.SetAttribute("value", "test_user_name");
}