通过javascript模拟键盘事件

时间:2015-09-13 08:02:34

标签: javascript selenium-webdriver

我正在尝试通过javascript在网页中模拟键盘事件,因为Safari浏览器不支持Actions。

首先,我创建了一个简单的表单(如下所示),并试图通过文本框进行选项卡,但它不起作用。

使用的Java脚本:( 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>

3 个答案:

答案 0 :(得分:3)

希望这会有所帮助:

https://developer.mozilla.org/en-US/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/en-US/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();
    }
});

答案 1 :(得分:2)

如果您碰巧加载了jQuery,可以这样做:

if (redCopper.hitTestObject(currentWires) && currentWires.color== "RED")
{
     //trace("HIT_ RED");
     hasRedWire = false;
     redCopper.removeEventListener(MouseEvent.MOUSE_DOWN, redWireFunction);
     redWire.removeEventListener(MouseEvent.MOUSE_UP, redWireFunction);
     trace("HIT"); 
}
if (blueCopper.hitTestObject(currentWires) && currentWires.color== "BLUE")
{
    //trace("HIT_BLUE");
    hasBlueWire = false;
    blueCopper.removeEventListener(MouseEvent.MOUSE_DOWN, blueWireFunction);
    blueWire.removeEventListener(MouseEvent.MOUSE_UP, blueWireFunction);
    trace("HIT");
}

你的例子是:

<target name="wsdl2java">
    <java classname="org.apache.axis.wsdl.WSDL2Java" classpathref="DSSClient.classpath" failonerror="true" fork="true">
        <arg value="${wsdl.url}/DEX_august_2015.wsdl" />
        <arg line="-v -D -a" />
        <arg line="-o ${wsdl.url}/generated" />
        <arg line="-O -1" />
    </java>
</target>

有关完整文档,请参阅http://api.jquery.com/trigger/

答案 2 :(得分:0)

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

使用AHK,按键操作相当容易,在设置焦点后,只需启动AHK脚本,您可以在其中发送密钥':

Sub URLtoPDF()

  Dim DocPath As String
  Dim DocNumber As Integer
  Dim MsgBoxCompleted

  Range("A1").Select
  DocNumber = 1

  Do Until IsEmpty(ActiveCell)

    Dim AppWord As Word.Application
    Set AppWord = CreateObject("Word.Application")

    AppWord.Visible = False

    ActiveCell.Copy

    DocPath = "C:\docs\url" & DocNumber & ".pdf"

    'Create and save pdf
    AppWord.Documents.Add
    AppWord.Selection.Paste
    AppWord.ActiveDocument.SaveAs2 Filename:=DocPath, FileFormat:=wdFormatPDF

    'Prepare for next loop
    Application.CutCopyMode = False
    AppWord.Quit (wdDoNotSaveChanges)
    Set AppWord = Nothing
    ActiveCell.Offset(1, 0).Select
    DocNumber = DocNumber + 1

  Loop

  MsgBoxCompleted = MsgBox("Process complete.", vbOKOnly, "Process complete")

End Sub

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