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 上执行 javascriptstringByEvaluatingJavaScriptFromString:
,我必须等待动画执行,所以我使用相同的代码:
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 在自动化测试中加载的主要内容,如果未能解决你的问题,请参考以下文章
干货|app自动化测试之Andriod WebView如何测试
如何在没有静态文本的情况下在 XCTest 中快速测试 Webview 是不是加载
iPhone 应用程序“等待开发者发布” - 我现在可以提交测试飞行而没有任何后果吗?