0

スクリプトの読み込みのファサードとして機能するクラスを作成しています。このクラスは、ディスク上の HTML&JS ファイルをロードしたヘッドレス UIWebView と対話します。

現在、単体テスト環境ですべての実行を行っていますが、UIWebView が何もロードを拒否しているようです。私のコードは次のようになります。

WebView 初期化

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>

これは、webView に何も起こらないことを示しています。さらに、デリゲート メソッドは、webViewDidStartLoad、webViewDidFinishLoad、および webViewDidFailLoad が起動していないように見えます。

任意の提案をいただければ幸いです

ありがとう!

4

3 に答える 3

2

テストの問題の要点は、UIWebView の読み込みが非同期であることです。リクエストを発行した後に [NSThread sleepForTimeInterval] を試してみましたが、十分ではありませんでした。どうやら、UIWebView を非同期にロードするには、メイン スレッドが生きている必要がありました。

この非同期テスト メカニズムを使用して、単体テストをパスさせることができました。

https://github.com/akisute/SenAsyncTestCase

このコードは、NSRunLoop を使用して、メイン スレッドを維持しながら実行ループをスピンします。これは疑似スリープのようなものです。スクリプトの読み込みが要求された後、私のテストで 1/10 秒の待機を追加すると、DOM が正しく読み込まれ、デリゲート イベントが発生しました。

[self waitForTimeout: 0.1];
于 2013-01-02T05:59:55.683 に答える
0

@ 実装で、クラスをデリゲートとして設定していることを確認してください

@implementation myclass:parent <UIWebViewDelegate>

そして、の出力はNSLog([NSString stringWithFormat:@"Scripting Core Index: %@", indexPath]);何ですか?

于 2013-01-02T02:19:28.900 に答える