UIWebView不会加载内容

时间:2013-01-02 01:07:36

标签: objective-c cocoa-touch uiwebview

我正在创建一个类,它将充当脚本加载的外观。该类将与在磁盘上加载HTML& JS文件的无头UIWebView进行交互。

我目前正在单元测试环境中执行所有执行,看起来UIWebView拒绝加载任何内容。这是我的代码的样子:

WebView Init

self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,0,0)];
self.webView.delegate = self;
[self loadScriptingCore];

脚本加载器:

- (void)loadScriptingCore
{
    NSURLRequest *loadRequest = [NSURLRequest requestWithURL:[self scriptingCoreIndex]];
    [self.webView loadRequest:loadRequest];
    NSLog([self inspectDom]);
}

- (NSURL *) scriptingCoreIndex  
{
    NSString *indexPath = [[NSBundle mainBundle] pathForResource:@"scripting-core" ofType:@"html" inDirectory:@"www"];
    NSLog([NSString stringWithFormat:@"Scripting Core Index: %@", indexPath]);
    return [NSURL fileURLWithPath:indexPath];
}

- (NSString *)inspectDom
{
    return [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML;"];
}

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>Scripting Core</title>
</head>
<body>
   <div id="element">
       Hello
    </div>
</body>
</html>

inspectDom方法只返回

<html><head></head><body></body></html>

Thich向我表明webView没有发生任何事情。此外,委托方法没有webViewDidStartLoad,webViewDidFinishLoad和webViewDidFailLoad似乎被解雇。

任何建议都将不胜感激

谢谢!

3 个答案:

答案 0 :(得分:2)

测试问题的要点是UIWebView加载是异步的。我在发出请求后尝试了[NSThread sleepForTimeInterval],但这还不够。显然,主要线程需要活着才能让UIWebView以异步方式加载。

我能够通过使用这种异步测试机制来完成单元测试:

https://github.com/akisute/SenAsyncTestCase

此代码使用NSRunLoop来旋转运行循环,同时保持主线程处于活动状态 - 有点像伪睡眠。在我的测试中,在请求脚本加载后添加1/10秒等待,导致DOM被正确加载并且代理事件被触发。

[self waitForTimeout: 0.1];

答案 1 :(得分:0)

确保在@实现中将类设置为委托

@implementation myclass:parent <UIWebViewDelegate>

NSLog([NSString stringWithFormat:@"Scripting Core Index: %@", indexPath]);的输出是什么?

答案 2 :(得分:0)

在Swift中,如果您仍在使用UIWebView,并且想要在调用load(data:...)后测试其内容,则可以尝试以下操作:

class TestCase: XCTestCase {
  var testDelegate: TestDelegate()
  lazy var loadExpectation: XCTestExpectation = { return self.expectation(description: "waiting") }()

  func testSomething() {
    testDelegate.expectation = loadExpectation

    webViewUnderTest.delegate = testDelegate
    webViewUnderTest.load(data: ...)

    waitForExpectations(timeout: 5) { (error) in
      dump(error)
    }

    assert(...)
  }
}

class TestDelegate: NSObject, UIWebViewDelegate {
  var expectation: XCTestExpectation?

  func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
      return true
  }

  func webViewDidFinishLoad(_ webView: UIWebView) {
      expectation?.fulfill()
  }
}