15

WebDriver ile otomatik test yapmaya çalışıyorum, ancak şu anda fare tekerleği olaylarını simüle etme yeteneğine sahip değil. Bir geçici çözüm olarak, bu olayları JavaScript ile çalıştırmaya çalışıyorum. WebDriver çerçevesi içinde değil, şu anda düz bir HTML sayfasında denemelerimi deniyorum.Firefox'ta fare tekerleği olayını JavaScript ile nasıl tetiklerim?

Özellikle bir kaydırma tekerleği öğesinde fare tekerleği olayını tetiklemeye çalışıyorum.

Şimdiye kadar bunu Chrome ve IE9 ile yapabildim, ancak Firefox'ta çalışmak için hiçbir şey alamıyorum (5.x).

Fare tekerleği olaylarının ne zaman tetiklendiğini algılamak için aşağıdaki çapraz tarayıcı kodunu kullanıyorum. Bu kod, yarattığım kaydırılan div içinde fare tekerleğini kaydırdığımda (id = 'view') tüm tarayıcılarda olayı seçebiliyor. aradığında

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

aşağıda fonksiyonu, mümkün yangını Chrome ve IE9 fare tekerleği olaydır ve beklenen davranış ile yukarıdaki işleyicisinde aldı alır.

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

Elbette, Firefox için çalışmaz. FF'nin bunu nasıl ele aldığını bilmek için çok az ve karmaşık bir şekilde mevcut belgeleri buldum. Firefox'ta bir fare tekerleği olayını (FF'nin beklediği yere yerleştirilmiş) bir tekerlek deltası ile ateş ettirmek için bana en az bir şey gösterebilir mi? Eğer DOMMouseScroll için dinliyorsan

+0

İnsanların neden yerel olayları doğrudan bu şekilde tetiklemek istediklerini merak ediyorum. Sayfanız ve kodunuzsa ve bir fare kaydırmasının etkisini görmek istiyorsanız, neden kodunuz bir fare kaydırma olayı aldığında doğrudan yürüten işlevi çağırmıyorsunuz. Kodunuzdan bunu hesaba katabilmeli ve olay sisteminden hiç geçmeden doğrudan aramalı ve daha sonra tarayıcı bağımlılığı sıfır olacak ve her yerde çalışacaktır. – jfriend00

+3

Çünkü bu sadece benim kodum değil ve uygulamamın bir parçası olarak olayları kovmakla bile ilgilenmiyorum. Uygulamayı bir Kalite Güvence sürecinin parçası olarak kullanmaya çalışıyorum ve bunun için kodun tamamını değiştirmeye başlamadığımızın bizim için önemli. –

+0

Tamam - ne yapmaya çalıştığınızı bilmenize yardımcı olur. Web sayfalarının QA sınaması için kullanılan profesyonel araçlar, her türden fare olayları dahil olmak üzere, her türlü kullanıcı olayını simüle edecek ve bu araçlar tüm tarayıcılarla çalışacak şekilde sistem düzeyinde olayları enjekte edecek şekilde üretilmiyor mu? – jfriend00

cevap

11

Eh, kod Mozilla bölümünde

  1. , hiç de bir DOMMouseScroll olayı gönderebilir ki? (mousewheel bir Microsoft invention copied by webkit, but not Gecko gibi görünüyor).
  2. Etkinliğin özelliklerini (salt okunur) ayarlamak yerine, fare olayı initMouseEvent() olan uygun init...() yöntemini çağırmanız gerekir. (spec)
  3. İşte

bir yukarı sabit Firefox'ta çalışmaktadır dizge, var: Muhtemelen http://jsfiddle.net/6nnMV/

sana değil kullanışlı ama olayları taklit etmek isteyen diğer kişilere ilgisini çekebilir, burada nasıl (ayrıcalıklı) birimi var mozilla'daki testler 'gerçek' olayları taklit eder: http://hg.mozilla.org/mozilla-central/annotate/a666b4f809f0/testing/mochitest/tests/SimpleTest/EventUtils.js#l248

+0

Spesifikasyona göre initWheelEvent() 'ın daha iyi bir seçenek olabileceği ortaya çıkıyor (ya da bunun henüz genel olarak uygulanmadığı bir durum mu?). Ancak demo açıkça işliyor ve referanslar paha biçilemez. Teşekkür ederim. –

+0

@jaquadro: evet, henüz Mozilla'da değil: http://mxr.mozilla.org/mozilla-central/search?string=initWheelEvent – Nickolay

+0

Neden "kaydırma miktarı" olduğunu düşündüğüm için "120" değerini seçtiniz değeri? Bu pratik anlamda ne anlama geliyor? – thisissami