iPhone:等待 webview 在自动化测试中加载

Posted

技术标签:

【中文标题】iPhone:等待 webview 在自动化测试中加载【英文标题】:iPhone : Waiting for a webview to load in automated test 【发布时间】:2011-03-04 10:07:50 【问题描述】:

我正在使用 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
    );

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

此外,稍后,我使用

在 webView 上执行 javascript
stringByEvaluatingJavaScriptFromString:

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

NSDate *restart = [NSDate date];

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

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

我认为 (-[restart timeIntervalSinceNow])

我也试过用

[NSThread sleepForTimeInterval:allowedTimeToLoadALocalFileInWebView];

但这会导致结果不可见。

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

感谢您的回答,实际上我确实使用 webViewDidFinishLoad :我将 TestCase 作为委托,并且在调用委托方法时将 webViewLoaded 设置为 YES。问题是因为它是一个测试方法,它需要在开始下一个之前完成,所以我确定所有的测试都被调用了。所以我不能在委托方法中做我的测试。此外,如果我只是执行 while(webViewLoaded) webview 永远不会加载,我认为它不是多线程的。最后但同样重要的是,在我的第二个测试中,我执行了一个 javascript 命令,这不会调用 webViewDidFinishLoad。

以上是关于iPhone:等待 webview 在自动化测试中加载的主要内容,如果未能解决你的问题,请参考以下文章

webview的自动化测试

干货|app自动化测试之Andriod WebView如何测试

如何在没有静态文本的情况下在 XCTest 中快速测试 Webview 是不是加载

iPhone 应用程序“等待开发者发布” - 我现在可以提交测试飞行而没有任何后果吗?

Xcode UI 测试 - 通过 id 在 Webview 中查找元素

Android webview中隐藏在键盘下方的文本框