Wie programmgesteuert auf eine Schaltfläche auf einer ASP.NET-Webseite klicken?

Ich versuche herauszufinden, wie Sie programmgesteuert auf eine Schaltfläche auf einer Webseite klicken.

Insbesondere habe ich ein WinForm mit einem WebBrowser-Steuerelement. Sobald ich zur Ziel-ASP.NET-Anmeldeseite navigiere, mit der ich zu arbeiten versuche, habe ich im DocumentCompleted-Event-Handler Folgendes programmiert:

HtmlDocument doc = webBrowser1.Document;

HtmlElement userID = doc.GetElementById("userIDTextBox");
userID.InnerText = "user1";

HtmlElement password = doc.GetElementById("userPasswordTextBox");
password.InnerText = "password";

HtmlElement button = doc.GetElementById("logonButton");
button.RaiseEvent("onclick");

Dies füllt die Benutzer-ID und das Passwort-Textfeld gut aus, aber ich habe keinen Erfolg damit, diese verdammte Schaltfläche zu klicken; Ich habe auch versucht "klick", "klick" und "onClick" - was gibt es sonst noch ?. Eine Suche von msdn gibt mir natürlich keine Anhaltspunkte, noch groups.google.com. Ich muss nah sein. Oder vielleicht nicht - jemand sagte mir, ich sollte die POST-Methode der Seite aufrufen, aber wie das gemacht wird, war nicht Teil des Ratschlags.

BTW Der Button ist codiert:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />
0
hinzugefügt
Ansichten: 10
Hier finden Sie eine gute Referenz für die Verwendung des WebBrowser-Steuerelements (.NET 2.0). mit verschiedenen Formelementen interagieren.
hinzugefügt der Autor Adam Neal, Quelle

8 Antworten

Hast du FireEvent anstelle von RaiseEvent ausprobiert?

0
hinzugefügt

Sie haben einen Kommentar in der Art gepostet, dass Sie kein clientseitiges Skript für die @ Phunchak-Antwort verwenden möchten. Ich denke, was du versuchst zu tun, ist unmöglich. Die einzige Möglichkeit, mit dem Formular zu interagieren, ist über ein clientseitiges Skript. Der C# -Code kann nur steuern, was passiert, bevor die Seite an den Browser gesendet wird.

0
hinzugefügt

There is an example of how to submit the form using InvokeMember here. http://msdn.microsoft.com/en-us/library/ms171716.aspx

0
hinzugefügt

var btn = dokument.getElementById (btnName); if (btn) btn.click ();

0
hinzugefügt
Das ist großartig, wenn es Clientskript wäre, das ich brauche, aber was ich versuche, ist die Serverseite.
hinzugefügt der Autor Cyberherbalist, Quelle

Sie können die Methode PageClientValidate() direkt über das clientscript aufrufen und aufrufen, anstatt auf die Schaltfläche zu klicken. Lassen Sie mich ein Beispiel ausarbeiten.

Verwenden von MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
0
hinzugefügt
Dies kann ein Problem sein, wenn die Anmeldeseite gezielt nach dem Klick auf die Schaltfläche sucht
hinzugefügt der Autor Jeff Martin, Quelle
Sehr wahr, ich hatte darüber nachgedacht, entschied aber, dass ich die Aufrufmethode sowieso wegwerfen würde.
hinzugefügt der Autor Quintin Robinson, Quelle

Sie können die Methode direkt aufrufen und generische Objekt- und EventArgs-Parameter übergeben. Dies funktioniert natürlich nicht, wenn Sie die Parameter sender und EventArgs für bestimmte Daten betrachten. Normalerweise behandele ich die Eingeweide der Methode mit einer doSomeAction() -Methode und der Event-Handler für den Button-Klick ruft diese Funktion einfach auf. Auf diese Weise muss ich nicht herausfinden, wie man normalerweise nur einen Event-Handler aufruft, um ein bisschen Logik auf der Seite/dem Formular zu machen.

Wenn JavaScript auf eine Schaltfläche für einen Formulareintrag klickt, können Sie im Skript clientseitig form_submit() aufrufen, wodurch alle Validierungsskripte ausgeführt werden, die Sie im Tag definiert haben. Anschließend können Sie das Ereignis Form_Load analysieren und die Datei abrufen Textwert der Schaltfläche "Senden" auf diesem Formular (vorausgesetzt, es gibt nur eines) - das ist zumindest die ASP.NET 1.1-Methode, mit der ich mich sehr gut auskenne ... Wer kennt etwas Eleganteres mit 2.0+?

0
hinzugefügt

Wie funktioniert das? Funktioniert bei mir

HtmlDocument doc = webBrowser1.Document;

doc.All["userIDTextBox"].SetAttribute("Value", "user1");
doc.All["userPasswordTextBox"].SetAttribute("Value", "Password!");
doc.All["logonButton"].InvokeMember("Click");
0
hinzugefügt

Nur ein nützliches Extra, wo der Submit-Button keine ID bekommen hat - wie es häufig der Fall ist.

    private HtmlElement GetInputElement(string name, HtmlDocument doc) {
            HtmlElementCollection elems = doc.GetElementsByTagName("input");

            foreach (HtmlElement elem in elems)
            {
                String nameStr = elem.GetAttribute("value");
                if (!String.IsNullOrEmpty (nameStr) && nameStr.Equals (name))
                {
                    return elem;
                }
            }
            return null;
    }

Man kann es also so nennen:

 GetInputElement("Login", webBrowser1.Document).InvokeMember("Click");

Es wird eine Ausnahme ausgelöst, wenn die Eingabe mit dem Wert "Login" gesendet wird. Sie können diese jedoch aufteilen, wenn Sie vor dem Klick eine bedingte Überprüfung durchführen möchten.

0
hinzugefügt
Ich fühlte mich leicht ungezogen und re-jiged, um das Kontrolldokument zu akzeptieren, so dass es eine generische Funktion ist.
hinzugefügt der Autor MonsCamus, Quelle