iPhone: ожидание загрузки веб-просмотра в автоматическом тестировании

Я использую Google Toolbox для Mac, чтобы протестировать свое приложение. Тест, над которым я работаю, проверяет, что при событии встряхивания выделенный контроллер отправляет сообщение в веб-просмотр, и что HTML-страница отвечает правильно, делая "снимок экрана".

У меня проблема в том, что это не работает, если веб-просмотр не имеет времени для загрузки. Поэтому я использую небольшую хитрость, чтобы "приостановить" тест и подождать загрузки веб-просмотра:

#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
    );

Странно то, что это не работает, если я использую allowTimeToLoadALocalFileInWebView меньше 5 секунд, что очень долго для загрузки локального файла...

Более того, позже я выполняю javascript в webView с

stringByEvaluatingJavaScriptFromString:

и мне нужно дождаться анимации, поэтому я использую тот же код:

NSDate *restart = [NSDate date];

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

И это займет около 50 секунд! (анимация даже не длится секунды...)

Я думаю, что (-[restart timeIntervalSinceNow])

Я также пытался использовать

[NSThread sleepForTimeInterval:allowedTimeToLoadALocalFileInWebView];

Но это мешает результатам быть видимыми.

Есть ли у вас какие-либо идеи о том, почему загрузка веб-просмотра занимает так много времени, чтобы загрузить локальный файл? И еще один способ ожидания анимации без использования runMode:beforeDate:?

Спасибо

2 ответа

Решение

Итак, проблема заключалась в том, чтобы запустить текущий цикл для [NSDate distantFuture]. Я решил проблему, подождав вот так:

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

Тайм-аут для теста не пройден, если webView никогда не загружается (мы никогда не узнаем), так как мы запускаем этот тест автоматически, мы не хотим, чтобы сервер работал в бесконечном цикле. Раньше тесты занимали больше минуты, теперь 3,5 секунды!

Почему вы используете такие таймеры? Рассматривали ли вы просто использование методов UIWebViewDelegate, чтобы узнать, когда загружен UIWebView? Проверьте документы для UIWebViewDelegate - в частности, см. webViewDidFinishLoad:,

Другие вопросы по тегам