2008-09-18 6 views
7

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

Spécifiquement, j'ai un WinForm avec un contrôle WebBrowser. Une fois qu'il accède à la page de connexion ASP.NET cible Je suis en train de travailler avec, dans le gestionnaire d'événements DocumentCompleted je donne les résultats suivants code:

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

Remplit les zones de texte userid et mot de passe bien, mais je suis ne pas avoir réussi à obtenir ce bouton reproché à cliquer; 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] (http://www.webtropy.com/articles/InternetExplorer.asp?Internet%20explorer) permettant d'utiliser le contrôle WebBrowser (.NET 2.0) pour interagir avec différents éléments de formulaire. –

Répondre

8

Comment ça marche? Fonctionne pour moi

HtmlDocument doc = webBrowser1.Document; 

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

Vous pouvez essayer d'appeler la méthode Page_ClientValidate() directement par le ClientScript au lieu de cliquer sur le bouton, laissez-moi déterrer un exemple.

Utilisation MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow; 
myBroserWindow.execScript("Page_ClientValidate();", "javascript"); 
+0

Cela peut être un problème si la page de connexion recherche spécifiquement le clic du bouton –

+0

Très vrai, j'y avais pensé mais j'ai décidé de jeter la méthode invoke de toute façon. –

6

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

+0

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

1

Avez-vous essayé fireEvent au lieu de RaiseEvent?

1

Vous pouvez appeler directement la méthode et transmettre les paramètres d'objet générique 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 de 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 de 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 le formulaire. événement et saisissez la valeur textuelle du bouton de soumission sur ce formulaire (en supposant qu'il n'y en a qu'un) - au moins c'est la manière ASP.NET 1.1 avec laquelle je suis très familier ... quelqu'un sait quelque chose de plus élégant avec 2.0+ ?

0

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

essayer cette button.focus System.Windows.Forms.SendKeys.Send ("{} ENTRER")

1

Juste un possible utile supplémentaire lorsque le bouton d'envoi n'a pas été donné un Id - 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; 
    } 

Ainsi, vous pouvez l'appeler comme ceci:

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

Il soulèverai une exception si la soumettre entrée avec la valeur « Login », mais vous pouvez le casser si vous voulez conditionnellement vérifiez avant d'invoquer le clic.

+1

Je me sentais légèrement méchant et ré-agrippé pour accepter le document de contrôle de sorte que c'est une fonction générique. – MonsCamus

Questions connexes