ExecutorService 用来创建线程池执行 FutureTask。在上面代码中尤其要注意 get 方法的时长设置要合理。在本例中,作者分析了多次未冻结情况下设置参数所需要的时间,发现每次都不超过两分钟,所以为了准确起见,将时长设为三分钟,即如果三分钟内设置参数的代码还未运行完毕,则判断脚本冻结,get 方法抛出 TimeoutException。catch 语句用来捕获 TimeoutException,如果捕获,则依次执行取消任务、输出错误信息、通过进程关闭 IE 浏览器的操作。将上述代码放在循环中可实现:“运行冻结代码——冻结——关闭冻结程序”,这一过程循环往复,直到成功执行可能出现冻结的代码。完整代码如下:

  清单 3. 完整代码调用

while(true)
{
FutureTask<String> future = new FutureTask<String>(new Callable<String>()
{
public String call() {
  ecmui.factory.Application.login(commonXML.getWPURL(),
                                       commonXML.getAE_Admin(),
                                       commonXML.getCommonUserPW());
  SitePreferences sp = new SitePreferences();
  sp.general().setFileTrackingEnable("Yes");
  sp.appbcs().setDefaultETShowing("Yes");
  sp.set();
return "";

}});
try
{
    ExecutorService executor = Executors.newSingleThreadExecutor();
    executor.execute(future);
    String result=future.get(1000*60*3, TimeUnit.MILLISECONDS);
    sleep(3);
    break;

}catch(TimeoutException e)
{
    future.cancel(true);
    Application.killAppProcess("IEXPLORE");
    sleep(10);
    }
    }

  在上述代码中,如果 get 方法抛出超时异常,则是脚本出现冻结,代码直接跳到 catch 语句执行,并不跳出循环;而如果不抛异常,说明参数设置正常且没有出现冻结现象,则顺序执行到 break 语句,跳出循环。

  总结

  文中所述的解决脚本冻结问题的方法有很强的通用性,读者可以将其灵活运用到自己的测试工作中来解决其他类型的脚本冻结问题,提高自动化脚本的测试效率。