通过JavaScript模拟键盘事件

9
我正在尝试通过JavaScript在网页中模拟键盘事件,因为Safari浏览器不支持Actions。
首先,我创建了一个简单的表单(如下所示),并尝试通过Tab键切换文本框,但它没有起作用。
使用的JavaScript代码如下(ubuntu和chrome浏览器)。我在Chrome浏览器控制台中执行了该脚本。
var pressTabKey = document.createEvent("KeyboardEvent");
pressTabKey.initKeyboardEvent("keypress", true, true, null, false, false, false, false, 9, 0);
document.getElementById('1234').focus();
document.getElementById('1234').dispatchEvent(pressTabKey);

HTML表单:

   <html>      
   <head>         
   </head>   
   <body>
        <p>Test Page </p>      
        <form>
        <input  id="1234" type="text" value="Enter Here"> 
        <br>
        <br>
        <input  id="1235" type="text" value="Enter Here">           
        </form>  
  </body>   
  </html>

这不是 https://dev59.com/AnNA5IYBdhLWcg3wcNbF 的重复吗? - Capsule
我确实阅读了那个帖子并使用了其中的函数和参数。但是,尽管我可以模拟鼠标事件,但我无法模拟键盘事件,例如按Tab键。无论如何,我会再次检查这两个博客。 - user1925406
也许这会有所帮助:https://dev59.com/FXRB5IYBdhLWcg3wiHpl - Jos
当我尝试运行你上面展示的代码 - https://jsfiddle.net/pymgnbk9/2/ - 它像预期一样切换到了第一个输入框,所以不确定哪里出了问题。你是否确保在调用JS之前HTML已经加载完毕? - jjbskir
抱歉,为什么你不能只用 focus() 来实现跳转呢? - webdeb
3个回答

3
希望这能帮到你: https://developer.mozilla.org/zh-CN/docs/Web/Guide/Events/Creating_and_triggering_events 例子: 我创建了一个事件并使用dispatchEvent()来触发它:
var pressTabKey = new Event('keydown');
document.getElementById('1234').addEventListener('keydown', function() { alert("hi!"); });
document.getElementById('1234').dispatchEvent(pressTabKey);

函数createEvent()已弃用: https://developer.mozilla.org/zh-CN/docs/Web/API/Document/createEvent


编辑: 您可以从keydown或keypress事件中直接读取密钥代码,例如:

http://jsfiddle.net/adrielD/me9q1qu6/

HTML

<p>Test Page </p>      
<form>
    <input id="1234" type="text" value="Enter Here"><br>
    <input id="1235" type="text" value="Enter Here">          
</form>

JS:

var tab1 = document.getElementById("1234");
var tab2 = document.getElementById("1235");

tab1.addEventListener("keydown", function(event) {
     if(event.keyCode == 9) {
        event.preventDefault();
        tab2.focus();
     }
});

tab2.addEventListener("keydown", function(event) {
    if(event.keyCode == 9) {
        event.preventDefault();
        tab1.focus();
    }
});

2
如果你已经加载了jQuery,你可以像这样做:
$(el).trigger({type: 'keypress', which: 13, keyCode: 13});

对于您的例子,应该是这样的:

$("#1234").trigger({type: 'keypress', which: 9, keyCode: 9});

请查看http://api.jquery.com/trigger/获取完整的文档。

0

我遇到了完全相同的问题,尝试了很多方法,最终使用AHK触发键盘事件(以及一些鼠标事件)。我只是找不到任何仅限于selenium的解决方案。不过,AHK仅适用于Windows。如果您在其他平台上使用selenium,比如Mac OS,请查看this thread

使用AHK,很容易进行按键操作,在设置焦点后,只需启动AHK脚本,在其中“发送键”即可:

send, abc

AHK拥有完整的脚本语言,因此您可以将其包装在循环/条件中。如果需要,您还可以模拟特定位置的鼠标点击。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接