15

Estoy tratando de hacer pruebas automáticas con WebDriver, pero actualmente no tiene la capacidad de simular eventos de la rueda del mouse. Como solución, intento activar estos eventos con JavaScript. Estoy haciendo todo mi trabajo experimentando en una página HTML directa ahora mismo, no dentro del marco de WebDriver.Cómo activar el evento de la rueda del mouse en Firefox con JavaScript?

Estoy específicamente intentando activar un evento de rueda del mouse en un elemento div desplazable.

Hasta ahora he podido hacer esto con Chrome e IE9, pero parece que no funciona nada en Firefox (5.x).

Estoy usando el siguiente código de navegador cruzado para detectar cuándo se disparan los eventos de la rueda del mouse, que se enganchó en la red. Este código es capaz de recoger el evento en todos los navegadores cuando muevo la rueda del mouse dentro de la división de desplazamiento que he creado (id = 'ver').

<script type="text/javascript"> 
    function wheel(event) { 
    var delta = 0; 
    if (!event) { 
     event = view.event; 
    } 
    if (event.wheelDelta) { 
     delta = event.wheelDelta/120; 
    } 
    else if (event.detail) { 
     delta = -event.detail/3; 
    } 

    alert(delta); 
    } 

    var view = document.getElementById('view'); 

    if (view.addEventListener) { 
    view.addEventListener('DOMMouseScroll', wheel, false); 
    } 

    view.onmousewheel = wheel; 
</script> 

La función más adelante, cuando se le llama, es capaz de desencadenar el evento rueda del ratón en Chrome e IE9, y consigue tomada en el controlador anterior con el comportamiento esperado.

function ChromeWheel() { 
    var evt = document.createEvent("MouseEvents"); 
    evt.initEvent('mousewheel', true, true); 
    evt.wheelDelta = 120; 
    view.dispatchEvent(evt); 
} 

Por supuesto, no funciona para Firefox. He encontrado que la documentación existente es demasiado escasa y confusa para saber cómo maneja esto FF. ¿Alguien puede mostrarme el mínimo indispensable para disparar un evento de rueda de mouse en Firefox con un delta de rueda (colocado donde FF lo espera), de modo que mi manejador lo levante?

+0

Siempre me pregunto por qué la gente quiere activar eventos nativos directamente así. Si es su página y su código y desea ver el efecto de un desplazamiento del mouse, ¿por qué no simplemente llama a la función directamente que se ejecuta cuando su código recibe un evento de desplazamiento del mouse? Debería ser capaz de factorizar eso fuera de su código y llamarlo directamente sin pasar por el sistema de eventos y luego tendría cero dependencia del navegador y simplemente funcionaría en todas partes. – jfriend00

+3

Porque no es solo mi código y ni siquiera estoy interesado en disparar eventos como parte de mi aplicación. Intento ejercer la aplicación como parte de un proceso de control de calidad, y es importante para nosotros que no comencemos a modificar el código en todas partes para hacerlo. –

+0

OK - ayuda a saber lo que está tratando de hacer. ¿No hay herramientas profesionales para pruebas de control de calidad de páginas web que simularán todo tipo de eventos de usuario, incluidos todo tipo de eventos de mouse y esas herramientas inyectan eventos a nivel del sistema para que funcionen con todos los navegadores? – jfriend00

Respuesta

11

Bueno,

  1. En la parte de Mozilla del código, si estás escuchando para DOMMouseScroll se debe distribuir un evento DOMMouseScroll también, ¿no? (mousewheel parece ser un Microsoft invention copied by webkit, but not Gecko).
  2. En lugar de establecer (solo) propiedades en el evento, se supone que debe llamar al método init...() apropiado, que para el evento del mouse es initMouseEvent(). (spec)

Aquí hay un caso de prueba arreglado, que funciona en Firefox: http://jsfiddle.net/6nnMV/

Probablemente no es útil para usted, pero puede ser de interés para otras personas que buscan para simular eventos, así es como unidad (privilegiada) pruebas en mozilla simulan eventos 'reales': http://hg.mozilla.org/mozilla-central/annotate/a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248

+0

De acuerdo con la especificación, parece que initWheelEvent() podría ser una mejor opción (¿o es un caso que esto generalmente no se implementa todavía?). Sin embargo, la demostración funciona claramente, y las referencias son invaluables. Gracias. –

+0

@jaquadro: sí, todavía no en Mozilla: http://mxr.mozilla.org/mozilla-central/search?string=initWheelEvent – Nickolay

+0

¿Por qué eligió el valor "120" por lo que supongo que es el "monto de desplazamiento" ¿valor? ¿Qué significa eso en términos prácticos? – thisissami

Cuestiones relacionadas