C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

Webview2でのScript読み出し不具合 /ふかつ (25/02/07(Fri) 15:13) #103530
Re[1]: Webview2でのScript読み出し不具合 /くま (25/02/07(Fri) 16:54) #103531
  └ Re[2]: Webview2でのScript読み出し不具合 /くま (25/02/07(Fri) 17:21) #103532
    └ Re[3]: Webview2でのScript読み出し不具合 /ふかつ (25/02/07(Fri) 22:05) #103534
      └ Re[4]: Webview2でのScript読み出し不具合 /くま (25/02/07(Fri) 23:14) #103535
        └ Re[5]: Webview2でのScript読み出し不具合 /ふかつ (25/02/07(Fri) 23:36) #103536
          └ Re[6]: Webview2でのScript読み出し不具合 /くま (25/02/07(Fri) 23:58) #103537
            └ Re[7]: Webview2でのScript読み出し不具合 /ふかつ (25/02/11(Tue) 20:11) #103538 解決済み


親記事 / ▼[ 103531 ]
■103530 / 親階層)  Webview2でのScript読み出し不具合
□投稿者/ ふかつ (1回)-(2025/02/07(Fri) 15:13:26)

分類:[VB.NET/VB2005 以降] 

環境:VS2022、VB.NET、.NET Framework4.8

はじめまして
Webview2を初めて使用しアプリを作成しましたが、Script読み出しで不可解な動作があり
解決できず困っております。

Webページが表示されたイベントを以下で受け
Private Sub WebView2_NavigationCompleted(sender As Object, e As CoreWebView2NavigationCompletedEventArgs) _
Handles WebView21.NavigationCompleted

以下各urlに対して処理をしています。


その処理の中で、Scriptの内容を読み出しを以下のよう行っている箇所があり、アプリを走
らせるPCによって問題なく読み出せる場合と、ブランク("""""")が帰ってきて処理が止
まってしまうPCがあり、原因がわからず困っています。

Dim resp_mess As String = Await WebView21.
ExecuteScriptAsync("document.getElementsByTagName('script')[10].innerText;")


アプリは以下の7台のPCで試してみました。
@MinisForum_NPB6 Core i7-13620H Windows11 pro (開発環境)
AINTEL_NUC8I5BEH Core i5 8259U Windows11 pro
BAOOSTAR ミニPC Celeron N100  Windows11 pro
CKODLIX_GK45 Celeron J4125 Windows11 pro

DASUS NUC13ANKi5 Core i5-1340P Windows11 home
EASUS NUC13ANKi5 Core i5-1340P Windows11 home
FVAIO VJS154C11N Core-i7-9750H Windows11 home
このうち@〜Cは問題なく動作しScriptの内容を読み出せますが、D〜Fは失敗しています。

すべてのPCで対象となるURLページは問題なく開いて表示されており、マウスによる操作等も可能です。


各PCについてはVS2022でBinに生成された以下のアプリのファイルを"c:"ドライブ直下にフォルダー
を作りコピーし、.exeを実行しています。(Debug、Release 共に動作は変わりませんでした)

xxxxx.exe ("xxxxx"はアプリケーション名)
xxxxx.exe.config
Microsoft.Web.WebView2.Core.dll
Microsoft.Web.WebView2.WinForms.dll
Microsoft.Web.WebView2.Wpf.dll
WebView2.Runtime.AutoInstaller.dll
WebView2Loader.dll

この状況から、Windowsのエディション(Pro/Home)の違いに関連しているかと思ったので、
EのPCについてPro版にアップデートした場合とPro版をクリーンインストールした場合に
ついてを試してみたのですが、どちらの場合もScriptの内容を読み出スことはできません
でした。

なお、アプリケーションを立ち上げた場合の@、BのPCのタスクマネージャーを見てみると
WebView2マネージャーという括りでタスクが立ち上がり、下位に以下の6個のタスク?が表示
されますが、
Cashpad
Webview2 GPUプロセス
WebView2 マネージャー
WebView2 ユーティリティ:Network Service
WebView2 ユーティリティ:Storage Service
WebView2:XXXXX ("xxxxx"はアプリケーション名)

EのPCでは上記6つに加え
Webview2 サービスワーカー:https://googletagmanager.com/static/service_worker/5230/sw.js?origin=https%33A%2F%2 ・・・
Webview2 サブフレーム:https://doubleclick.net/
Webview2 サブフレーム:https://font.jp/
Webview2 サブフレーム:https://googletagmanager.co,/
等のタスクが表示されていました。

