DOBON.NETプログラミング道掲示板

■35537 / 2階層)  WebView2によるスクレ―ピング
□投稿者/ Hongliang 大御所(646回)-(2023/11/11(Sat) 18:36:02)
  • アイコンVisual Studio 2015から複数行リテラルを扱えるようになったので、文字列が固定であれば変にStringBuilder使うよりリテラルで書いた方が見やすいしパフォーマンスも良いです。

    ExecuteScryptAsyncで実行されるスクリプトは、最後の式を評価してそれを返値とするような挙動になります。
    なので、変数hyouの内容を返値としたいのであれば、単に変数を記述します。
    × return hyou;
    ○ hyou;
    あるいは、以下のように無名関数の呼び出しに全体を変換する方法もあります。
    js = "(function() {
    const hyou = [];
    色々処理する;
    return hyou; })()"

    https://learn.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.executescriptasync?view=webview2-dotnet-1.0.2088.41
    ExecuteScriptAsyncの返値(Await結果)は文字列、String型です。
    当然ながらDataTable型の変数に直接代入することはできません。
    この文字列はスクリプトの結果をJSON.stringify()したJSON形式なので、一般的にはデシリアライズして.NET上のオブジェクトとして扱います。
    JSONのデシリアライザとしては、System.Text.JsonでもJson.NETでもお好みのものを使えばいいでしょう。.NET 4.xで組み込みなのはDataContractJsonSerializerというのがありましたっけ。
    ざっと見た様子では、JavaScript上では「「文字列の配列」の配列」のようなので、VB上ではString型の配列の配列、つまり String()() 型としてデシリアライズできます。
    DataTableへはこのString()()から手動で移し替えてください。

    > また、varをletやconstに変えると、Edgeのコンソール上でも、上手く動かない理由も教えて頂ければ幸いです。
    ExecuteScriptAsycで渡したJavaScript内で定義したりした変数はそのまま残ります。
    constやletで宣言した変数は再宣言不可能なので、もう一度ExecuteScriptAsyncしたりするとエラーになります。
    ちなみにconstにせよletにせよブロックスコープなので、上の方で示した無名関数を使う場合、
    (function() { const hyou = []; ... })()
    このhyouはこの無名関数内でのみ有効なので、再度呼び出しても問題ありません。

    何度も使用するJavaScript関数なら、
    CoreWebView2.AddScriptToExecuteOnDocumentCreatedAsync
    で登録しておけば便利です。
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: WebView2によるスクレ―ピング /Wan →Re[3]: WebView2によるスクレ―ピング /Wan
 
上記関連ツリー

Nomalアイコン WebView2によるスクレ―ピング / Wan (23/11/10(Fri) 17:06) #35535
Nomalアイコン Re[1]: WebView2によるスクレ―ピング / Wan (23/11/10(Fri) 17:16) #35536
Nomalアイコン Re[1]: WebView2によるスクレ―ピング / 魔界の仮面弁士 (23/11/11(Sat) 22:04) #35538
  └Nomalアイコン WebView2によるスクレ―ピング / Hongliang (23/11/11(Sat) 18:36) #35537 ←Now
    └Nomalアイコン Re[3]: WebView2によるスクレ―ピング / Wan (23/11/12(Sun) 10:51) #35539 解決み!

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -