0

我正在使用 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 的 URL。我得到了整个浏览器窗口的所有真实键控,这很好,但为了测试,我希望能够从 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 驱动程序模拟按键?

4

3 回答 3

2

好的,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 的尝试。

于 2013-04-08T22:38:28.673 回答
-2

试试看

$(document).on("keyUp",function(){ 
    //your logic
});
于 2013-04-08T07:05:37.560 回答
-2

.trigger() 仅适用于与.on()绑定的事件。

尝试绑定:

$(document).on('keyup', function (e) {
    doSomething(e.keyCode);
}); 

并测试:

$(document).trigger($.Event("keyup", { keyCode: 40 }));   
于 2013-04-08T07:15:17.687 回答