WebViewコントロールでの操作

WebViewコントロールでWebサイトを操作する方法

WebBrowserコントロールでは直接DOM操作できるメソッド・プロパティ(getElementByIdメソッドやdocumentプロパティ等)がありましたが、 WebViewコントロールにはありません。

WebViewコントロールでは、InvokeScriptAsyncメソッドとJavaScriptのeval関数を使用してWebページを操作します。

また、WebページのJavaScriptからアプリケーションに情報を渡すことができます。
JavaScriptの「window.external.notify」と、アプリケーション側ではScriptNotifyイベントを使用します。

JavaScriptの関数を実行する/DOMを操作する

WebViewでJavaScriptを実行する場合、InvokeScript/InvokeScriptAsyncメソッドとJavaScriptのeval関数を使用します。

						Dim userIdText As String = "abcde"
						Dim functionString As String = String.Format("document.getElementById('userid').innerText = '{0}';", userIdText)
						WebView1.InvokeScript("eval", New String() {functionString})
					
						String userIdText = "abcde";
						String functionString = String.Format("document.getElementById('userid').innerText = '{0}';", userIdText);
						WebView1.InvokeScript("eval", New String[] { functionString });
					

InvokeScript/InvokeScriptAsyncメソッドの第一引数に"eval"、第二引数に実行したいJavaScriptのコードの文字列を渡します。
上記のようにエレメントに値を設定したりできます。

WebView内のサイトからアプリケーションに情報を渡す

JavaScriptでwindow.external.notifyを使用することで、アプリケーションにイベントを通知して情報を渡すことができます。

まず、Webサイト内の情報を受け取れるように、アプリケーション起動時にWebViewコントロールのIsScriptNotifyAllowedプロパティにTrueを設定します。

				'VB.NET
				WebView1.IsScriptNotifyAllowed = True

アプリケーション側でこれらのメッセージを受け取るためにScriptNotifyイベントを定義します。受け取った値はe.Valueで取得します。

				'VB.NET
				Private Sub OnWebViewScriptNotify(sender As Object, e As Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT.WebViewControlScriptNotifyEventArgs) Handles WebView1.ScriptNotify
					MsgBox(e.Value)
				End Sub

WebViewのInvokeScriptメソッドと、JavaScriptのeval関数を使うのは上記「JavaScriptの関数を実行する」と一緒ですが、 実行するJavaScriptコードとしてwindow.external.notifyを使用します。
JavaScript内でwindow.external.notifyを実行すると、引数に指定した値がアプリケーション側にScriptNotifyイベントで渡されます。

				'VB.NET
				WebView1.InvokeScript("eval", New String() {"window.external.notify(String(document.getElementById('userid').value));"})

					Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

						_objWebView.IsScriptNotifyAllowed = True    'これがないと、window.external.notifyでコード実行結果するとScriptNotifyイベントが発生しない。

					End Sub

					Private _getDataString As String    'WebViewからイベントで取得した文字列
					Private _getDataFlag As Boolean     'WebViewからイベントが発生したか

					Private Sub Button1_Click(sender As Object, e As EventArgs)

						_getDataFlag = False

						'JavaScriptを実行
						WebView1.InvokeScript("eval", New String() {"window.external.notify(String(document.getElementById('userid').value));"})

						Application.DoEvents()

						'イベントが発生しているかチェック
						If _getDataFlag = False Then
							Return
						End If

						'取得できた値を格納
						getDataValue = _getDataString
			
					End Sub

					Private Sub OnWebViewScriptNotify(sender As Object, e As Microsoft.Toolkit.Win32.UI.Controls.Interop.WinRT.WebViewControlScriptNotifyEventArgs) Handles WebView1.ScriptNotify
					
						_getDataString = e.Value
						_getDataFlag = True

					End Sub
				

					
				

WebViewのサイト表示待ち方法

WebBrowserコントロールはIsBusy/ReadyStateプロパティで読み込み完了を判定していましたが、 WebViewにはこれらプロパティはありませんので、JavaScriptのdocument.readyStateを使います。
WebViewのNavigateメソッド実行後、InvokeScriptメソッドからWebView内のreadyStateの値を取得して読み込みが完了しているかループでチェックします。

以下のサンプルコードは、上記「JavaScriptの関数を実行する」のサンプルコードで使っている変数や設定を使ってますので、一部流用してください。

					Private Sub Button1_Click(sender As Object, e As EventArgs)

						Dim openFlag As Boolean = False '読み込み完了フラグ

						'サイトを表示する
						_objWebView.Navigate(url)
			
						'読み込み待ち
						Dim timeout As Date = Now.AddMinutes(30)
						While Now < timeout
							System.Windows.Forms.Application.DoEvents()
							System.Threading.Thread.Sleep(100)
			
							'JavaScriptを実行
							WebView1.InvokeScript("eval", New String() {"window.external.notify(String(document.readyState == 'complete'));"})
	
							Application.DoEvents()
	
							'イベントが発生しているかチェック
							If _getDataFlag = False Then
								Msgbox("err")
								Return
							End If
	
							’読み込み完了してれば終了		
							If _getDataString = "true" Then
								openFlag = True
								Exit While
							End If
						End While
			
						If openFlag = True Then
							MsbBox("ok")
						Else
							MsbBox("timeout")
						End If

						Return
			
					End Sub
				

					
				

参考

WebView control for Windows Forms and WPF