以上のような状態ですが、解決方法をご教授いただければ幸いです。

[ □ Tree ] 返信 編集キー/

▲[ 103530 ] / ▼[ 103532 ]
■103531 / 1階層)  Re[1]: Webview2でのScript読み出し不具合
□投稿者/ くま (45回)-(2025/02/07(Fri) 16:54:55)
No103530 (ふかつ さん) に返信
ふかつさんへ

1. こちらの方法で一度試してみて下さい。
何の実行エラーなのか判定できます。

JavaScript実行(SDK 1.0.2277.86以降)

ExecuteScriptWithResultAsync
https://learn.microsoft.com/en-us/dotnet/api/microsoft.web.webview2.core.corewebview2.executescriptwithresultasync?view=webview2-dotnet-1.0.2957.106

Dim javaScript As string = "document.getElementsByTagName('script')[10].innerText;"
Dim result As CoreWebView2ExecuteScriptResult = Nothing
result = Await WebView21.CoreWebView2.ExecuteScriptWithResultAsync(javaScript)

※正しメインページのみで、iframe内はこの方法が使えません。

あとは実行するjavaScriptにtry〜catchを含めるとか

function GetText(){
	try {
		return document.getElementsByTagName('script')[10].innerText;
	} catch (error) {
		return '*ERROR*' + error;
	}
}
GetText();

これで原因がすこしわかるかも知れません。

2. NavigationCompleted時の引数
e As CoreWebView2NavigationCompletedEventArgs
e.IsSuccess
がTrueか確認してください。

3. 読み込みが完了しても内部javaScriptが完了していない場合もあります。
・実行するまで待機する
・エラーが発生した場合、一度待機して再度実行する
処理を追加してみて下さい。 

[ 親 103530 / □ Tree ] 返信 編集キー/

▲[ 103531 ] / ▼[ 103534 ]
■103532 / 2階層)  Re[2]: Webview2でのScript読み出し不具合
□投稿者/ くま (46回)-(2025/02/07(Fri) 17:21:24)
2025/02/07(Fri) 17:22:08 編集(投稿者)
追記

document.getElementsByTagName('script')[10].innerText;
なのでページ内部のJavaScriptテキストを取得しようとしています?
それはページの処理で必ず[10]になりますか?

let scripts = document.getElementsByTagName('script');
for (let i = 0; i < scripts.length; i ++) {
	if (scripts[i].src == '') {
		// 対象JavaScriptか判定し
		// JavaScriptテキストの取得
	}
}

でないとinnerTextで見てもブランクになりますよ。

[ 親 103530 / □ Tree ] 返信 編集キー/

▲[ 103532 ] / ▼[ 103535 ]
■103534 / 3階層)  Re[3]: Webview2でのScript読み出し不具合
□投稿者/ ふかつ (2回)-(2025/02/07(Fri) 22:05:56)
No103532 (くま さん) に返信

くま様

早速のご回答ありがとうございます。
(以下長文となり申し訳ありません)

> 1. こちらの方法で一度試してみて下さい。
> 何の実行エラーなのか判定できます。
試してみましたが、以下の様にエラーとなっていることは判りましたが、どの様に対処したらよいかが私には判断がつきませんでした。

