【问题标题】:Why is my UIWebView empty in my unit test?为什么我的 UIWebView 在我的单元测试中是空的?
【发布时间】:2011-11-07 12:05:34
【问题描述】:

我将应用程序生成的内容放入UIWebView,并尝试测试我是否正确执行。这是我放入 Web 视图的 HTML 字符串:

@"<html><head></head><body><p>Come, let me clutch thee. I have thee not, and yet I see thee still. Art thou not, fatal vision, sensible to feeling as to sight?</p></body></html>"

然后它进入 web 视图:

[self.webView loadHTMLString: [self HTMLStringForSnippet: model.body] baseURL: nil];

其中model.body 仅包含&lt;p/&gt; 元素,而-HTMLStringForSnippet: 将其包装成格式良好的HTML。在我的测试中,我依靠答案 to this question 通过 JavaScript 检索正文的 HTML 内容:

- (void)testCorrectHTMLLoadedInWebView {
    UIWebView *bodyView = controller.webView;
    NSString *bodyHTML = [bodyView stringByEvaluatingJavaScriptFromString: @"document.body.innerHTML"];
    STAssertEqualObjects(bodyHTML, model.body, @"Model body should be used for the web view content");
}

虽然我可以通过单步执行代码看到UIWebView 已正确创建并在-loadHTMLString:baseURL: 中传递了正确的HTML,但在测试中bodyHTML 是空的。那么我必须做什么才能看到我期望的实际内容并之前传递给 Web 视图?

【问题讨论】:

    标签: html ios uiwebview ocunit


    【解决方案1】:

    UIWebView 渲染需要相当长的时间,因此问题可能是您在内容完全加载之前访问了该内容。

    挂钩UIWebViewDelegatewebViewDidFinishLoad: 方法以确保内容准备就绪。

    更新: 也许WebViewJavascriptBridge会带来一些帮助。

    【讨论】:

    • 调用webViewDidFinishLoad:时UiWebView实际上并没有完成渲染,只是加载,所以很多内容或者昂贵的内容可能仍然会导致问题。
    • AFAIK webViewDidFinishLoad:UIWebView 完成加载输入 HTML 时被调用。当然,这并不意味着所有图像/css 文件/外部资产都已到位,但问题是关于访问 HTML 内容。
    • 在单元测试中等待 webViewDidFinishLoad 的正确方法是什么?它似乎不适用于简单的睡眠(10)。
    • @nylund - while(!done && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distinctFuture]]);并在 webViewDidFinishLoad 中设置完成。
    • 既然 XCTExpectation 可用,那就应该使用它。我发现在本地使用 NSRunLoop 可以正常工作,但是一旦将其推送到 Xcode Server 就会间歇性地失败。切换到 XCTExpectation 似乎可以解决这个问题。
    猜你喜欢
    • 2011-01-23
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2015-06-09
    相关资源
    最近更新 更多