我正在尝试做一些概念上简单的事情......我们在仪表板上加载了多个 portlet。我需要测量每个所需的加载时间。我已经实现了一个简单的 StopWatch 类,并且需要在加载仪表板时为每个 portlet 同时运行它的多个实例。因此提供的参数将是:
- portlet 名称
- 要检查的元素,表示加载成功。
这是StopWatch
类:
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);
我是一名优秀的程序员,十分优秀!