result {Microsoft.Web.WebView2.Core.CoreWebView2ExecuteScriptResult} Microsoft.Web.WebView2.Core.CoreWebView2ExecuteScriptResult
- Exception 'result.Exception' は型 'System.ArgumentException' の例外をスローしました Microsoft.Web.WebView2.Core.CoreWebView2ScriptException {System.ArgumentException}
+ Data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
HResult -2147024809 Integer
HelpLink Nothing String
+ InnerException Nothing System.Exception
Message "値が有効な範囲にありません。" String
ParamName Nothing String
Source "Microsoft.Web.WebView2.Core" String
StackTrace " 場所 Microsoft.Web.WebView2.Core.Raw.ICoreWebView2ExecuteScriptResult.get_Exception()" & vbCrLf & " 場所 Microsoft.Web.WebView2.Core.CoreWebView2ExecuteScriptResult.get_Exception()" String
+ TargetSite {Microsoft.Web.WebView2.Core.Raw.ICoreWebView2ScriptException get_Exception()} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
- 共有メンバー
- パブリックでないメンバー
_COMPlusExceptionCode -532462766 Integer
s_EDILock {Object} Object
- パブリックでないメンバー
IPForWatsonBuckets &H00007FF80EFD0570 System.UIntPtr
IsTransient False Boolean
RemoteStackTrace Nothing String
WatsonBuckets Nothing Object
_HResult -2147024809 Integer
_className Nothing String
- _data {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
Count 0 Integer
IsFixedSize False Boolean
IsReadOnly False Boolean
IsSynchronized False Boolean
- Keys {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} System.Collections.ICollection {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
- パブリックでないメンバー
System.Collections.ICollection.Count 0 Integer
System.Collections.ICollection.IsSynchronized False Boolean
System.Collections.ICollection.SyncRoot {Object} Object
isKeys True Boolean
- list {System.Collections.ListDictionaryInternal} System.Collections.ListDictionaryInternal
Count 0 Integer
IsFixedSize False Boolean
IsReadOnly False Boolean
IsSynchronized False Boolean
+ Keys {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} System.Collections.ICollection {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
SyncRoot {Object} Object
+ Values {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} System.Collections.ICollection {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
+ パブリックでないメンバー
+ 結果ビュー 結果ビューを展開すると、IEnumerable が列挙されます
+ 結果ビュー 結果ビューを展開すると、IEnumerable が列挙されます
SyncRoot {Object} Object
- Values {System.Collections.ListDictionaryInternal.NodeKeyValueCollection} System.Collections.ICollection {System.Collections.ListDictionaryInternal.NodeKeyValueCollection}
+ パブリックでないメンバー
+ 結果ビュー 結果ビューを展開すると、IEnumerable が列挙されます
+ パブリックでないメンバー
+ 結果ビュー 結果ビューを展開すると、IEnumerable が列挙されます
_dynamicMethods Nothing Object
_exceptionMethod Nothing System.Reflection.MethodBase
_exceptionMethodString Nothing String
_helpURL Nothing String
- _innerException Nothing System.Exception
- 共有メンバー
- パブリックでないメンバー
_COMPlusExceptionCode -532462766 Integer
s_EDILock {Object} Object
_ipForWatsonBuckets &H00007FF80EFD0570 System.UIntPtr
_message "値が有効な範囲にありません。" String
_remoteStackIndex 0 Integer
_remoteStackTraceString Nothing String
- _safeSerializationManager {System.Runtime.Serialization.SafeSerializationManager} System.Runtime.Serialization.SafeSerializationManager
+ 共有メンバー
+ パブリックでないメンバー
_source "Microsoft.Web.WebView2.Core" String
+ _stackTrace {Length=96} Object {SByte()}
_stackTraceString Nothing String
_watsonBuckets Nothing Object
_xcode -532462766 Integer
_xptrs &H0000000000000000 System.IntPtr
m_paramName Nothing String
ResultAsJson """""" String
Succeeded True Boolean
+ パブリックでないメンバー

> 2. NavigationCompleted時の引数
> e As CoreWebView2NavigationCompletedEventArgs
> e.IsSuccess
> がTrueか確認してください。
常に"True"となっておりました。

> 3. 読み込みが完了しても内部javaScriptが完了していない場合もあります。
> ・実行するまで待機する
> ・エラーが発生した場合、一度待機して再度実行する
> 処理を追加してみて下さい。
これについては私も初めに思い当たりましたので、Wite やリトライ等色々試してみましたが結果は同様でした。

> 追記
> document.getElementsByTagName('script')[10].innerText;
> なのでページ内部のJavaScriptテキストを取得しようとしています?
> それはページの処理で必ず[10]になりますか?
これについても常に[10]となることを確認しています。

以上のような状況です。
どこかにおまじないがあるのでしょうが、動作しないPCが近日中に無くなってしまうので少し焦っています。
引き続きよろしくお願いいたします。





[ 親 103530 / □ Tree ] 返信 編集キー/

▲[ 103534 ] / ▼[ 103536 ]
■103535 / 4階層)  Re[4]: Webview2でのScript読み出し不具合
□投稿者/ くま (47回)-(2025/02/07(Fri) 23:14:39)
2025/02/07(Fri) 23:22:44 編集(投稿者)

No103534 (ふかつ さん) に返信
> Succeeded True Boolean
なのでスクリプトエラーではないようです。
> ResultAsJson """""" String
なので結果が空文字であるようです...

こういう時は上から順番に可能性を潰すのが手順となります。

エラーが発生している環境で

確認1. WebView2の「DevTools」を開いてコンソールで
"document.getElementsByTagName('script')[10]"を実行してみる。
→正常に取得できている事を確認。

確認2. プログラム上のWebView2コントロールにExecuteScriptAsyncにて
"location.href"を実行してみる。
→対象のURLか確認する。

確認3. プログラム上のWebView2コントロールにExecuteScriptAsyncにて
"document.getElementsByTagName('script').length"を実行してみる。
→取得できた数値が「11」以上か確認。

確認4. プログラム上のWebView2コントロールにExecuteScriptAsyncにて
"document.getElementsByTagName('script')[10].src.length"を実行してみる。
→取得できた数値が「0」(外部ファイルではない)か確認。

確認5. プログラム上のWebView2コントロールにExecuteScriptAsyncにて
"document.getElementsByTagName('script')[10].innerHTML.length "を実行してみる。
→取得できた数値が「0」以上(なにかしらのテキストが設定されている)か確認。

確認6. プログラム上のWebView2コントロールにExecuteScriptAsyncにて
"encodeURI(document.getElementsByTagName('script')[10].innerHTML)"を実行してみる。
→取得できた文字列を
https://www.tagindex.com/tool/url.html
https://tech-unlimited.com/urlencode.html
などサイトで確認を行う。

C#での変換は
https://dobon.net/vb/dotnet/internet/urlencode.html
などを参考にしてください。

[ 親 103530 / □ Tree ] 返信 編集キー/

▲[ 103535 ] / ▼[ 103537 ]
■103536 / 5階層)  Re[5]: Webview2でのScript読み出し不具合
□投稿者/ ふかつ (3回)-(2025/02/07(Fri) 23:36:05)
No103535 (くま さん) に返信

くま様

ご対応ありがとうございます。
いただきました内容について、明日は他の用事があり試せませんが明後日以降なるべく早く実施してみます。
またその結果をお知らせいたします。
[ 親 103530 / □ Tree ] 返信 編集キー/

▲[ 103536 ] / ▼[ 103538 ]
■103537 / 6階層)  Re[6]: Webview2でのScript読み出し不具合
□投稿者/ くま (48回)-(2025/02/07(Fri) 23:58:43)
ふかつ さんへ

ここの仕組み上サイト覗かないと書き込みがあるかわからないので
返信が遅れる場合があります。ごめんなさいね。

一応経験上ですが、
サイト上の文字列のコードが壊れていたりすると取得できない場合があります。
またedgeで大丈夫でもWebView2だとうまくいかない事もあります。

多分となりますが、WebView2の場合
・Windows11 pro
・Windows11 home
で動作の違いは無いです。
だだedgeのバージョンが違っていてWebView2ランタイムバージョンが異なる場合があります。

あと
・innerText
・innerHTML
の違いで変に文字列が変換されている場合があります。

[ 親 103530 / □ Tree ] 返信 編集キー/

▲[ 103537 ] / 返信無し
■103538 / 7階層)  Re[7]: Webview2でのScript読み出し不具合
□投稿者/ ふかつ (4回)-(2025/02/11(Tue) 20:11:30)
No103537 (くま さん) に返信

