如何使用Marathon JavaDriver对接已启动运行的应用程序
针对已运行Swing应用的JavaDriver附加操作方案
JavaDriver直接启动应用可正常跑自动化流程,但无法对接已运行实例的核心原因是:默认通过launchApplication启动应用时,会自动在JVM启动阶段注入自动化代理组件;已经处于运行状态的Swing进程如果没有提前加载对应代理,是无法直接建立自动化连接的,按以下步骤操作即可实现需求:
- 启动目标Swing应用时,提前添加JVM参数加载JavaDriver代理包。JVM不支持在运行后无侵入加载核心代理依赖,必须在启动阶段配置,启动命令参考:
java -javaagent:<本地JavaDriver依赖中javadriver-agent.jar的绝对路径> -jar 你的Swing应用jar包路径.jar
注意代理包版本必须和你引入的JavaDriver核心依赖版本完全一致,否则会出现版本不匹配的连接报错。 - 应用启动完成后,跳过JavaDriver自带的应用启动逻辑,通过进程PID附加到目标实例,代码示例:
// 填入目标Swing应用对应的Java进程PID long appPid = 12345; JavaDriver driver = new JavaDriver(appPid); // 后续自动化操作逻辑和直接启动应用时的写法完全一致,不需要做额外调整
- 目标进程PID查询方式:Windows系统可在任务管理器-详细信息页面对应java.exe进程查看PID;Linux/macOS系统直接执行
jps命令,即可列出所有本机运行的Java进程PID及对应主类名,快速定位目标Swing应用。
如果你用的是JDK9及以上版本,启动Swing应用时需要额外加两个模块开放参数,避免JVM模块权限拦截导致组件识别失败:
--add-opens java.desktop/java.awt=ALL-UNNAMED --add-opens java.desktop/javax.swing=ALL-UNNAMED
目前公开资料里相关方案少的原因是,绝大多数JavaDriver入门文档只覆盖了从0启动应用的基础场景,进程附加属于进阶调试用法,没有放在快速指引章节。没有任何方案可以直接对接完全没做启动参数配置、正常启动的运行中Swing进程,不要在这个方向浪费时间。
内容的提问来源于stack exchange,提问作者NikSU
相关产品推荐
相关产品推荐

