0

我正在使用Google Toolbox for Mac來測試我的應用程序。 我正在進行的測試檢查當搖動事件,專用控制器向webview發送消息時,以及HTML頁面通過執行「截圖」來正確響應。iPhone:等待webview加載自動測試

我遇到的問題是,如果web視圖沒有足夠的時間加載,它將不起作用。所以我用一個小動作「暫停」的考驗,等待的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秒鐘,這兩點是不行的,這是非常長,能夠加載本地文件...

而且,後來,我在與

stringByEvaluatingJavaScriptFromString: 

web視圖執行JavaScript和我必須等待一個動畫來執行,所以我使用相同的代碼:

NSDate *restart = [NSDate date]; 

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

而這需要50秒鐘! (動畫甚至不持續第二...)

我認爲( - [重啓timeIntervalSinceNow])< allowedTimeToLoadALocalFileInWebView是無用的,因爲它看起來runMode:beforeDate:在第二種情況下需要更多的時間比我allowedTimeToLoadALocalFileInWebView 。

我還試圖用

[NSThread sleepForTimeInterval:allowedTimeToLoadALocalFileInWebView]; 

但這阻止的結果是可見的。

你知道爲什麼加載webview需要這麼長時間才能加載本地文件嗎?另一種等待動畫而不使用runMode的方法:beforeDate:?

你爲什麼要使用這樣的計時器謝謝

回答

2

好的,所以問題是運行[NSDate distantFuture]的當前循環。 我通過等待這樣解決問題:

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

超時對於測試,如果web視圖從未負載失敗(我們永遠不知道),因爲我們自動啓動的測試中,我們不希望服務器以無限循環運行。 測試過去需要一分多鐘,現在3.5秒!

0

?你有沒有考慮過使用UIWebViewDelegate方法來聽取UIWebView何時加載?查看UIWebViewDelegate的文檔 - 特別是,請參閱webViewDidFinishLoad:

+0

感謝您的答案,實際上我使用webViewDidFinishLoad:我將TestCase作爲委託,並且在調用委託方法時將webViewLoaded設置爲YES。問題在於,由於它是一種測試方法,因此需要在開始下一個測試之前完成,以確保所有測試都已被調用。所以我不能在委託方法中做我的測試。此外,如果我只是做(webViewLoaded)webview永遠不會加載,我認爲它不是多線程。最後但並非最不重要的是,在我的第二個測試中,我執行了一個JavaScript命令,並且這不會調用webViewDidFinishLoad。 – Julien 2011-03-04 14:43:42