Comment cliquer sur un bouton sur une page Web ASP.NET par programmation?

J'essaie de comprendre comment cliquer sur un bouton sur une page Web par programmation.

Plus précisément, j'ai un WinForm avec un contrôle WebBrowser. Une fois qu'il a navigué vers la page de connexion ASP.NET cible avec laquelle j'essaie de travailler, dans le gestionnaire d'événements DocumentCompleted, j'ai codé:

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");

Cela remplit bien les zones de texte de l'ID utilisateur et du mot de passe, mais je n'ai pas réussi à cliquer sur ce bouton. J'ai également essayé "clic", "clic", et "onClick" - quoi d'autre est là ?. Une recherche de msdn ne me donne évidemment aucun indice, ni groups.google.com. Je dois être proche. Ou peut-être pas - quelqu'un m'a dit que je devrais appeler la méthode POST de la page, mais comment cela est fait ne faisait pas partie des conseils donnés.

BTW Le bouton est codé:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" />
0
Voici une bonne référence pour utiliser le contrôle WebBrowser (.NET 2.0) interagir avec différents éléments de formulaire.
ajouté l'auteur Adam Neal, source

8 Réponses

Avez-vous essayé fireEvent au lieu de RaiseEvent?

0
ajouté

Vous avez posté un commentaire sur le fait de ne pas vouloir utiliser un script côté client sur la réponse @ Phunchak. Je pense que ce que vous essayez de faire est impossible. La seule façon d'interagir avec le formulaire est via un script côté client. Le code C# peut uniquement contrôler ce qui se passe avant que la page ne soit envoyée au navigateur.

0
ajouté

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

0
ajouté

var btn = document.getElementById (btnName); si (btn) btn.click ();

0
ajouté
C'est génial si c'était le script client dont j'avais besoin, mais ce que j'essaie de faire est le côté serveur.
ajouté l'auteur Cyberherbalist, source

Vous pouvez essayer d'invoquer la méthode Page_ClientValidate() directement via le clientcript au lieu de cliquer sur le bouton, laissez-moi trouver un exemple.

Utiliser MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
0
ajouté
Cela pourrait être un problème si la page de connexion recherche spécifiquement le clic du bouton
ajouté l'auteur Jeff Martin, source
Très vrai, j'y avais pensé mais j'ai décidé de jeter la méthode invoke de toute façon.
ajouté l'auteur Quintin Robinson, source

Vous pouvez appeler directement la méthode et transmettre les paramètres d'objets génériques et EventArgs. Bien sûr, cela peut ne pas fonctionner si vous regardez les paramètres de l'expéditeur et EventArgs pour des données spécifiques. Ce que je fais habituellement c'est de refactoriser le courage de la méthode à une méthode doSomeAction() et le gestionnaire d'évènement pour le clic sur le bouton appellera simplement cette fonction. De cette façon, je n'ai pas à comprendre comment appeler ce qui est habituellement juste un gestionnaire d'événements pour faire un peu de logique sur la page/formulaire.

Dans le cas d'un JavaScript en cliquant sur un bouton pour un message de formulaire, vous pouvez appeler form.submit() dans le script côté client - qui exécutera tous les scripts de validation que vous avez définis dans le tag - puis analyser l'événement Form_Load et récupérer le valeur textuelle du bouton de soumission sur ce formulaire (en supposant qu'il n'y en a qu'un) - du moins c'est la façon ASP.NET 1.1 avec laquelle je suis très familier ... quelqu'un sait quelque chose de plus élégant avec 2.0+?

0
ajouté

Comment cela marche-t-il? Travaille pour moi

HtmlDocument doc = webBrowser1.Document;

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

Juste un supplément utile possible où le bouton d'envoi n'a pas reçu d'identifiant - comme c'est souvent le cas.

    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;
    }

Donc vous pouvez l'appeler comme ça:

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

Cela déclenchera une exception si l'entrée submit avec la valeur 'Login', mais vous pouvez le décomposer si vous voulez vérifier conditionnellement avant d'invoquer le clic.

0
ajouté
Je me suis senti légèrement vilain et re-jigged pour accepter le document de contrôle de sorte que ce soit une fonction générique.
ajouté l'auteur MonsCamus, source