以编程方式执行Selenium-rc时是否可以关闭流?

时间:2013-11-29 15:12:54

标签: java selenium io

我正在尝试使用Selenese以编程方式为Selenium-rc运行多个测试套件。我分析了selenium-server-standalone-2.37.0.jar的java代码,并确定我必须使用GridLauncher类的main方法。因为我想运行多个测试套件,所以我进行了循环。

for (String[] arguments : argumentsList) {
    GridLauncher.main(arguments);
}

我遇到的第一个问题是GridLauncher使用System.exit()来关闭自己。但这也导致我的过程也停止了。我解决这个问题的方法是让System.exit()抛出异常。我在Stackoverflow中从this question获得了这个想法。

private static class ExitTrappedException extends SecurityException {
    static void forbidSystemExitCall() {
        final SecurityManager securityManager = new SecurityManager() {
            @Override
            public void checkPermission( Permission permission ) {
                if( "exitVM".equals( permission.getName() ) ) {
                    throw new ExitTrappedException() ;
                }
            }
            @Override
            public void checkExit(int status) {
                throw new SecurityException();
            }
        } ;
        System.setSecurityManager( securityManager ) ;
    }
    static void enableSystemExitCall() {
        System.setSecurityManager( null ) ;
    }
}

for (String[] arguments : argumentsList) {
    ExitTrappedException.forbidSystemExitCall();
    try {
        GridLauncher.main(arguments);
    } catch (SecurityException se) {
        //catching System.exit()
    } finally {
        ExitTrappedException.enableSystemExitCall() ;
    }
}

我现在遇到的问题是流不会关闭,当循环尝试执行Selenium测试时我得到一个异常:WARN - Failed to start: SocketListener1@0.0.0.0:4444 我试图找到关闭流的方法,但找不到任何东西。有可能关闭它吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

你可能想尝试垃圾收集流并让它们最终确定(因为这样的类往往有一个释放资源的finalize()方法)。您基本上System.gc()后跟System.runFinalization()。有关详细信息,请参阅此问题:How to ensure finalize() is always called (Thinking in Java exercise)

在执行System.gc()之前,您可能还需要删除一些线程。有关如何列出线程,请参阅问题Get a List of all Threads currently running in Java。另一个问题讨论了如何停止线程:How do you kill a thread in Java?