我正在使用jQuery 1.7.1
我的keyup
处理程序工作正常,即使设置有点复杂。这是在iframe叠加层中发生的。主页确实如此
our.Catalog.makeViewer = function(id) {
var iframe = document.createElement('iframe');
iframe.setAttribute()... // src, id, name, etc. Exact same host and method
document.body.appendChild(iframe);
iframe.contentWindow.focus();
$('html, body').css('overflow', 'hidden');
}
our.Catalog.makeViewer('foo') // actually bound to a click hander
在iframe <head>
中,我们有类似
our.Viewer = function(){
$(document).keyup(function(e){ doSomething() })
// and lots more, of course
}
$(function() {
new our.Viewer();
});
浏览器显示iframe的网址。我得到了整个浏览器窗口的所有真正的密钥,这很好,但是为了测试我希望能够从JavaScript模拟密钥。但是,无论我尝试什么都行不通。我试过了
$('body').trigger($.Event('keyup', {keycode: 40}))
$(document).trigger($.Event('keyup', {keycode: 40}))
$(document).keyup()
并且没有一个触发我的处理程序。然后我想也许问题是我正在使用iframe,所以我试过
$('#frameId').contents().find('body').trigger($.Event('keyup', {keycode: 40}))
不,这也不起作用。我不认为这是任何类型的权限/安全问题,因为$('#frameId').contents().find('body').addClass('test')
工作正常。
我希望我做一些有些人可以轻易纠正的蠢事。如何从JavaScript驱动程序模拟keyup?
答案 0 :(得分:2)
好的,code recommended by the jQuery文档适用于Selenium。或者至少是单行版本:
$('body').trigger($.Event('keyup', {keycode: 40, which: 40}))
在我的特定情况下,我没有从Selenium看到它,因为我们的处理程序检查e.which
而非e.keycode
和e.which
仍未定义,直到我们明确设置它。也许是jQuery 1.7.1中的一个错误?也许是由于jQuery和Selenium之间的互动?无论如何,设置e.which
让测试通过。
另一方面,从浏览器控制台获取工作更具挑战性。从Firefox上的Firebug我不得不cd(frames[2])
将上下文设置为有问题的iframe
。没有其他方式从另一个框架访问iframe会让我触发事件,可能是由于某种沙盒。 (我可以访问iframe的DOM,但不能访问iframe的jQuery。)在Chrome中,我必须从控制台底部的弹出菜单中选择iframe。在Safari中我必须使用
window.frames[2].$('body').trigger($.Event('keyup', {keycode: 40, which: 40}))
正如我所料,一些相对愚蠢的事情,没有在控制台中设置iframe上下文,并且由于其他原因实际上在Selenium中未通过测试。
谢谢@Ian的尝试。
答案 1 :(得分:-2)
试试这个
$(document).on("keyUp",function(){
//your logic
});
答案 2 :(得分:-2)
.trigger()仅适用于与.on()绑定的事件。
尝试绑定:
$(document).on('keyup', function (e) {
doSomething(e.keyCode);
});
测试:
$(document).trigger($.Event("keyup", { keyCode: 40 }));