Java игнорирует событие VK_Enter, созданное роботом - PullRequest
0 голосов
/ 09 июля 2011

Я пишу несколько интеграционных тестов с использованием робота.У меня есть робот, открывающий меню, и он должен выбрать один из вариантов меню;кроме клавиши ввода, кажется, игнорируется.Меню откроется, и будет выбран правильный пункт меню, но никакие действия не будут предприняты, как если бы я нажал Enter.Если я вручную нажимаю соответствующие клавиши, он делает то, что ожидается.Если я запускаю робота в приложении, не поддерживающем Java, другое приложение будет правильно реагировать на событие ввода.Итак, я проверил, что я правильно отправляю событие ввода и что Java-меню должно отвечать на него;но что-то не работает.

Я также пытался заменить событие ввода пробелом (меню также должно отвечать), но ответа также не получил.

Яработает на Redhat Linux с последним Sun JDK.Я почти уверен, что это не очевидная проблема с моим кодом, так как я нашел этот пост, описывающий кого-то, кто столкнулся с точно такой же проблемой, но не имеет решения:

Ответы [ 3 ]

1 голос
/ 12 февраля 2013

Ну, я застрял в том же вопросе нажатия клавиши Enter.У меня тоже нет объяснения, когда я пытался работать с собственным диалогом выбора файлов ОС, используя Enter, и он не работал.Но, похоже, проблему можно решить, создав еще один объект Robot, в котором вы вызываете событие Enter.Поэтому, пожалуйста, позвольте мне, по крайней мере, помочь вам или другим одиноким серферам, которые приходят за советом.; -)

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

0 голосов
/ 11 июля 2011

Я наконец-то решил это.Я запустил код своего робота в потоке диспетчеризации событий вместе с кнопочными эффектами.Это означало, что ни одна из кнопок не могла реагировать на действия моего робота, пока мой робот не завершил выполнение.

Я не совсем уверен, почему это помешало бы моему роботу работать правильно в этом случае.Я обнаружил, что если я удалю команду ctrl-F4, робот ответит на команду ввода, но кажется, что обе команды должны были быть поставлены в очередь и выполнены правильно в тот момент, когда робот вернулся.Я предполагаю, что либо существует ограничение на количество событий в очереди, либо я каким-то образом получил данные между двумя событиями.В любом случае, перемещая своего робота в отдельную нить, я получаю желаемое поведение.

, кстати, причина, по которой я не смог создать SSCCE, заключалась в том, что я пытался встроить робота в кнопку и пытался заставить робота делатьнесколько событий одновременно;но я не пробовал кнопку, порождающую робота, делающего несколько событий.Чтобы воссоздать эту проблему, я бы закончил с кодом, столь же сложным, как и мой исходный код.

0 голосов
/ 09 июля 2011

Полагаю, ваша проблема в том, что вы используете VK_DOWN только тогда, когда событие вызывается, когда клавиша ВВЕРХ.Я имею в виду, что вы должны смоделировать событие набора текста, то есть ВНИЗ, а затем ВВЕРХ.Попробуйте, надеюсь, это сработает.

...