我正在尝试启动一个外部应用程序以使用UISpec4J进行测试。

这是我到目前为止提到的问题及其答案:

How to automate a swing java web start application which runs clicking a link into a web application, which is automated with Selenium WebDriver?

Getting all windows using UISpec4J

UISpec4J Capturing modal dialog, before the trigger finish

下面提到的my.exe是使用某些工具包装在exe中的Java应用程序。在内部,它使用jars,并且是Java GUI应用程序。

该可执行文件首先启动启动屏幕,然后显示一个对话框,供您选择要连接的位置以及该主窗口之后。除非我可以自动进行连接,否则不会获得主窗口。

基于这些问题,我提出了以下代码片段:

        this.setAdapter(new UISpecAdapter() {
        @Override
        public Window getMainWindow() {
            return WindowInterceptor.run(new Trigger() {
                @Override
                public void run() throws Exception {
                    // running jnlp by netx launcher
                    Runtime.getRuntime().exec("C:\\my.exe");
                    Thread.sleep(10000);
                }
            });
        }
    });


在上面的方法中,我简单地得到“没有显示窗口”错误。

        this.setAdapter(new UISpecAdapter() {
        @Override
        public Window getMainWindow() {
            final Window[] result = new Window[1];
            WindowInterceptor
            .init(new Trigger() {
                @Override
                public void run() throws Exception {
                    Runtime.getRuntime().exec("C:\\my.exe");
                    //Thread.sleep(10000);
                }
              })
              //.processTransientWindow()
              .process(new WindowHandler() {
                    public Trigger process(Window window) throws Exception {
                    result[0] = window;
                    return Trigger.DO_NOTHING;
                    }
                })
            .run();
            return result[0];
        }
    });


在上面的第二种方法中,我仍然收到“未显示窗口”错误,并且控件从未达到覆盖“处理”方法的位置。

我提到了http://www.uispec4j.org/reports/apidocs/org/uispec4j/interception/WindowInterceptor.html,推荐的方法是使用init \ process序列使用init捕获模式对话框。

要捕获非模态,建议我们使用以下方法:

   Window window = WindowInterceptor.run(panel.getButton("open").triggerClick());


但是我不知道应该在哪里以及如何称呼它。

从上面提到的第一个问题开始,我们应该能够做到这一点,因为它的答案提到了启动jnlp应用程序,它是外部应用程序。

我尝试使用jre 6 update 0,并且至少可以运行测试。在Java更新37中,从上面提到的第三个问题中,我得到未实现的抽象方法错误。

我究竟做错了什么?任何想法?

我正在使用最新的UISpec4J软件包-版本2.4。

提前致谢,
-Neel。

最佳答案

我对UISpec4J还是很陌生,但是我猜想它需要在同一JVM中运行才能拦截GUI组件并与之交互。使用exec启动exe文件时,它将创建一个新进程和一个新的单独的JVM。如果我正确理解UISpec4J,那将行不通。

对于非模态示例,文档说“您将从测试中检索窗口...”,因此在设置方法或测试中都应该起作用。

07-25 23:59