0

我正在使用机器人编写一些集成测试。我让机器人打开一个菜单,它应该从菜单中选择一个选项;除了回车键似乎被忽略了。菜单将打开并选择正确的菜单项,但是如果我按 Enter 键,则没有采取任何应有的操作。如果我手动按下适当的键,它会执行预期的操作。如果我在非 java 应用程序上运行机器人,其他应用程序将正确响应 enter 事件。所以我已经验证了我正确地发送了一个 enter 事件并且 java 菜单应该响应它;但有些东西不起作用。

我也尝试用空格事件替换输入事件(菜单也应该响应)并且也没有得到响应。

我正在使用最新的 sun JDK 在 redhat linux 上运行。我很确定这不是我的代码的明显问题,因为我发现这篇文章描述了遇到完全相同问题的人,但它没有解决方案:http ://www.velocityreviews.com/forums/t666100-机器人和awt-on-linux.html

private void requestTest(String testName){
    if(testName==currentTest)
        return;
    //overwrite config file with new data
    currentTest=testName;
    overwriteFile(configFile, getCurrentConfigFile());

    //close current graph
    pressKeyCombo(KeyEvent.VK_CONTROL, KeyEvent.VK_F4);

    //open File menu
    pressKeyCombo(KeyEvent.VK_ALT, KeyEvent.VK_F);
    //select the 'load defaults' option
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_DOWN);
    pressKey(KeyEvent.VK_SPACE);
}
4

3 回答 3

1

好吧,我遇到了按 Enter 键的同一个问题。我也是,当我最终尝试使用 Enter 操作本机 OS 文件选择器对话框时,没有任何解释,但它不起作用。但似乎可以通过创建另一个调用 Enter 事件的 Robot 对象来解决该问题。因此,请让我至少帮助您或其他路过的孤独冲浪者寻求建议。;-)

public static void enterKeyIssueTest() {

    // both lines put some content to the Clipboard
    StringSelection ss = new StringSelection("/fancyUser/tightDir/coolFile.apk");
    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);

    // 1st Robot Object
    Robot robot = new Robot();
    robot.keyPress(KeyEvent.VK_CONTROL);   // press Ctrl
    robot.keyPress(KeyEvent.VK_V);         // and press V
    robot.keyRelease(KeyEvent.VK_V);        // release Ctrl
    robot.keyRelease(KeyEvent.VK_CONTROL);  // release V

    // 2nd Robot to my avail
    Robot okRobot = new Robot();

    // presses Enter
    okRobot.keyPress(KeyEvent.VK_ENTER);    // press Enter
    okRobot.keyRelease(KeyEvent.VK_ENTER);  // release Enter
} 

这确实是一个很小的例子,但我希望上面代码中的解释会有所帮助。事实上,第二个 Robot 对象为我做了 Enter 事件。

最好的问候, Semo

于 2013-02-11T20:53:32.860 回答
0

我想您的问题是您仅在键为 UP 时触发事件时才使用 VK_DOWN。我的意思是你应该模拟按键输入事件,即DOWN然后UP。试试看,我希望这会奏效。

于 2011-07-08T21:06:16.123 回答
0

我终于解决了这个问题。我让我的机器人代码与按钮效果一起在事件调度线程中运行。这意味着在我的机器人完成执行之前,没有任何按钮可以响应我的机器人的动作。

我不完全确定为什么这会阻止我的机器人在这种情况下正常工作。我发现如果我删除了 ctrl-F4 命令,机器人会响应 enter 命令,但似乎两个命令都应该在机器人返回的那一刻排队并正确执行。我假设排队的事件数量有限制,或者我以某种方式结束了两个事件之间的数据竞争。无论哪种方式,通过将我的机器人移动到一个单独的线程中,我都会得到所需的行为。

顺便说一句,我无法创建 SSCCE 的原因是因为我试图将机器人合并到一个按钮中,并且我尝试让机器人一次执行多个事件;但我没有尝试使用按钮生成机器人执行多个事件。要重新创建这个问题,我最终会得到与原始代码一样复杂的代码。

于 2011-07-11T11:49:13.423 回答