くま様

色々ご教授いただきありがとうございました。
おかげさまで解決することができました。

原因は
正常に動作するPCには"AdGuard(ソースネクスト)"がインストールされていて、
動作しないPCにはインストールされていないという違いがあったことでした。

> document.getElementsByTagName('script')[10].innerText;
> なのでページ内部のJavaScriptテキストを取得しようとしています?
> それはページの処理で必ず[10]になりますか?
というご指摘をいただいた通り、AdGuardがインストールされていない場合は[10]
ではありませんでした。

これについて、Re[3]でどちらの場合も[10]です!と回答いたしましたが、これは
WebBrowserを使用した解析ツールを使い、正常に動作するPCとそうでないPC
の内容を比較しており、その場合は双方とも該当するscriptが[10]番目だったので
違いがないと判断していました。

その後、教えたいただいた
> 確認1. WebView2の「DevTools」を開いてコンソールで
> "document.getElementsByTagName('script')[10]"を実行してみる。
> →正常に取得できている事を確認。

> 確認3. プログラム上のWebView2コントロールにExecuteScriptAsyncにて
> "document.getElementsByTagName('script').length"を実行してみる。
> →取得できた数値が「11」以上か確認。 
等を試した結果、

ページの内容が大幅に異なっていることと、・・・('script').lengthの値が
やはり大きく違うことから、Re[2]を参考に検索した結果、[10]出ないことが判り
解決に至りました。

大分長いこと悩んでいたので非常に助かりました。
また何かありましたらよろしくお願いいたします。
ありがとうございました。
解決済み
[ 親 103530 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -