我必须测试Flash Player是否正在通过网络正确发送请求。为此,我使用BrowserMob Proxy来捕获流量。 我的问题是我必须等待播放的视频结束才能测试最终请求。所以作为临时解决方案,在我的测试中,我放了一个Thread.sleep(videoDuration)。但IMO并不是很好,总的来说,持续时间可能会发生变化。 BrowserMob允许在请求上添加拦截器。所以我想到了通知和等待功能。
这是我的第一次尝试:
protected static boolean percent100Done;
protected static final Object percent100lock = new Object();
@BeforeClass
public static void addInterceptor() {
ProxyServer server = Server.init();
server.addRequestInterceptor((BrowserMobHttpRequest request, Har har) -> {
String percent = request.getProxyRequest().getParameter("percent");
if("100".equals(percent)) {
percent100Done = true;
synchronized (percent100lock) {
percent100lock.notify();
}
}
});
}
@Test
public void testFinalRequest() throws InterruptedException {
driver.get(myurl);
synchronized (percent100lock) {
while (!percent100Done) {
percent100lock.wait();
}
}
//test continue
}
我测试了这段代码,它确实有效。但它看起来有点脏,特别是新的Object系列。如果我必须添加25%,50%和75%的通知,会发生什么?我将不得不另外3个布尔和锁?
答案 0 :(得分:1)
为什么不存储百分比并拥有一般的“进度”事件,例如how XMLHTTPRequest works?
protected static int percent;
protected static final Object progressLock = new Object();
@BeforeClass
public static void addInterceptor() {
ProxyServer server = Server.init();
server.addRequestInterceptor((BrowserMobHttpRequest request, Har har) -> {
synchronized(progressLock) {
percent = Integer.parseInt(request.getProxyRequest().getParameter("percent"));
progressLock.notify();
}
});
}
@Test
public void testFinalRequest() throws InterruptedException {
driver.get(myurl);
synchronized (progressLock) {
int lastPercent = -1;
while (percent != 100) {
if (lastPercent < 50 && percent >= 50) {
System.out.println("50%");
}
lastPercent = percent;
progressLock.wait();
}
}
//test continue
}
就古怪而言,我认为你的解决方案很好。它看起来很奇怪,但每个Object
都有一个锁,所以你不妨使用它。如果您需要做一些更复杂的事情,您可能需要查看Lock
及其子类。例如,对于ReadWriteLock
,多个读者可以同时持有锁,但只有一个作者可以。虽然看起来你没有多个读者(我不希望锁定会影响这个程序的性能)。