Kokudoriing

技術系与太話ブログ

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. keyも文字列リテラルとして記述しないといけない
  2. 文字列リテラルはダブルクォーテーションで囲わないといけない(シングルクォーテーションは不可)

などなど。

以上スクレイピングしようとして小1時間悩んでしまったところでした。