java - 如何使用 Java 读取/绘制/与另一个 Java 窗口/小程序交互

标签 java swing automation applet jvm

我有兴趣编写一个执行以下操作的 Java 程序。

  • 附加到当前正在运行的 Swing 窗口或小程序,在另一个 JVM 中运行
    • 或者,加载 Java 应用程序以便能够执行上述操作
  • 从窗口读取颜色
  • 向窗口发送鼠标和键盘事件

我希望制作某种可以直接与 GUI 交互的测试和自动化工具。

我正在寻找有关如何完成上述任何和所有步骤的一些建议。提前致谢。

最佳答案

捕获另一个进程的输出不会那么容易 - 如果您的测试应用程序在同一个 Java VM 中直接启动 swing 应用程序,这将是最简单的。

然后您可以在 JFrame 上调用 paint(Graphics g),向组件传递屏幕外图形 (BufferedImage - details here。) 您可以通过 EventQueue.postEvent(AWTEvent) 将输入事件发送到 AWT 事件队列。 - 这可用于模拟 AWT 输入。

但是,您是否调查过现有的测试框架? FEST有一个专门用于操作和验证 UI 的测试框架。还有abbot ,年长者受到一些人的青睐。还有一些测试框架专注于功能和状态,而不是屏幕抓取和输入事件。这些不是更好/更坏,而是互补的。 状态 UI 测试包括 SwingUnit , 和 UISpec4J .

那里有很多好的框架,所以在构建另一个框架之前做一些研究可能是值得的!

编辑: 启动应用程序,而不是运行

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 - 你可以委托(delegate)给现有的。这是为所有窗口绘制操作调用的,因此您可以直接进入窗口层次结构的核心,

您还可以注册以监听 AWT EventQueue 上的所有事件。这也会让您深入了解应用程序中发生的事情,并且您可以从中确定创建了哪些窗口、处于焦点等。

关于java - 如何使用 Java 读取/绘制/与另一个 Java 窗口/小程序交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2976307/

相关文章:

Java:构建项目然后重新启动服务器的方法

java - 使用命令提示符在 Windows 中设置 JAVA_OPTS

java - 返回值时类型不兼容

c# - 如何在 C# 中将鼠标光标位置设置为屏幕上的指定点?

java - 如何更改切换按钮的状态?

java - HTML 部署中的 LibGDX 未捕获运行时异常

java - Java如何在指定时间在右下角弹出一个小窗口

java - 执行方法时使用 java applet 获取输入

java - 如何使用java从本地重新启动虚拟机中的Windows服务

Html 或 Css 自动化