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

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

Específicamente, tengo un WinForm con un control WebBrowser. Una vez que navega a la página de inicio de sesión de ASP.NET objetivo con la que trato de trabajar, 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 bien las casillas de texto de ID de usuario y contraseña, pero no estoy teniendo éxito para hacer clic en ese botón maldito; 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.

Por cierto, 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
agregado
Puntos de vista: 1
Aquí hay una buena referencia para usar el control WebBrowser (.NET 2.0) para interactuar con diferentes elementos de forma.
agregado el autor Adam Neal, fuente

8 Respuestas

¿Has probado fireEvent en lugar de RaiseEvent?

0
agregado

Publicó un comentario en la línea de no querer usar 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
agregado

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

0
agregado

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

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

Puede intentar e invocar el método Page_ClientValidate() directamente a través del clientecript en lugar de hacer clic en el botón, permítame excavar un ejemplo.

Usando MSHTML

mshtml.IHTMLWindow2 myBroserWindow = (mshtml.IHTMLWindow2)MyWebBrowser.Document.Window.DomWindow;
myBroserWindow.execScript("Page_ClientValidate();", "javascript");
0
agregado
Esto podría ser un problema si la página de inicio de sesión busca específicamente el clic del botón
agregado el autor Jeff Martin, fuente
Muy cierto, había pensado en eso, pero decidí tirar el método de invocación de todos modos.
agregado el autor Quintin Robinson, fuente

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 lado del cliente, que ejecutará todos los scripts de validación que haya definido en la etiqueta, y luego analizar el evento Form_Load y tomar el el valor del 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 ... ¿Alguien sabe de algo más elegante con 2.0+?

0
agregado

¿Como funciona esto? Funciona para mi

HtmlDocument doc = webBrowser1.Document;

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

Solo un posible extra útil en el que el botón de envío no ha recibido 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;
    }

Entonces puedes llamarlo así:

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

Se generará una excepción si la entrada de envío tiene el valor 'Iniciar sesión', pero puede dividirla si desea verificar condicionalmente antes de invocar el clic.

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