Java 设置多线程秒表实例(在执行DOCOMMAND时,命令持有者已被填充,无需等待响应异常)

Java 设置多线程秒表实例(在执行DOCOMMAND时,命令持有者已被填充,无需等待响应异常),java,selenium,Java,Selenium,我正在尝试做一些概念上简单的事情。。。 我们在仪表板上加载了多个portlet。我需要测量每次加载所需的时间。我已经实现了一个简单的StopWatch类,需要在仪表板加载时为每个portlet同时运行它的多个实例。 因此,提供的参数为: portlet名称 要检查的图元,表示加载成功 以下是秒表课程: public class StopWatch implements Runnable { private long startTime; private long

我正在尝试做一些概念上简单的事情。。。 我们在仪表板上加载了多个portlet。我需要测量每次加载所需的时间。我已经实现了一个简单的
StopWatch
类,需要在仪表板加载时为每个portlet同时运行它的多个实例。 因此,提供的参数为:

  • portlet名称
  • 要检查的图元,表示加载成功
  • 以下是
    秒表
    课程:

     public class StopWatch implements Runnable {
            private long startTime;
            private long stopTime;
            private String tElement;
            private String tPortletName;
    
            public StopWatch(String portletName,String element) {
             tElement = element;
             tPortletName = portletName;
    
            }
    
            public void start() {
         startTime = System.currentTimeMillis();
            }
            public void stop() {
         stopTime = System.currentTimeMillis();
            }
            public long getTime() {
         return stopTime - startTime;
            }
    
     @Override
     public void run() {
      selenium.selectFrame(tPortletName);
                    StopWatch sw = new StopWatch();
      sw.start();
      while (selenium.isElementPresent(tElement)==false)
                  try {
         Thread.sleep(10);
        } catch (InterruptedException e) {
         e.printStackTrace();
        }
       sw.stop();
       long time = sw.getTime();
       System.out.println(tPortletName+" load time="+time);
      }
       }
    
    在呼叫程序中

    StopWatch sw1 = new StopWatch(portlet1,element1);
    StopWatch sw2 = new StopWatch(portlet2,element2);
    ExecutorService threadExecutor = Executors.newFixedThreadPool(3);
    
    threadExecutor.execute(sw1); // start task1
    threadExecutor.execute(sw2); // start task2
    
    运行此操作后,我得到以下异常:

    com.thoughtworks.selenium.SeleniumException: ERROR Server Exception: commandHolder got filled during execution of doCommandWithoutWaitingForAReponse
    

    关于这是什么原因的任何线索?

    最可能的原因是您发送命令的速度比Selenium处理命令的速度快

    无论如何,这种方法不应该起作用,因为DefaulSelenium和其他Selenium类是不同步的,所以如果您很可能会遇到死锁或不可预测的结果

    我认为您必须分两步进行测试:加载仪表板,等待第一个portlet,然后重新加载仪表板并等待第二个portlet。在主线程中执行所有这些操作,例如:

    private void waitForPortlet(String portletName, String element) {
        long startTime = System.currentTimeMillis();
    
        while (selenium.isElementPresent(element) == false)
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        long stopTime = System.currentTimeMillis();
    
        System.out.println(portletName + " load time=" + (stopTime - startTime));
    }
    
    和使用:

        waitForPortlet(name1, element1);
    
        selenium.refresh();
    
        waitForPortlet(name2, element2);
    

    最可能的原因是您发送命令的速度比Selenium处理命令的速度快

    无论如何,这种方法不应该起作用,因为DefaulSelenium和其他Selenium类是不同步的,所以如果您很可能会遇到死锁或不可预测的结果

    我认为您必须分两步进行测试:加载仪表板,等待第一个portlet,然后重新加载仪表板并等待第二个portlet。在主线程中执行所有这些操作,例如:

    private void waitForPortlet(String portletName, String element) {
        long startTime = System.currentTimeMillis();
    
        while (selenium.isElementPresent(element) == false)
            try {
                Thread.sleep(10);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        long stopTime = System.currentTimeMillis();
    
        System.out.println(portletName + " load time=" + (stopTime - startTime));
    }
    
    和使用:

        waitForPortlet(name1, element1);
    
        selenium.refresh();
    
        waitForPortlet(name2, element2);
    

    这是个好主意。不过,我担心的一个问题是缓存导致的加载时间的倾斜。在运行时清除缓存是我在Selenium中研究了一段时间的事情,但一直无法做到……我认为,如果您希望获得准确的结果,您应该在每次测量之前重新启动Selenium会话,即从“冷”开始获取统计信息。这样的结果将是最诚实的,你不应该有一个缓存问题。问题是,在测试环境中,我们使用的是不安全的连接……因此,我需要为每个Selenium会话重复使用相同的浏览器配置文件(以便存储异常)。这会阻止我创建新实例。我很感激你的建议,这是个好主意。不过,我担心的一个问题是缓存导致的加载时间的倾斜。在运行时清除缓存是我在Selenium中研究了一段时间的事情,但一直无法做到……我认为,如果您希望获得准确的结果,您应该在每次测量之前重新启动Selenium会话,即从“冷”开始获取统计信息。这样的结果将是最诚实的,你不应该有一个缓存问题。问题是,在测试环境中,我们使用的是不安全的连接……因此,我需要为每个Selenium会话重复使用相同的浏览器配置文件(以便存储异常)。这会阻止我创建新实例。谢谢你的建议。