2008-09-18 13 views
7

Estoy tratando de averiguar cómo hacer clic en un botón en una página web mediante programación.¿Cómo hacer clic en un botón en una página web de ASP.NET mediante programación?

Específicamente, tengo un WinForm con un control WebBrowser. Una vez que se desplaza a la página de inicio de sesión ASP.NET objetivo que estoy tratando de trabajar con él, en el controlador de eventos DocumentCompleted Tengo el siguiente código:

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

Esto llena las cajas de texto ID de usuario y la contraseña bien, pero estoy no tener éxito al hacer clic en ese botón zurcido; También intenté con "hacer clic", "hacer clic" y "al hacer clic", ¿qué más hay? Una búsqueda de msdn, por supuesto, no me da pistas ni groups.google.com. Tengo que estar cerca. O tal vez no, alguien me dijo que debería llamar al método POST de la página, pero cómo se hace esto no formaba parte de los consejos dados.

BTW El botón está codificado:

<input type="submit" name="logonButton" value="Login" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="logonButton" tabindex="4" /> 
+0

[Aquí hay una buena referencia] (http://www.webtropy.com/articles/InternetExplorer.asp?Internet%20explorer) para usar el control WebBrowser (.NET 2.0) para interactuar con diferentes elementos de formulario. –

Respuesta

8

¿Cómo funciona esto? Que funciona para mí

HtmlDocument doc = webBrowser1.Document; 

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

Puede tratar de invocar el método Page_ClientValidate() directamente a través del ClientScript lugar de hacer clic en el botón, que me desenterrar un ejemplo.

Usando MSHTML

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

Esto podría ser un problema si la página de inicio de sesión busca específicamente el clic del botón –

+0

Muy cierto, lo había pensado pero decidí descartar el método de invocación de todos modos. –

6

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

+0

Eso es genial si fuera el script del cliente que necesitaba, pero lo que estoy tratando de hacer es del lado del servidor. – Cyberherbalist

1

¿Has probado fireEvent en lugar de RaiseEvent?

1

Puede llamar al método directamente y pasar el objeto genérico y los parámetros de EventArgs. Por supuesto, esto podría no funcionar si estuvieras mirando los parámetros del remitente y EventArgs para datos específicos. La forma en que generalmente lo manejo es para refactorizar las agallas del método a un método doSomeAction() y el controlador de eventos para el clic del botón simplemente llamará a esta función. De esta forma, no tengo que encontrar la manera de invocar lo que generalmente es solo un controlador de eventos para hacer un poco de lógica en la página/formulario.

En el caso de que javascript haga clic en un botón para una publicación de formulario, puede invocar form.submit() en el script del cliente, que ejecutará los scripts de validación que haya definido en la etiqueta, y luego analizar el Form_Load evento y tomar el valor de texto del botón de enviar en ese formulario (suponiendo que solo haya uno) - al menos esa es la forma de ASP.NET 1.1 con la que estoy muy familiarizado ... cualquiera sabe algo más elegante con 2.0+ ?

0

Publicó un comentario en el sentido de no querer utilizar un script del lado del cliente en la respuesta de @ Phunchak. Creo que lo que estás tratando de hacer es imposible. La única forma de interactuar con el formulario es a través de un script del lado del cliente. El código C# solo puede controlar lo que sucede antes de que la página se envíe al navegador.

0

intento esto button.focus System.Windows.Forms.SendKeys.Send ("{ENTER}")

1

Sólo una posible utilidad adicional donde botón no se ha dado el presente un Id - como suele ser el caso.

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

lo tanto se le puede llamar así:

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

que va a lanzar una excepción si la entrada de presentar, junto con el valor 'Login', pero se puede romper para arriba si desea condicionalmente Verifique antes de invocar el clic.

+1

Me sentí ligeramente travieso y volví a jigger para aceptar el documento de control para que fuera una función genérica. – MonsCamus

Cuestiones relacionadas