Как я могу использовать Java для чтения / рисования / взаимодействия с другим окном / апплетом Java - PullRequest
2 голосов
/ 04 июня 2010

Я заинтересован в написании программы на Java, которая выполняет следующие действия.

  • Присоединение к текущему окну Swing или апплету, запущенному в другой виртуальной машине Java.
    • В качестве альтернативы, загрузите приложение Java, чтобы иметь возможность сделать выше
  • Чтение цветов из окна
  • Отправка событий мыши и клавиатуры в окно

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

Я ищу несколько советов о том, как выполнить любой из вышеперечисленных шагов. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

Не так просто будет захватить выходные данные другого процесса - будет проще всего, если ваше тестовое приложение запустит непосредственно свинг-приложение в той же виртуальной машине Java.

Затем вы можете вызвать paint (Graphics g) на JFrame, передав компоненту закадровую графику (BufferedImage - подробности здесь .) Вы можете отправлять входные события в очередь событий AWT через EventQueue.postEvent (AWTEvent) - это можно использовать для имитации ввода AWT.

Однако изучили ли вы существующие тестовые фреймворки? FEST имеет тестовую среду, специально предназначенную для манипулирования и проверки пользовательского интерфейса. Есть также аббат , более старый, чем кто-то предпочитает. Существуют также тестовые среды, которые концентрируются на функции и состоянии, а не на скриншотах и ​​событиях ввода. Они не лучше / хуже, но дополняют друг друга. Состояние тестирования пользовательского интерфейса включает SwingUnit и UISpec4J .

Есть много хороших фреймворков, так что может быть полезно провести небольшое исследование, прежде чем строить еще одно!

EDIT: Чтобы запустить приложение, вместо запуска

java -cp ... a.b.c.AppToTest

Вы запускаете

java -cp ... TestWrapper AppToTest

и внедрите TestWrapper следующим образом

public class TestWrapper {
/* args[0] - class to launch. Remainder of args passed to launched app.*/
   public static void main(String[] args) throws Exception
   {
      Class app = Class.forName(args[0]);
      Method main = app.getDeclaredMethod("main", new Class[] { (new String[1]).getClass()});
      String[] appArgs = new String[args.length-1];
      System.arraycopy(args, 1, appArgs, 0, appArgs.length);
      main.invoke(null, appArgs);
      // now you have just launched another application inside the same VM
   }

}

Как только вы запустили приложение, вы можете подождать, пока оно запустится, и опросить Window.getOwnerlessWindows чтобы найти любые окна верхнего уровня, которые создает приложение.

Более прямой подход - установить собственный RepainManager - вы можете просто делегировать существующий. Это вызывается для всех операций рисования окна, так что вы попадаете прямо в сердце иерархии окон,

Вы также можете зарегистрироваться для прослушивания всех событий в AWT EventQueue. Это также даст вам внутреннее представление о том, что происходит в приложении, и из этого вы можете определить, какие окна созданы, в фокусе и т. Д.

1 голос
/ 04 июня 2010

Если у вас есть контроль над «протестированным» приложением, я думаю, что вам лучше всего создать сервер, который позволял бы программе-тестеру прокси-вызовы на внутренний java.awt.Robot.

0 голосов
/ 04 июня 2010

Вам нужно будет написать и поддерживать определенный протокол (вашего собственного изобретения) в целевом приложении.

Вы можете сделать это с RMI, сокетами или какой-либо другой формой RCP (Protobuf, JSON, WebService и т. Д.)

Дело в том, что вы должны открыть порт в приложении и понимать инструкции из внешнего источника.

Если вы ищете способ проверить это, я слышал, Аббат - хороший вариант. Взглянуть.

Если вы хотите манипулировать приложением (из которого у вас нет источника), это может быть более сложным.

...