WebViewのinvokeScriptではまったところ
.NETでWebアプリのクライアントアプリを作る場合、Windows.UI.Xaml.Controls.WebView を使ってスクレイピングをしたりするわけです。
その時、InvokeScriptAsyncを使ったりするわけです。
こいつは第1引数に呼び出すJavaScriptの関数を、第2引数にその関数に渡す実引数を配列で渡します。
なので、eval
関数を呼び出せば、任意のJavaScriptコードが実行できます。
var result = await webView.InvokeScriptAsync("eval", new[] { "'hogehoge'" }); Debug.Assert(result == "hogehoge");
が、このInvokeScriptAsyncはかなり癖のあるメソッドです。
まず第1に、関数に渡す実引数は文字列である必要があります。
そして、戻り値も文字列型である事を期待します。
さらに、戻り値が文字列型でない場合は勝手に空文字列が返ります。
var result = await webView.InvokeScriptAsync("eval", new[] { "[1, 2, 3]" }); Debug.Assert(result == "");
これはなかなかアレ気な仕様というかなんというか…。
スクレイピングに関連して.NETのJSONデシリアライザの話。
DataContractJsonSerializerが認識するJSONはかなり厳密です。
具体的には
などなど。
以上スクレイピングしようとして小1時間悩んでしまったところでした。