ejemplos - Con WatiN, me gustaría esperar un evento jQuery
trigger click javascript (3)
Espero que alguien haya hecho esto. Tengo algunas modificaciones jQuery personalizadas que utilizan el sistema de eventos jQuery para lanzar ciertos eventos para su procesamiento. Me gustaría poder hacer pruebas automáticas en respuesta a estos.
¿Alguien ha trabajado en un mejor vínculo desde WatiN a jQuery? He visto algunas publicaciones en un canal de paso para selectores jQuery, así como una publicación aquí sobre cómo esperar a que cambie el texto dado ... Sería genial si alguien añadiera la selección de jQuery y el soporte de eventos ... incluso el document.getElementsBySelector podría ser agradable
No espero que esta sea la respuesta correcta, ya que no tengo tiempo para ver WatiN, solo un par de notas que te ayudarán a hacer lo tuyo, 1er parche de mono jQuery:
ya que todos los eventos jQuery se activan con el disparador de la función.
var _trigger = jQuery.prototype.trigger;
jQuery.prototype.trigger = function () {
_trigger.apply( this, arguments );
alert( Array.prototype.join.call( arguments, ''-'' ) );
}
Esto haría que tu página alertara todos los argumentos que se dan cada vez que se dispara algo (como una cadena con ''-'' como separador), generalmente el primer argumento sería el evento. WatiN debería tener algún tipo de función que capture las alertas; si no, sugiero descartarlo e ir con watij o algo así, personalmente recomiendo HTMLUNIT
Además, si está interesado en qué desencadenó el evento, dentro de la función anterior, this
apuntaría a eso :)
Cosas que deberías verificar:
http://api.jquery.com/event.result/
http://api.jquery.com/event.data/
No sé si es lo que esperas, pero tuve algo de tiempo para investigar y vine con una solución a la pregunta: con WatiN, me gustaría esperar un evento jQuery.
El objetivo es escribir en C #:
Browser.WaitForEvent("#link", "onclick");
Escribí una página de prueba (disponible en http://www.sp4ce.net/debug.html ) donde desencadena un evento onclick
en el enlace cuando hace clic en el botón.
Luego escribí el método de extensión .WaitForEvent
public static void WaitForEvent(this Browser browser, string selector, string eventname)
{
using (EventMonitorWatcher monitor = new EventMonitorWatcher(browser, selector, eventname))
{
int timeWaited = 0;
var maxTimeWait = Settings.WaitForCompleteTimeOut * 1000;
do
{
Thread.Sleep(Settings.SleepTime);
timeWaited += Settings.SleepTime;
}
while (!monitor.IsEventCalled() && timeWaited < maxTimeWait);
}
}
Este método usa un EventMonitorWatcher
que verifica que el evento ha sido llamado.
public class EventMonitorWatcher : IDisposable
{
private readonly Browser _browser;
private readonly string _selector;
private readonly string _eventname;
public EventMonitorWatcher(Browser browser, string selector, string eventname)
{
_browser = browser;
_selector = selector;
_eventname = eventname;
_browser.Eval(string.Format("startEventMonitor(''{0}'', ''{1}'')", _selector, _eventname));
}
public bool IsEventCalled()
{
string result = _browser.Eval(string.Format(
"isEventCalled(''{0}'', ''{1}'')", _selector, _eventname));
return result == "true";
}
public void Dispose()
{
_browser.Eval(string.Format("stopEventMonitor(''{0}'', ''{1}'')", _selector, _eventname));
}
}
Este monitor usa tres métodos javascript (jquery powered) que inicia una monitorización, detiene una monitorización y verifica si el evento ha sido llamado.
startEventMonitor = function(selector, event) {
$(selector).data(''eventMonitorResult'', false);
var eventMonitorHandler = function() {
$(selector).data(''eventMonitorResult'', true)
};
$(selector).data(''eventMonitorHandler'', eventMonitorHandler);
$(selector).bind(event, eventMonitorHandler);
};
stopEventMonitor = function(selector, event) {
$(selector).undbind(event, $(selector).data(''eventMonitorHandler''));
$(selector).data(''eventMonitorResult'', false);
};
isEventCalled = function(selector, event) {
return $(selector).data(''eventMonitorResult'');
};
Aquí está, luego necesita insertar este javascript como una cadena en su página cuando ejecuta el navegador.
[Test]
public void Test()
{
using(var browser = new IE("http://www.sp4ce.net/debug.html")
{
browser.Eval(JavaScript);
browser.WaitForEvent("#link", "onclick");
}
}
En esta prueba, cuando hace clic en el botón "hacer clic", la prueba debe finalizar directamente y su navegador se cierra;
¿Por qué no inyectar algunos javascript que se adjunta a los eventos que desea escuchar? En el código de su evento javascript al que se llama cuando se desencadenan los eventos, puede agregar un elemento al DOM con los resultados que le interesan. Cree una Div por ejemplo y configure innerHtml con el resultado que desea verificar. Dale a la Div una ID única.
Flujo básico:
browser.RunScript (javascript_here_to_attach_to_the_events_you_are_interested_in) Supongamos que cuando se activa el evento tu código inyectado crea una div con el Id = "my_event_result".
Haga las acciones que desencadenan su código de validación (como ingresar valores correctos / incorrectos) ejemplo: browser.TextField (textFieldIdWithValidation) .Typetext ("algún valor");
Espere a que aparezca la div: browser.Div ("my_event_result"). WaitUntilExists ();
Afirma los valores en el div: bool result = browser.Div ("my_event_result"). Text == "The expected test";
HTH, Jeroen