Java 设置多线程秒表实例(在执行DOCOMMAND时,命令持有者已被填充,无需等待响应异常)
我正在尝试做一些概念上简单的事情。。。 我们在仪表板上加载了多个portlet。我需要测量每次加载所需的时间。我已经实现了一个简单的Java 设置多线程秒表实例(在执行DOCOMMAND时,命令持有者已被填充,无需等待响应异常),java,selenium,Java,Selenium,我正在尝试做一些概念上简单的事情。。。 我们在仪表板上加载了多个portlet。我需要测量每次加载所需的时间。我已经实现了一个简单的StopWatch类,需要在仪表板加载时为每个portlet同时运行它的多个实例。 因此,提供的参数为: portlet名称 要检查的图元,表示加载成功 以下是秒表课程: public class StopWatch implements Runnable { private long startTime; private long
StopWatch
类,需要在仪表板加载时为每个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会话重复使用相同的浏览器配置文件(以便存储异常)。这会阻止我创建新实例。谢谢你的建议。