我正在使用机器人编写一些集成测试。我让机器人打开一个菜单,它应该从菜单中选择一个选项;除了输入键似乎被忽略了。菜单将打开,并且选择了正确的菜单项,但是如果我按下回车键,则不会采取任何操作。如果我手动按下相应的键,它会执行预期的操作。如果我在非Java应用程序上运行机器人,则其他应用程序将正确响应enter事件。所以我已经确认我正在发送一个输入事件,并且java菜单应该响应它;但有些东西不起作用。
我也尝试用空格事件替换enter事件(菜单也应该响应)并且也没有响应。
我正在使用最新的sun JDK在redhat linux上运行。我很确定这对我的代码来说不是一个明显的问题,因为我发现这篇文章描述了遇到完全相同问题的人,但它没有解决方案:http://www.velocityreviews.com/forums/t666100-robot-and-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);
}
答案 0 :(得分:1)
好吧,我遇到了按Enter键的问题。当我尝试使用Enter操作本机操作系统文件选择器对话框时,我也没有解释,但它不起作用。但似乎可以通过创建另一个调用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事件。
祝你好运, 塞莫
答案 1 :(得分:0)
我猜你的问题是,当key为UP时触发事件时你才使用VK_DOWN。我的意思是你应该模拟键输入事件,即DOWN然后UP。尝试一下,我希望这会奏效。
答案 2 :(得分:0)
我终于解决了这个问题。我的机器人代码在事件调度线程中与按钮效果一起运行。这意味着在我的机器人完成执行之前,没有一个按钮可以响应我的机器人动作。
我不完全确定为什么这会阻止我的机器人在这种情况下正常工作。我发现如果我删除了ctrl-F4命令,机器人会响应enter命令,但似乎两个命令都应排队并在机器人返回时正确执行。我假设对排队的事件数量有限制,或者我在两个事件之间以某种方式结束了datarace。无论哪种方式,我将机器人移动到一个单独的线程中,我得到了理想的行为。
顺便提一下,我无法创建SSCCE的原因是因为我试图将机器人合并到一个按钮中,我尝试让机器人同时执行多个事件;但是我没有尝试按钮产生一个做多个事件的机器人。要重新创建此问题,我最终会得到与原始代码一样复杂的代码。