0

我正在使用 Google Toolbox for Mac 来测试我的应用程序。我正在进行的测试检查当发生抖动事件时,专用控制器会向 webview 发送消息,以及 HTML 页面是否通过“屏幕截图”正确响应。

我遇到的问题是,如果 webview 没有时间加载,它就不起作用。所以我使用了一个小技巧来“暂停”测试,并等待 webview 加载:

#define allowedTimeToLoadALocalFileInWebView 5.5

NSDate *start = [NSDate date];

while (
// webViewLoaded is false at the beginning
///the Test class is a delegate of the webview, and webviewLoaded is set to true when - (void)webViewDidFinishLoad:(UIWebView *)webView is called 
     !webViewLoaded
    &&
    [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
    && 
    (-[start timeIntervalSinceNow]) < allowedTimeToLoadALocalFileInWebView
    );

奇怪的是,如果我使用的 allowedTimeToLoadALocalFileInWebView 小于 5 秒,它就不起作用,这对于加载本地文件来说非常长......

此外,稍后,我在 webView 上使用

stringByEvaluatingJavaScriptFromString:

,并且我必须等待执行动画,所以我使用相同的代码:

NSDate *restart = [NSDate date];

while (  [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
       && 
       (-[restart timeIntervalSinceNow]) < allowedTimeToLoadALocalFileInWebView
       );

这需要大约 50 秒!(动画甚至没有持续一秒钟......)

我认为 (-[restart timeIntervalSinceNow]) < allowedTimeToLoadALocalFileInWebView 没有用,因为在第二种情况下,runMode:beforeDate: 比我的 allowedTimeToLoadALocalFileInWebView 花费的时间似乎更多。

我也尝试使用

[NSThread sleepForTimeInterval:allowedTimeToLoadALocalFileInWebView];

但这会阻止结果可见。

你知道为什么加载 webview 需要这么长时间来加载本地文件吗?还有另一种不使用 runMode:beforeDate: 来等待动画的方法?

谢谢

4

2 回答 2

2

好的,所以问题是为 [NSDate distinctFuture] 运行当前循环。我通过这样的等待解决了这个问题:

while (! webViewLoaded && (-[start timeIntervalSinceNow]) < timeOut) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:allowedTimeToLoadALocalFileInWebView]];
}

如果 webView 从未加载(我们永远不知道),则超时是测试失败,因为我们自动启动这些测试,我们不希望服务器在无限循环中运行。测试过去需要一分钟多,现在是 3.5 秒!

于 2011-03-09T08:21:38.430 回答
0

你为什么要使用这样的计时器?您是否考虑过仅使用 UIWebViewDelegate 方法来听到 UIWebView 何时加载?查看 UIWebViewDelegate 的文档 - 特别是,请参阅webViewDidFinishLoad:

于 2011-03-04T12:04:49.023 回答