我正在尝试使用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
我试图找到关闭流的方法,但找不到任何东西。有可能关闭它吗?如果是这样,怎么样?
答案 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?。