Подтвердить что ты не робот

Как запустить событие мыши в Firefox с помощью JavaScript?

Я пытаюсь выполнить автоматическое тестирование с помощью WebDriver, но в настоящее время он не имеет возможности имитировать события колесика мыши. В качестве обходного пути я пытаюсь запустить эти события с помощью JavaScript. Я делаю все свое колесо, экспериментируя на прямой HTML-странице прямо сейчас, а не в рамках WebDriver.

Я специально пытаюсь запустить событие колеса мыши на элементе прокрутки div.

До сих пор я мог делать это с Chrome и IE9, но я не могу заставить ничего работать в Firefox (5.x).

Я использую следующий код кросс-браузера, чтобы обнаруживать, когда запускаются события колесика мыши, которые я вырвал из сети. Этот код способен отображать событие во всех браузерах, когда я просматриваю колесико мыши в прокручиваемом div, который я создал (id = 'view').

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

Функция, приведенная ниже, при вызове, способна запускать событие колеса мыши в Chrome и IE9 и получает выбранный выше обработчик с ожидаемым поведением.

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

Конечно, он не работает для Firefox. Я обнаружил, что существующая документация слишком скудна и запутанна, чтобы знать, как FF справляется с этим. Может ли кто-нибудь показать мне минимальный минимум, чтобы запустить событие мыши в Firefox с дельтой колеса (помещенной там, где FF ожидает его), так что мой обработчик подберет ее?

4b9b3361

Ответ 1

Ну,

  • В части кода Mozilla, если вы слушаете DOMMouseScroll, вы должны отправить событие DOMMouseScroll тоже, нет? (mousewheel представляется Microsoft, скопированное webkit, но не Gecko).
  • Вместо того, чтобы устанавливать (только для чтения) свойства в событии, вы должны вызвать соответствующий метод init...(), который для события мыши initMouseEvent(). (spec)

Вот исправленный тестовый файл, который работает в Firefox: http://jsfiddle.net/6nnMV/

Вероятно, вам не полезно, но может представлять интерес для других людей, которые хотят имитировать события, вот как (привилегированные) модульные тесты в mozilla имитируют "реальные" события: http://hg.mozilla.org/mozilla-central/annotate/a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248