我正在创建一个类,它将充当脚本加载的外观。该类将与在磁盘上加载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似乎被解雇。
任何建议都将不胜感激
谢谢!
答案 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()
}
}