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?

War es hilfreich?

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");
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top